From 31d2847a1e4a61722ff86e9647ed23020a541d48 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Tue, 11 Feb 2025 19:49:28 +0000 Subject: [PATCH 1/7] Remove AgentTracer.capture --- .../trace/instrumentation/playws1/AsyncHandlerWrapper.java | 4 ++-- .../instrumentation/playws21/AsyncHandlerWrapper.java | 4 ++-- .../trace/instrumentation/playws2/AsyncHandlerWrapper.java | 4 ++-- .../groovy/ContextPreservingInstrumentationTest.groovy | 2 +- .../trace/instrumentation/zio/v2_0/FiberContext.java | 7 +++++-- .../trace/bootstrap/instrumentation/api/AgentTracer.java | 5 ----- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/AsyncHandlerWrapper.java b/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/AsyncHandlerWrapper.java index 12f8c4f13da..f2069730d4a 100644 --- a/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/AsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/play-ws-1/src/main/java/datadog/trace/instrumentation/playws1/AsyncHandlerWrapper.java @@ -1,6 +1,6 @@ package datadog.trace.instrumentation.playws1; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; @@ -22,7 +22,7 @@ public class AsyncHandlerWrapper implements AsyncHandler { public AsyncHandlerWrapper(final AsyncHandler delegate, final AgentSpan span) { this.delegate = delegate; this.span = span; - continuation = capture(); + continuation = captureSpan(span); } @Override diff --git a/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/AsyncHandlerWrapper.java b/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/AsyncHandlerWrapper.java index 30983b389f9..a2cc9ca949c 100644 --- a/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/AsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/play-ws-2.1/src/main/java/datadog/trace/instrumentation/playws21/AsyncHandlerWrapper.java @@ -1,6 +1,6 @@ package datadog.trace.instrumentation.playws21; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; @@ -27,7 +27,7 @@ public class AsyncHandlerWrapper implements AsyncHandler { public AsyncHandlerWrapper(final AsyncHandler delegate, final AgentSpan span) { this.delegate = delegate; this.span = span; - continuation = capture(); + continuation = captureSpan(span); } @Override diff --git a/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/AsyncHandlerWrapper.java b/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/AsyncHandlerWrapper.java index 24ccad31361..1aef9e3b264 100644 --- a/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/AsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/play-ws-2/src/main/java/datadog/trace/instrumentation/playws2/AsyncHandlerWrapper.java @@ -1,6 +1,6 @@ package datadog.trace.instrumentation.playws2; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; @@ -26,7 +26,7 @@ public class AsyncHandlerWrapper implements AsyncHandler { public AsyncHandlerWrapper(final AsyncHandler delegate, final AgentSpan span) { this.delegate = delegate; this.span = span; - continuation = capture(); + continuation = captureSpan(span); } @Override diff --git a/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy b/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy index 0c0f31c65af..2bc1fce4983 100644 --- a/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy @@ -113,7 +113,7 @@ class ContextPreservingInstrumentationTest extends AgentTestRunner { */ private class ParentContext { final ContextMap contextMap = AsyncContext.context().copy() - final AgentScope.Continuation spanContinuation = AgentTracer.capture() + final AgentScope.Continuation spanContinuation = AgentTracer.captureSpan(AgentTracer.activeSpan()) def releaseParentSpan() { spanContinuation.cancel() diff --git a/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java b/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java index f467ac7974d..c22f3610b81 100644 --- a/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java +++ b/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java @@ -1,8 +1,10 @@ package datadog.trace.instrumentation.zio.v2_0; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.ScopeState; @@ -16,7 +18,8 @@ private FiberContext(ScopeState state) { this.state = state; this.scope = null; this.oldState = null; - this.continuation = capture(); + AgentSpan span = activeSpan(); + this.continuation = null != span ? captureSpan(span) : null; } public static FiberContext create() { diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java index 5c5f6355c5d..38a364be229 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java @@ -130,11 +130,6 @@ public static AgentScope activeScope() { return get().activeScope(); } - public static AgentScope.Continuation capture() { - final AgentScope activeScope = activeScope(); - return activeScope == null ? null : activeScope.capture(); - } - /** * Checks whether asynchronous propagation is enabled, meaning this context will propagate across * asynchronous boundaries. From 7610abe70fad0817715ebec89bc2f87395b3a15c Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Wed, 12 Feb 2025 11:49:44 +0000 Subject: [PATCH 2/7] Replace TraceScope.capture() with Tracer.captureActiveSpan() --- ...ontextPreservingInstrumentationTest.groovy | 2 +- .../zio/v2_0/FiberContext.java | 7 ++-- .../java/datadog/trace/api/GlobalTracer.java | 17 ++++++---- .../main/java/datadog/trace/api/Tracer.java | 34 +++++++++++++------ .../datadog/trace/context/TraceScope.java | 23 ++++++++----- .../java/datadog/trace/core/CoreTracer.java | 10 ++++++ .../java/datadog/opentracing/DDTracer.java | 21 +++++++----- .../instrumentation/api/AgentTracer.java | 12 +++++++ 8 files changed, 86 insertions(+), 40 deletions(-) diff --git a/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy b/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy index 2bc1fce4983..a7ee492dc2a 100644 --- a/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/servicetalk/src/test/groovy/ContextPreservingInstrumentationTest.groovy @@ -113,7 +113,7 @@ class ContextPreservingInstrumentationTest extends AgentTestRunner { */ private class ParentContext { final ContextMap contextMap = AsyncContext.context().copy() - final AgentScope.Continuation spanContinuation = AgentTracer.captureSpan(AgentTracer.activeSpan()) + final AgentScope.Continuation spanContinuation = AgentTracer.captureActiveSpan() def releaseParentSpan() { spanContinuation.cancel() diff --git a/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java b/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java index c22f3610b81..07a6302b218 100644 --- a/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java +++ b/dd-java-agent/instrumentation/zio/zio-2.0/src/main/java/datadog/trace/instrumentation/zio/v2_0/FiberContext.java @@ -1,10 +1,8 @@ package datadog.trace.instrumentation.zio.v2_0; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureActiveSpan; import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.ScopeState; @@ -18,8 +16,7 @@ private FiberContext(ScopeState state) { this.state = state; this.scope = null; this.oldState = null; - AgentSpan span = activeSpan(); - this.continuation = null != span ? captureSpan(span) : null; + this.continuation = captureActiveSpan(); } public static FiberContext create() { diff --git a/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java b/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java index e308983818b..7fae3855476 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/GlobalTracer.java @@ -26,22 +26,27 @@ public String getSpanId() { } @Override - public boolean isAsyncPropagationEnabled() { + public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) { return false; } @Override - public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} + public TraceScope muteTracing() { + return NoopTraceScope.INSTANCE; + } @Override - public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) { - return false; + public TraceScope.Continuation captureActiveSpan() { + return NoopTraceScope.NoopContinuation.INSTANCE; } @Override - public TraceScope muteTracing() { - return NoopTraceScope.INSTANCE; + public boolean isAsyncPropagationEnabled() { + return false; } + + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} }; private static final Collection installationCallbacks = new ArrayList<>(); diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java index f96a65b0caa..cbfd9cb84d4 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java @@ -14,6 +14,29 @@ public interface Tracer { */ String getSpanId(); + /** + * Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones are + * ignored. + * + * @param traceInterceptor + * @return false if an interceptor with same priority exists. + */ + boolean addTraceInterceptor(TraceInterceptor traceInterceptor); + + TraceScope muteTracing(); + + /** + * Prevent the currently active trace from reporting until the returned Continuation is either + * activated (and the returned scope is closed), or canceled. + * + *

Should be called on the parent thread. + * + * @deprecated Unstable API. Might be removed at any time. + * @return Continuation of the active span, no-op continuation if there's no active span. + */ + @Deprecated + TraceScope.Continuation captureActiveSpan(); + /** * Checks whether asynchronous propagation is enabled, meaning this context will propagate across * asynchronous boundaries. @@ -36,15 +59,4 @@ public interface Tracer { */ @Deprecated void setAsyncPropagationEnabled(boolean asyncPropagationEnabled); - - /** - * Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones are - * ignored. - * - * @param traceInterceptor - * @return false if an interceptor with same priority exists. - */ - boolean addTraceInterceptor(TraceInterceptor traceInterceptor); - - TraceScope muteTracing(); } diff --git a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index 3f912927568..a8e19266d1b 100644 --- a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java +++ b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java @@ -6,13 +6,22 @@ /** An object which can propagate a datadog trace across multiple threads. */ public interface TraceScope extends Closeable { + + /** Close the activated context and allow any underlying spans to finish. */ + @Override + void close(); + /** - * Prevent the trace attached to this TraceScope from reporting until the returned Continuation is - * either activated (and the returned scope is closed), or canceled. - * - *

Should be called on the parent thread. + * @deprecated Replaced by {@link Tracer#captureActiveSpan()}. + *

Prevent the currently active trace from reporting until the returned Continuation is + * either activated (and the returned scope is closed), or canceled. Should be called on the + * parent thread. + * @return Continuation of the active span, no-op continuation if there's no active span. */ - Continuation capture(); + @Deprecated + default Continuation capture() { + return GlobalTracer.get().captureActiveSpan(); + } /** @deprecated Replaced by {@code capture().hold()}. */ @Deprecated @@ -20,10 +29,6 @@ default Continuation captureConcurrent() { return capture().hold(); } - /** Close the activated context and allow any underlying spans to finish. */ - @Override - void close(); - /** * @deprecated Replaced by {@link Tracer#isAsyncPropagationEnabled()}. *

Calling this method will check whether asynchronous propagation is active for diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 09d578d06d0..608de13e462 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -929,6 +929,16 @@ public AgentScope activateSpan(AgentSpan span, ScopeSource source, boolean isAsy return scopeManager.activate(span, source, isAsyncPropagating); } + @Override + public AgentScope.Continuation captureActiveSpan() { + AgentSpan span = scopeManager.activeSpan(); + if (null != span) { + return scopeManager.captureSpan(span); + } else { + return AgentTracer.noopContinuation(); + } + } + @Override public AgentScope.Continuation captureSpan(final AgentSpan span) { return scopeManager.captureSpan(span); diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java index 0c3df7900d0..07c86816ca8 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java @@ -430,23 +430,28 @@ public String getSpanId() { } @Override - public boolean isAsyncPropagationEnabled() { - return tracer.isAsyncPropagationEnabled(); + public boolean addTraceInterceptor(final TraceInterceptor traceInterceptor) { + return tracer.addTraceInterceptor(traceInterceptor); } @Override - public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { - tracer.setAsyncPropagationEnabled(asyncPropagationEnabled); + public TraceScope muteTracing() { + return tracer.muteTracing(); } @Override - public boolean addTraceInterceptor(final TraceInterceptor traceInterceptor) { - return tracer.addTraceInterceptor(traceInterceptor); + public TraceScope.Continuation captureActiveSpan() { + return tracer.captureActiveSpan(); } @Override - public TraceScope muteTracing() { - return tracer.muteTracing(); + public boolean isAsyncPropagationEnabled() { + return tracer.isAsyncPropagationEnabled(); + } + + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { + tracer.setAsyncPropagationEnabled(asyncPropagationEnabled); } @Override diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java index 38a364be229..d6ef6e5a5dc 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java @@ -93,6 +93,10 @@ public static AgentScope activateSpan(final AgentSpan span, final boolean isAsyn return get().activateSpan(span, ScopeSource.INSTRUMENTATION, isAsyncPropagating); } + public static AgentScope.Continuation captureActiveSpan() { + return get().captureActiveSpan(); + } + public static AgentScope.Continuation captureSpan(final AgentSpan span) { return get().captureSpan(span); } @@ -285,6 +289,9 @@ AgentSpan startSpan( AgentScope activateSpan(AgentSpan span, ScopeSource source, boolean isAsyncPropagating); + @Override + AgentScope.Continuation captureActiveSpan(); + AgentScope.Continuation captureSpan(AgentSpan span); void closePrevious(boolean finishSpan); @@ -424,6 +431,11 @@ public AgentScope activateSpan( return NoopScope.INSTANCE; } + @Override + public AgentScope.Continuation captureActiveSpan() { + return NoopContinuation.INSTANCE; + } + @Override public AgentScope.Continuation captureSpan(final AgentSpan span) { return NoopContinuation.INSTANCE; From 365eb0fbc94673e6aa56677b8dc1067563cda04c Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Wed, 12 Feb 2025 12:05:10 +0000 Subject: [PATCH 3/7] Remove unnecessary delegation --- .../trace/instrumentation/opentelemetry/OtelScope.java | 5 ----- .../trace/instrumentation/opentracing31/OTScopeManager.java | 5 ----- .../trace/instrumentation/opentracing32/OTScopeManager.java | 5 ----- .../src/main/java/datadog/trace/context/NoopTraceScope.java | 5 ----- .../src/main/java/datadog/opentracing/OTScopeManager.java | 5 ----- 5 files changed, 25 deletions(-) diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelScope.java b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelScope.java index 6a387df6f67..ed1ca770fb9 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelScope.java +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/main/java/datadog/trace/instrumentation/opentelemetry/OtelScope.java @@ -11,11 +11,6 @@ public class OtelScope implements Scope, TraceScope { this.delegate = delegate; } - @Override - public Continuation capture() { - return delegate.capture(); - } - @Override public void close() { delegate.close(); diff --git a/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTScopeManager.java b/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTScopeManager.java index d9f6179b5d3..6004bb28b9e 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTScopeManager.java +++ b/dd-java-agent/instrumentation/opentracing/api-0.31/src/main/java/datadog/trace/instrumentation/opentracing31/OTScopeManager.java @@ -63,11 +63,6 @@ public Span span() { return converter.toSpan(delegate.span()); } - @Override - public Continuation capture() { - return delegate.capture(); - } - public boolean isFinishSpanOnClose() { return finishSpanOnClose; } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTScopeManager.java b/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTScopeManager.java index aa4c0f1b131..b32581b711e 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTScopeManager.java +++ b/dd-java-agent/instrumentation/opentracing/api-0.32/src/main/java/datadog/trace/instrumentation/opentracing32/OTScopeManager.java @@ -73,11 +73,6 @@ public Span span() { return converter.toSpan(delegate.span()); } - @Override - public Continuation capture() { - return delegate.capture(); - } - public boolean isFinishSpanOnClose() { return finishSpanOnClose; } diff --git a/dd-trace-api/src/main/java/datadog/trace/context/NoopTraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/NoopTraceScope.java index 34d5cffbe19..851290e32a3 100644 --- a/dd-trace-api/src/main/java/datadog/trace/context/NoopTraceScope.java +++ b/dd-trace-api/src/main/java/datadog/trace/context/NoopTraceScope.java @@ -24,11 +24,6 @@ public void cancel() {} private NoopTraceScope() {} - @Override - public Continuation capture() { - return NoopContinuation.INSTANCE; - } - @Override public void close() {} } diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/OTScopeManager.java b/dd-trace-ot/src/main/java/datadog/opentracing/OTScopeManager.java index 8338ec947e4..fa0890a7696 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/OTScopeManager.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/OTScopeManager.java @@ -91,11 +91,6 @@ public int hashCode() { return delegate.hashCode(); } - @Override - public Continuation capture() { - return delegate.capture(); - } - boolean isFinishSpanOnClose() { return finishSpanOnClose; } From 035db7ff6d9316963a657bb9bff619b0d3ed5c87 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Wed, 12 Feb 2025 12:17:50 +0000 Subject: [PATCH 4/7] javadoc --- .../src/main/java/datadog/trace/context/TraceScope.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index a8e19266d1b..d58f210a86d 100644 --- a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java +++ b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java @@ -13,9 +13,9 @@ public interface TraceScope extends Closeable { /** * @deprecated Replaced by {@link Tracer#captureActiveSpan()}. - *

Prevent the currently active trace from reporting until the returned Continuation is - * either activated (and the returned scope is closed), or canceled. Should be called on the - * parent thread. + *

Prevent the currently active trace, which may differ from this scope + * instance, from reporting until the returned Continuation is either activated (and the + * returned scope is closed), or canceled. Should be called on the parent thread. * @return Continuation of the active span, no-op continuation if there's no active span. */ @Deprecated From b03363cd9d349ba01b688657246b2db2bf8fac68 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Wed, 12 Feb 2025 12:56:26 +0000 Subject: [PATCH 5/7] cleanup --- .../datadog/trace/context/TraceScope.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index d58f210a86d..a3180ab25b8 100644 --- a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java +++ b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java @@ -11,6 +11,36 @@ public interface TraceScope extends Closeable { @Override void close(); + /** + * Used to pass async context between workers. A trace will not be reported until all spans and + * continuations are resolved. You must call activate (and close on the returned scope) or cancel + * on each continuation to avoid discarding traces. + */ + interface Continuation { + + /** + * Prevent the trace attached to this scope from reporting until the continuation is explicitly + * cancelled. You must call {@link #cancel()} at some point to avoid discarding traces. + * + *

Use this when you want to let multiple threads activate the continuation concurrently and + * close their scopes without fear of prematurely closing the related span. + */ + Continuation hold(); + + /** + * Activate the continuation. + * + *

Should be called on the child thread. + * + *

Consider calling this in a try-with-resources initialization block to ensure the returned + * scope is closed properly. + */ + TraceScope activate(); + + /** Allow trace to stop waiting on this continuation for reporting. */ + void cancel(); + } + /** * @deprecated Replaced by {@link Tracer#captureActiveSpan()}. *

Prevent the currently active trace, which may differ from this scope @@ -51,34 +81,4 @@ default boolean isAsyncPropagating() { default void setAsyncPropagation(boolean value) { GlobalTracer.get().setAsyncPropagationEnabled(value); } - - /** - * Used to pass async context between workers. A trace will not be reported until all spans and - * continuations are resolved. You must call activate (and close on the returned scope) or cancel - * on each continuation to avoid discarding traces. - */ - interface Continuation { - - /** - * Prevent the trace attached to this scope from reporting until the continuation is explicitly - * cancelled. You must call {@link #cancel()} at some point to avoid discarding traces. - * - *

Use this when you want to let multiple threads activate the continuation concurrently and - * close their scopes without fear of prematurely closing the related span. - */ - Continuation hold(); - - /** - * Activate the continuation. - * - *

Should be called on the child thread. - * - *

Consider calling this in a try-with-resources initialization block to ensure the returned - * scope is closed properly. - */ - TraceScope activate(); - - /** Allow trace to stop waiting on this continuation for reporting. */ - void cancel(); - } } From a7ada6530785450717667ad20eade17416bcc14c Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Wed, 12 Feb 2025 13:06:34 +0000 Subject: [PATCH 6/7] Respect async propagation flag --- .../src/main/java/datadog/trace/api/Tracer.java | 8 +++++--- .../main/java/datadog/trace/context/TraceScope.java | 12 +++++++----- .../src/main/java/datadog/trace/core/CoreTracer.java | 6 +++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java index cbfd9cb84d4..84709a4b508 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java @@ -26,13 +26,15 @@ public interface Tracer { TraceScope muteTracing(); /** - * Prevent the currently active trace from reporting until the returned Continuation is either - * activated (and the returned scope is closed), or canceled. + * When asynchronous propagation is enabled, prevent the currently active trace from reporting + * until the returned Continuation is either activated (and the returned scope is closed) or the + * continuation is canceled. * *

Should be called on the parent thread. * * @deprecated Unstable API. Might be removed at any time. - * @return Continuation of the active span, no-op continuation if there's no active span. + * @return Continuation of the active span, no-op continuation if there's no active span or + * asynchronous propagation is disabled. */ @Deprecated TraceScope.Continuation captureActiveSpan(); diff --git a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index a3180ab25b8..48268d8fcb8 100644 --- a/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java +++ b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java @@ -43,10 +43,12 @@ interface Continuation { /** * @deprecated Replaced by {@link Tracer#captureActiveSpan()}. - *

Prevent the currently active trace, which may differ from this scope - * instance, from reporting until the returned Continuation is either activated (and the - * returned scope is closed), or canceled. Should be called on the parent thread. - * @return Continuation of the active span, no-op continuation if there's no active span. + *

When asynchronous propagation is enabled, prevent the currently active + * trace, which may differ from this scope instance, from reporting until the + * returned Continuation is either activated (and the returned scope is closed) or the + * continuation is canceled. Should be called on the parent thread. + * @return Continuation of the active span, no-op continuation if there's no active span or + * asynchronous propagation is disabled. */ @Deprecated default Continuation capture() { @@ -61,7 +63,7 @@ default Continuation captureConcurrent() { /** * @deprecated Replaced by {@link Tracer#isAsyncPropagationEnabled()}. - *

Calling this method will check whether asynchronous propagation is active for + *

Calling this method will check whether asynchronous propagation is enabled for * the active scope, not this scope instance. * @return {@code true} if asynchronous propagation is enabled for the active * scope, {@code false} otherwise. diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 608de13e462..998d6489a3e 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -931,9 +931,9 @@ public AgentScope activateSpan(AgentSpan span, ScopeSource source, boolean isAsy @Override public AgentScope.Continuation captureActiveSpan() { - AgentSpan span = scopeManager.activeSpan(); - if (null != span) { - return scopeManager.captureSpan(span); + AgentScope activeScope = this.scopeManager.active(); + if (null != activeScope && activeScope.isAsyncPropagating()) { + return scopeManager.captureSpan(activeScope.span()); } else { return AgentTracer.noopContinuation(); } From 815385dba8c543c7b7882542550db2cf58ac0b71 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Wed, 12 Feb 2025 13:13:27 +0000 Subject: [PATCH 7/7] delegate --- .../src/main/java/datadog/trace/core/CoreTracer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 998d6489a3e..4b3d2e50b4a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -932,8 +932,8 @@ public AgentScope activateSpan(AgentSpan span, ScopeSource source, boolean isAsy @Override public AgentScope.Continuation captureActiveSpan() { AgentScope activeScope = this.scopeManager.active(); - if (null != activeScope && activeScope.isAsyncPropagating()) { - return scopeManager.captureSpan(activeScope.span()); + if (null != activeScope) { + return activeScope.capture(); } else { return AgentTracer.noopContinuation(); }