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-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..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.capture() + 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 f467ac7974d..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,6 +1,6 @@ package datadog.trace.instrumentation.zio.v2_0; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureActiveSpan; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; @@ -16,7 +16,7 @@ private FiberContext(ScopeState state) { this.state = state; this.scope = null; this.oldState = null; - this.continuation = capture(); + 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..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 @@ -14,6 +14,31 @@ 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(); + + /** + * 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 or + * asynchronous propagation is disabled. + */ + @Deprecated + TraceScope.Continuation captureActiveSpan(); + /** * Checks whether asynchronous propagation is enabled, meaning this context will propagate across * asynchronous boundaries. @@ -36,15 +61,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/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-api/src/main/java/datadog/trace/context/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index 3f912927568..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 @@ -6,47 +6,11 @@ /** An object which can propagate a datadog trace across multiple threads. */ public interface TraceScope extends Closeable { - /** - * 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. - */ - Continuation capture(); - - /** @deprecated Replaced by {@code capture().hold()}. */ - @Deprecated - 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 - * the active scope, not this scope instance. - * @return {@code true} if asynchronous propagation is enabled for the active - * scope, {@code false} otherwise. - */ - @Deprecated - default boolean isAsyncPropagating() { - return GlobalTracer.get().isAsyncPropagationEnabled(); - } - - /** - * @deprecated Replaced by {@link Tracer#setAsyncPropagationEnabled(boolean)}}. - *

Calling this method will enable or disable asynchronous propagation for the - * active scope, not this scope instance. - * @param value {@code true} to enable asynchronous propagation, {@code false} to disable it. - */ - @Deprecated - 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 @@ -76,4 +40,47 @@ interface Continuation { /** Allow trace to stop waiting on this continuation for reporting. */ void cancel(); } + + /** + * @deprecated Replaced by {@link Tracer#captureActiveSpan()}. + *

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() { + return GlobalTracer.get().captureActiveSpan(); + } + + /** @deprecated Replaced by {@code capture().hold()}. */ + @Deprecated + default Continuation captureConcurrent() { + return capture().hold(); + } + + /** + * @deprecated Replaced by {@link Tracer#isAsyncPropagationEnabled()}. + *

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. + */ + @Deprecated + default boolean isAsyncPropagating() { + return GlobalTracer.get().isAsyncPropagationEnabled(); + } + + /** + * @deprecated Replaced by {@link Tracer#setAsyncPropagationEnabled(boolean)}}. + *

Calling this method will enable or disable asynchronous propagation for the + * active scope, not this scope instance. + * @param value {@code true} to enable asynchronous propagation, {@code false} to disable it. + */ + @Deprecated + default void setAsyncPropagation(boolean value) { + GlobalTracer.get().setAsyncPropagationEnabled(value); + } } 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..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 @@ -929,6 +929,16 @@ public AgentScope activateSpan(AgentSpan span, ScopeSource source, boolean isAsy return scopeManager.activate(span, source, isAsyncPropagating); } + @Override + public AgentScope.Continuation captureActiveSpan() { + AgentScope activeScope = this.scopeManager.active(); + if (null != activeScope) { + return activeScope.capture(); + } 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/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; } 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..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); } @@ -130,11 +134,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. @@ -290,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); @@ -429,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;