diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/AdviceUtils.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/AdviceUtils.java index fcc9d7deeda..c0983367fb9 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/AdviceUtils.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/java/concurrent/AdviceUtils.java @@ -1,6 +1,7 @@ package datadog.trace.bootstrap.instrumentation.java.concurrent; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -26,7 +27,7 @@ public static AgentScope startTaskScope(State state) { final AgentScope.Continuation continuation = state.getAndResetContinuation(); if (continuation != null) { final AgentScope scope = continuation.activate(); - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); // important - stop timing after the scope has been activated so the time in the queue can // be attributed to the correct context without duplicating the propagated information state.stopTiming(); diff --git a/dd-java-agent/instrumentation/akka-concurrent/src/test/groovy/AkkaExecutorInstrumentationTest.groovy b/dd-java-agent/instrumentation/akka-concurrent/src/test/groovy/AkkaExecutorInstrumentationTest.groovy index c7dee3dbf0e..13bfaa7b9fe 100644 --- a/dd-java-agent/instrumentation/akka-concurrent/src/test/groovy/AkkaExecutorInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/akka-concurrent/src/test/groovy/AkkaExecutorInstrumentationTest.groovy @@ -16,7 +16,8 @@ import java.util.concurrent.RejectedExecutionException import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled + /** * Test executor instrumentation for Akka specific classes. * This is to large extent a copy of ExecutorInstrumentationTest. @@ -45,7 +46,7 @@ class AkkaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new AkkaAsyncChild()) // this child won't @@ -101,7 +102,7 @@ class AkkaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span dispatcher.execute(new AkkaAsyncChild()) // this child won't @@ -132,7 +133,7 @@ class AkkaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) try { for (int i = 0; i < 20; ++i) { // Our current instrumentation instrumentation does not behave very well diff --git a/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/TraceContinuedFutureCallback.java b/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/TraceContinuedFutureCallback.java index 7424827e72e..09f10620472 100644 --- a/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/TraceContinuedFutureCallback.java +++ b/dd-java-agent/instrumentation/apache-httpasyncclient-4/src/main/java/datadog/trace/instrumentation/apachehttpasyncclient/TraceContinuedFutureCallback.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.apachehttpasyncclient; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.apachehttpasyncclient.ApacheHttpAsyncClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -39,7 +40,7 @@ public void completed(final T result) { completeDelegate(result); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); completeDelegate(result); } } @@ -56,7 +57,7 @@ public void failed(final Exception ex) { failDelegate(ex); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); failDelegate(ex); } } @@ -72,7 +73,7 @@ public void cancelled() { cancelDelegate(); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); cancelDelegate(); } } diff --git a/dd-java-agent/instrumentation/apache-httpclient-5/src/main/java/datadog/trace/instrumentation/apachehttpclient5/TraceContinuedFutureCallback.java b/dd-java-agent/instrumentation/apache-httpclient-5/src/main/java/datadog/trace/instrumentation/apachehttpclient5/TraceContinuedFutureCallback.java index e52509d415e..b3ee937f46b 100644 --- a/dd-java-agent/instrumentation/apache-httpclient-5/src/main/java/datadog/trace/instrumentation/apachehttpclient5/TraceContinuedFutureCallback.java +++ b/dd-java-agent/instrumentation/apache-httpclient-5/src/main/java/datadog/trace/instrumentation/apachehttpclient5/TraceContinuedFutureCallback.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.apachehttpclient5; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.apachehttpclient5.ApacheHttpClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -42,7 +43,7 @@ public void completed(final T result) { completeDelegate(result); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); completeDelegate(result); } } @@ -59,7 +60,7 @@ public void failed(final Exception ex) { failDelegate(ex); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); failDelegate(ex); } } @@ -75,7 +76,7 @@ public void cancelled() { cancelDelegate(); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); cancelDelegate(); } } diff --git a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixThreadPoolInstrumentation.java b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixThreadPoolInstrumentation.java index ecf6a81198f..8dc653cba8a 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixThreadPoolInstrumentation.java +++ b/dd-java-agent/instrumentation/hystrix-1.4/src/main/java/datadog/trace/instrumentation/hystrix/HystrixThreadPoolInstrumentation.java @@ -1,14 +1,14 @@ package datadog.trace.instrumentation.hystrix; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import net.bytebuddy.asm.Advice; @AutoService(InstrumenterModule.class) @@ -35,12 +35,9 @@ public static class EnableAsyncAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static boolean enableAsyncTracking() { - final AgentScope scope = activeScope(); - if (scope != null) { - if (!scope.isAsyncPropagating()) { - scope.setAsyncPropagation(true); - return true; - } + if (!isAsyncPropagationEnabled()) { + setAsyncPropagationEnabled(true); + return true; } return false; } @@ -48,10 +45,7 @@ public static boolean enableAsyncTracking() { @Advice.OnMethodExit(suppress = Throwable.class) public static void disableAsyncTracking(@Advice.Enter final boolean wasEnabled) { if (wasEnabled) { - final AgentScope scope = activeScope(); - if (scope != null) { - scope.setAsyncPropagation(false); - } + setAsyncPropagationEnabled(false); } } } diff --git a/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/groovy/CompletableFutureTest.groovy b/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/groovy/CompletableFutureTest.groovy index 5e7092c8c14..8a9fef5ba9b 100644 --- a/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/groovy/CompletableFutureTest.groovy +++ b/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/groovy/CompletableFutureTest.groovy @@ -11,7 +11,7 @@ import java.util.function.Supplier import static datadog.trace.agent.test.utils.TraceUtils.basicSpan import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled /** * Note: ideally this should live with the rest of ExecutorInstrumentationTest, @@ -45,7 +45,7 @@ class CompletableFutureTest extends AgentTestRunner { @Trace(operationName = "parent") CompletableFuture get() { try { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) return CompletableFuture.supplyAsync(supplier, pool) .thenCompose({ s -> CompletableFuture.supplyAsync(new AppendingSupplier(s), differentPool) }) .thenApply(function) diff --git a/dd-java-agent/instrumentation/java-concurrent/java-concurrent-21/src/test/groovy/VirtualThreadTest.groovy b/dd-java-agent/instrumentation/java-concurrent/java-concurrent-21/src/test/groovy/VirtualThreadTest.groovy index a19b5c92623..5af16c14857 100644 --- a/dd-java-agent/instrumentation/java-concurrent/java-concurrent-21/src/test/groovy/VirtualThreadTest.groovy +++ b/dd-java-agent/instrumentation/java-concurrent/java-concurrent-21/src/test/groovy/VirtualThreadTest.groovy @@ -8,7 +8,7 @@ import java.util.concurrent.ExecutorCompletionService import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class VirtualThreadTest extends AgentTestRunner { @Shared @@ -37,7 +37,7 @@ class VirtualThreadTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new JavaAsyncChild()) // this child won't diff --git a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java index 51d732d40a9..16564f1123b 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java +++ b/dd-java-agent/instrumentation/java-concurrent/src/main/java/datadog/trace/instrumentation/java/concurrent/AsyncPropagatingDisableInstrumentation.java @@ -5,7 +5,8 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.nameStartsWith; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagationEnabled; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.java.concurrent.ConcurrentInstrumentationNames.EXECUTOR_INSTRUMENTATION_NAME; import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; import static net.bytebuddy.matcher.ElementMatchers.isTypeInitializer; @@ -13,7 +14,6 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -177,19 +177,18 @@ public void methodAdvice(MethodTransformer transformer) { public static class DisableAsyncAdvice { @Advice.OnMethodEnter - public static AgentScope before() { - AgentScope scope = activeScope(); - if (null != scope && scope.isAsyncPropagating()) { - scope.setAsyncPropagation(false); - return scope; + public static boolean before() { + if (isAsyncPropagationEnabled()) { + setAsyncPropagationEnabled(false); + return true; } - return null; + return false; } @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void after(@Advice.Enter AgentScope scope) { - if (null != scope) { - scope.setAsyncPropagation(true); + public static void after(@Advice.Enter boolean wasDisabled) { + if (wasDisabled) { + setAsyncPropagationEnabled(true); } } } diff --git a/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/ExecutorInstrumentationTest.groovy b/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/ExecutorInstrumentationTest.groovy index 7e7db7eb5c3..097576b0a89 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/ExecutorInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/ExecutorInstrumentationTest.groovy @@ -26,7 +26,7 @@ import java.util.concurrent.ScheduledThreadPoolExecutor import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled import static org.junit.Assume.assumeTrue abstract class ExecutorInstrumentationTest extends AgentTestRunner { @@ -82,7 +82,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new JavaAsyncChild()) // this child won't @@ -256,7 +256,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def future = m(pool, task) sleep(500) future.cancel(true) @@ -317,7 +317,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span pool.execute(new JavaAsyncChild()) // this child won't @@ -368,7 +368,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) m(pool, w(child)) } }.run() @@ -406,7 +406,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) try { for (int i = 0; i < 20; ++i) { final JavaAsyncChild child = new JavaAsyncChild(false, true) diff --git a/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy b/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy index 4a3ae7b553d..c19ee144802 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/NettyExecutorInstrumentationTest.groovy @@ -17,7 +17,7 @@ import java.util.concurrent.Future import java.util.concurrent.RejectedExecutionException import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled import static org.junit.Assume.assumeTrue class NettyExecutorInstrumentationTest extends AgentTestRunner { @@ -65,7 +65,7 @@ class NettyExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new JavaAsyncChild()) // this child won't @@ -213,7 +213,7 @@ class NettyExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) try { for (int i = 0; i < 20; ++i) { final JavaAsyncChild child = new JavaAsyncChild(false, true) diff --git a/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/RejectedExecutionTest.groovy b/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/RejectedExecutionTest.groovy index 63ec8439df9..dbe34a6eace 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/RejectedExecutionTest.groovy +++ b/dd-java-agent/instrumentation/java-concurrent/src/test/groovy/executor/RejectedExecutionTest.groovy @@ -21,7 +21,7 @@ import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class RejectedExecutionTest extends AgentTestRunner { @@ -193,7 +193,7 @@ class RejectedExecutionTest extends AgentTestRunner { when: runUnderTrace("parent") { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // must be rejected because the queue will be full until some // time after the first task is released executor.submit((Runnable) new JavaAsyncChild(true, false)) @@ -237,7 +237,7 @@ class RejectedExecutionTest extends AgentTestRunner { return { runUnderTrace("parent") { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) pool.submit({}) } } @@ -261,7 +261,7 @@ class RejectedExecutionTest extends AgentTestRunner { return { runUnderTrace("parent") { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // must be rejected because the queue will be full until some // time after the first task is released def testTask = new JavaAsyncChild(true, false) diff --git a/dd-java-agent/instrumentation/jetty-util/src/test/groovy/JettyExecutorInstrumentationTest.groovy b/dd-java-agent/instrumentation/jetty-util/src/test/groovy/JettyExecutorInstrumentationTest.groovy index ab4f543a4c7..0739cc949cc 100644 --- a/dd-java-agent/instrumentation/jetty-util/src/test/groovy/JettyExecutorInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jetty-util/src/test/groovy/JettyExecutorInstrumentationTest.groovy @@ -10,7 +10,7 @@ import java.util.concurrent.Callable import java.util.concurrent.ExecutorService import java.util.concurrent.Executors -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled import static org.junit.Assume.assumeTrue class JettyExecutorInstrumentationTest extends AgentTestRunner { @@ -46,7 +46,7 @@ class JettyExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new JavaAsyncChild()) // this child won't diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt index d18cc07a1ed..93acc40ee26 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt @@ -2,9 +2,9 @@ package datadog.trace.instrumentation.kotlin.coroutines import datadog.trace.api.Trace import datadog.trace.bootstrap.instrumentation.api.AgentSpan -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope import datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan import datadog.trace.bootstrap.instrumentation.api.AgentTracer.get +import datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled import datadog.trace.bootstrap.instrumentation.api.ScopeSource.INSTRUMENTATION import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import kotlinx.coroutines.CompletableDeferred @@ -333,7 +333,7 @@ abstract class CoreKotlinCoroutineTests(private val dispatcher: CoroutineDispatc } protected fun runTest(asyncPropagation: Boolean = true, block: suspend CoroutineScope.() -> T): T { - activeScope()?.setAsyncPropagation(asyncPropagation) + setAsyncPropagationEnabled(asyncPropagation) return runBlocking(jobName("test") + dispatcher, block = block) } } 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 6f83bc496df..144013b86a7 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 @@ -25,14 +25,4 @@ public Continuation captureConcurrent() { public void close() { delegate.close(); } - - @Override - public boolean isAsyncPropagating() { - return delegate.isAsyncPropagating(); - } - - @Override - public void setAsyncPropagation(final boolean value) { - delegate.setAsyncPropagation(value); - } } diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy index dbee2e5aab9..73265f565dd 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy @@ -19,6 +19,8 @@ import io.opentelemetry.trace.Status import io.opentelemetry.trace.TracingContextUtils import spock.lang.Subject +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled + class OpenTelemetryTest extends AgentTestRunner { @Subject def tracer = OpenTelemetry.tracerProvider.get("test-inst") @@ -232,7 +234,7 @@ class OpenTelemetryTest extends AgentTestRunner { setup: def span = tracer.spanBuilder("some name").startSpan() TraceScope scope = tracer.withSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagationEnabled(true) expect: tracer.currentSpan.delegate == span.delegate 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 c1d30e6fef6..7328d208ffc 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 @@ -73,16 +73,6 @@ public Continuation captureConcurrent() { return delegate.captureConcurrent(); } - @Override - public boolean isAsyncPropagating() { - return delegate.isAsyncPropagating(); - } - - @Override - public void setAsyncPropagation(final boolean value) { - delegate.setAsyncPropagation(value); - } - public boolean isFinishSpanOnClose() { return finishSpanOnClose; } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy b/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy index 09257573ef5..706636ca840 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy +++ b/dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy @@ -3,6 +3,7 @@ import datadog.trace.api.DDSpanId import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.interceptor.MutableSpan +import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities import datadog.trace.core.propagation.PropagationTags import datadog.trace.instrumentation.opentracing.DefaultLogHandler @@ -27,6 +28,7 @@ import io.opentracing.util.GlobalTracer import spock.lang.Subject import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTracing31Test extends AgentTestRunner { @@ -153,24 +155,25 @@ class OpenTracing31Test extends AgentTestRunner { def "test scopemanager"() { setup: + AgentTracer.TracerAPI internalTracer = tracer.tracer.tracer def span = tracer.buildSpan("some name").start() def scope = tracer.scopeManager().activate(span, finishSpan) - (scope as TraceScope).setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) expect: span instanceof MutableSpan scope instanceof TraceScope - !(scope as TraceScope).isAsyncPropagating() + !internalTracer.isAsyncPropagationEnabled() (scope as TraceScope).capture() == null (tracer.scopeManager().active().span().delegate == span.delegate) when: - (scope as TraceScope).setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) def continuation = (scope as TraceScope).capture() continuation.cancel() then: - (scope as TraceScope).isAsyncPropagating() + internalTracer.isAsyncPropagationEnabled() continuation instanceof TraceScope.Continuation when: "attempting to close the span this way doesn't work because we lost the 'finishSpan' reference" @@ -215,7 +218,7 @@ class OpenTracing31Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() TraceScope scope = tracer.scopeManager().activate(span, false) - scope.setAsyncPropagation(true) + setAsyncPropagationEnabled(true) expect: tracer.activeSpan().delegate == span.delegate 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 649a71d0f10..173d3b4c993 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 @@ -83,16 +83,6 @@ public Continuation captureConcurrent() { return delegate.captureConcurrent(); } - @Override - public boolean isAsyncPropagating() { - return delegate.isAsyncPropagating(); - } - - @Override - public void setAsyncPropagation(final boolean value) { - delegate.setAsyncPropagation(value); - } - public boolean isFinishSpanOnClose() { return finishSpanOnClose; } diff --git a/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy b/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy index 93a72bfba2f..cc8baddfaf2 100644 --- a/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy +++ b/dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy @@ -3,6 +3,7 @@ import datadog.trace.api.DDSpanId import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.interceptor.MutableSpan +import datadog.trace.bootstrap.instrumentation.api.AgentTracer import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities import datadog.trace.context.TraceScope import datadog.trace.core.DDSpan @@ -32,6 +33,7 @@ import static datadog.trace.api.sampling.PrioritySampling.USER_KEEP import static datadog.trace.api.sampling.SamplingMechanism.AGENT_RATE import static datadog.trace.api.sampling.SamplingMechanism.DEFAULT import static datadog.trace.api.sampling.SamplingMechanism.MANUAL +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTracing32Test extends AgentTestRunner { @@ -163,24 +165,25 @@ class OpenTracing32Test extends AgentTestRunner { def "test scopemanager"() { setup: + AgentTracer.TracerAPI internalTracer = tracer.tracer.tracer def span = tracer.buildSpan("some name").start() def scope = tracer.scopeManager().activate(span, finishSpan) - (scope as TraceScope).setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) expect: span instanceof MutableSpan scope instanceof TraceScope - !(scope as TraceScope).isAsyncPropagating() + !internalTracer.isAsyncPropagationEnabled() (scope as TraceScope).capture() == null (tracer.scopeManager().active().span().delegate == span.delegate) when: - (scope as TraceScope).setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) def continuation = (scope as TraceScope).capture() continuation.cancel() then: - (scope as TraceScope).isAsyncPropagating() + internalTracer.isAsyncPropagationEnabled() continuation instanceof TraceScope.Continuation when: "attempting to close the span this way doesn't work because we lost the 'finishSpan' reference" @@ -230,7 +233,7 @@ class OpenTracing32Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() TraceScope scope = tracer.scopeManager().activate(span, false) - scope.setAsyncPropagation(true) + setAsyncPropagationEnabled(true) expect: tracer.activeSpan().delegate == span.delegate diff --git a/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/RequestCompleteCallback.java b/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/RequestCompleteCallback.java index 5621de288c1..2433837ba51 100644 --- a/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/RequestCompleteCallback.java +++ b/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/RequestCompleteCallback.java @@ -1,10 +1,9 @@ package datadog.trace.instrumentation.play23; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.play23.PlayHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.play23.PlayHttpServerDecorator.REPORT_HTTP_STATUS; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -31,10 +30,7 @@ public Object apply(final Try result) { } } DECORATE.beforeFinish(span); - final AgentScope scope = activeScope(); - if (scope != null) { - scope.setAsyncPropagation(false); - } + setAsyncPropagationEnabled(false); } catch (final Throwable t) { log.debug("error in play instrumentation", t); } finally { diff --git a/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestCompleteCallback.java b/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestCompleteCallback.java index 45506e84178..4ec90a2b1c9 100644 --- a/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestCompleteCallback.java +++ b/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/RequestCompleteCallback.java @@ -1,10 +1,9 @@ package datadog.trace.instrumentation.play24; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.play24.PlayHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.play24.PlayHttpServerDecorator.REPORT_HTTP_STATUS; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,10 +29,7 @@ public Object apply(final Try result) { } } DECORATE.beforeFinish(span); - final AgentScope scope = activeScope(); - if (scope != null) { - scope.setAsyncPropagation(false); - } + setAsyncPropagationEnabled(false); } catch (final Throwable t) { log.debug("error in play instrumentation", t); } finally { diff --git a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/RequestCompleteCallback.java b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/RequestCompleteCallback.java index 3efbc0535db..2558071bf37 100644 --- a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/RequestCompleteCallback.java +++ b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/RequestCompleteCallback.java @@ -1,10 +1,9 @@ package datadog.trace.instrumentation.play26; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.play26.PlayHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.play26.PlayHttpServerDecorator.REPORT_HTTP_STATUS; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,10 +31,7 @@ public Object apply(final Try result) { } } DECORATE.beforeFinish(span); - final AgentScope scope = activeScope(); - if (scope != null) { - scope.setAsyncPropagation(false); - } + setAsyncPropagationEnabled(false); } catch (final Throwable t) { log.debug("error in play instrumentation", t); } finally { 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 b4a9902325a..12f8c4f13da 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,7 @@ package datadog.trace.instrumentation.playws1; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -54,7 +55,7 @@ public Object onCompleted() throws Exception { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return delegate.onCompleted(); } } else { @@ -70,7 +71,7 @@ public void onThrowable(final Throwable throwable) { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); delegate.onThrowable(throwable); } } else { 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 3db6978b8ec..30983b389f9 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,7 @@ package datadog.trace.instrumentation.playws21; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -59,7 +60,7 @@ public Object onCompleted() throws Exception { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return delegate.onCompleted(); } } else { @@ -75,7 +76,7 @@ public void onThrowable(final Throwable throwable) { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); delegate.onThrowable(throwable); } } else { 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 3648531a5c0..24ccad31361 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,7 @@ package datadog.trace.instrumentation.playws2; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -58,7 +59,7 @@ public Object onCompleted() throws Exception { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return delegate.onCompleted(); } } else { @@ -74,7 +75,7 @@ public void onThrowable(final Throwable throwable) { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); delegate.onThrowable(throwable); } } else { diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorCoreTest.groovy b/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorCoreTest.groovy index a89315a16ab..597b509d158 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorCoreTest.groovy +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/latestDepTest/groovy/ReactorCoreTest.groovy @@ -1,8 +1,3 @@ -import static datadog.trace.agent.test.utils.TraceUtils.basicSpan -import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan - import datadog.trace.agent.test.AgentTestRunner import datadog.trace.api.Trace import datadog.trace.bootstrap.instrumentation.api.AgentScope @@ -23,6 +18,11 @@ import spock.lang.Shared import java.time.Duration import java.util.concurrent.CompletableFuture +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan + class ReactorCoreTest extends AgentTestRunner { public static final String EXCEPTION_MESSAGE = "test exception" @@ -483,12 +483,10 @@ class ReactorCoreTest extends AgentTestRunner { def assemblePublisherUnderTrace(def publisherSupplier) { def span = startSpan("publisher-parent") // After this activation, the "add two" operations below should be children of this span - def scope = activateSpan(span) + def scope = activateSpan(span, true) Publisher publisher = publisherSupplier() try { - scope.setAsyncPropagation(true) - // Read all data from publisher if (publisher instanceof Mono) { return publisher.block() @@ -506,8 +504,7 @@ class ReactorCoreTest extends AgentTestRunner { @Trace(operationName = "trace-parent", resourceName = "trace-parent") def cancelUnderTrace(def publisherSupplier) { final AgentSpan span = startSpan("publisher-parent") - AgentScope scope = activateSpan(span) - scope.setAsyncPropagation(true) + AgentScope scope = activateSpan(span, true) def publisher = publisherSupplier() publisher.subscribe(new Subscriber() { diff --git a/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorCoreTest.groovy b/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorCoreTest.groovy index 1e59f5c4471..09eb37da714 100644 --- a/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorCoreTest.groovy +++ b/dd-java-agent/instrumentation/reactor-core-3.1/src/test/groovy/ReactorCoreTest.groovy @@ -1,8 +1,3 @@ -import static datadog.trace.agent.test.utils.TraceUtils.basicSpan -import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan - import datadog.trace.agent.test.AgentTestRunner import datadog.trace.api.Trace import datadog.trace.bootstrap.instrumentation.api.AgentScope @@ -23,6 +18,11 @@ import spock.lang.Shared import java.time.Duration import java.util.concurrent.CompletableFuture +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan + class ReactorCoreTest extends AgentTestRunner { public static final String EXCEPTION_MESSAGE = "test exception" @@ -483,12 +483,10 @@ class ReactorCoreTest extends AgentTestRunner { def assemblePublisherUnderTrace(def publisherSupplier) { def span = startSpan("publisher-parent") // After this activation, the "add two" operations below should be children of this span - def scope = activateSpan(span) + def scope = activateSpan(span, true) Publisher publisher = publisherSupplier() try { - scope.setAsyncPropagation(true) - // Read all data from publisher if (publisher instanceof Mono) { return publisher.block() @@ -506,8 +504,7 @@ class ReactorCoreTest extends AgentTestRunner { @Trace(operationName = "trace-parent", resourceName = "trace-parent") def cancelUnderTrace(def publisherSupplier) { final AgentSpan span = startSpan("publisher-parent") - AgentScope scope = activateSpan(span) - scope.setAsyncPropagation(true) + AgentScope scope = activateSpan(span, true) def publisher = publisherSupplier() publisher.subscribe(new Subscriber() { diff --git a/dd-java-agent/instrumentation/rxjava-2/src/test/groovy/RxJava2Test.groovy b/dd-java-agent/instrumentation/rxjava-2/src/test/groovy/RxJava2Test.groovy index fee16cf6904..9b2f71fea4c 100644 --- a/dd-java-agent/instrumentation/rxjava-2/src/test/groovy/RxJava2Test.groovy +++ b/dd-java-agent/instrumentation/rxjava-2/src/test/groovy/RxJava2Test.groovy @@ -384,12 +384,10 @@ class RxJava2Test extends AgentTestRunner { def assemblePublisherUnderTrace(def publisherSupplier) { def span = startSpan("publisher-parent") // After this activation, the "add two" operations below should be children of this span - def scope = activateSpan(span) + def scope = activateSpan(span, true) def publisher = publisherSupplier() try { - scope.setAsyncPropagation(true) - // Read all data from publisher if (publisher instanceof Maybe) { return ((Maybe) publisher).blockingGet() @@ -407,8 +405,7 @@ class RxJava2Test extends AgentTestRunner { @Trace(operationName = "trace-parent", resourceName = "trace-parent") def cancelUnderTrace(def publisherSupplier) { final AgentSpan span = startSpan("publisher-parent") - AgentScope scope = activateSpan(span) - scope.setAsyncPropagation(true) + AgentScope scope = activateSpan(span, true) def publisher = publisherSupplier() if (publisher instanceof Maybe) { diff --git a/dd-java-agent/instrumentation/scala-concurrent/src/test/groovy/ScalaExecutorInstrumentationTest.groovy b/dd-java-agent/instrumentation/scala-concurrent/src/test/groovy/ScalaExecutorInstrumentationTest.groovy index fc75e6e7639..a5a88157224 100644 --- a/dd-java-agent/instrumentation/scala-concurrent/src/test/groovy/ScalaExecutorInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/scala-concurrent/src/test/groovy/ScalaExecutorInstrumentationTest.groovy @@ -13,7 +13,7 @@ import java.util.concurrent.RejectedExecutionException import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled /** * Test executor instrumentation for Scala specific classes. @@ -43,7 +43,7 @@ class ScalaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new ScalaAsyncChild()) // this child won't @@ -94,7 +94,7 @@ class ScalaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagationEnabled(true) try { for (int i = 0; i < 20; ++i) { // Our current instrumentation instrumentation does not behave very well diff --git a/dd-java-agent/instrumentation/scala-promise/src/test/groovy/ScalaPromiseTestBase.groovy b/dd-java-agent/instrumentation/scala-promise/src/test/groovy/ScalaPromiseTestBase.groovy index 2488e74ec6a..824c4695ede 100644 --- a/dd-java-agent/instrumentation/scala-promise/src/test/groovy/ScalaPromiseTestBase.groovy +++ b/dd-java-agent/instrumentation/scala-promise/src/test/groovy/ScalaPromiseTestBase.groovy @@ -6,8 +6,8 @@ import spock.lang.Shared import static datadog.trace.agent.test.utils.TraceUtils.basicSpan import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled abstract class ScalaPromiseTestBase extends AbstractPromiseTest, Future> { @@ -61,7 +61,7 @@ abstract class ScalaPromiseTestBase extends AbstractPromiseTest } runUnderTrace("other") { - activeScope().setAsyncPropagation(false) + setAsyncPropagationEnabled(false) complete(promise, value) } diff --git a/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Advice.java b/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Advice.java index 85570d6d7f8..b5f565d198a 100644 --- a/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Advice.java +++ b/dd-java-agent/instrumentation/servlet/request-2/src/main/java/datadog/trace/instrumentation/servlet2/Servlet2Advice.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.servlet2; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.servlet2.Servlet2Decorator.DECORATE; @@ -118,7 +119,7 @@ public static void stopSpan( } DECORATE.beforeFinish(span); - scope.setAsyncPropagation(false); + setAsyncPropagationEnabled(false); scope.close(); span.finish(); } diff --git a/dd-java-agent/instrumentation/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java b/dd-java-agent/instrumentation/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java index 1e17fb6c621..36093714815 100644 --- a/dd-java-agent/instrumentation/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java +++ b/dd-java-agent/instrumentation/spring-scheduling-3.1/src/main/java/datadog/trace/instrumentation/springscheduling/SpannedMethodInvocation.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.springscheduling; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.springscheduling.SpringSchedulingDecorator.DECORATE; @@ -38,7 +39,7 @@ public Object proceed() throws Throwable { private Object invokeWithContinuation(CharSequence spanName) throws Throwable { try (AgentScope scope = continuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return invokeWithSpan(spanName); } } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/TraceUtils.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/TraceUtils.groovy index ad8da80213c..cd44a39eb6b 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/TraceUtils.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/TraceUtils.groovy @@ -47,8 +47,7 @@ class TraceUtils { final AgentSpan span = inheritCurrent ? startSpan(rootOperationName) : startSpan(rootOperationName, null) DECORATOR.afterStart(span) - AgentScope scope = activateSpan(span) - scope.setAsyncPropagation(true) + AgentScope scope = activateSpan(span, true) try { return r.call() diff --git a/dd-trace-api/build.gradle b/dd-trace-api/build.gradle index 22a588db3ba..7c25ddeb164 100644 --- a/dd-trace-api/build.gradle +++ b/dd-trace-api/build.gradle @@ -36,6 +36,8 @@ excludedClassesCoverage += [ 'datadog.trace.api.experimental.DataStreamsContextCarrier', 'datadog.trace.api.experimental.DataStreamsContextCarrier.NoOp', 'datadog.appsec.api.blocking.*', + // Default fallback methods to not break legacy API + 'datadog.trace.context.TraceScope', 'datadog.trace.context.NoopTraceScope.NoopContinuation', 'datadog.trace.context.NoopTraceScope', 'datadog.trace.payloadtags.PayloadTagsData', 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 d19f71917a6..e308983818b 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 @@ -25,6 +25,14 @@ public String getSpanId() { return "0"; } + @Override + public boolean isAsyncPropagationEnabled() { + return false; + } + + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} + @Override public boolean addTraceInterceptor(TraceInterceptor traceInterceptor) { return false; 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 a2583f91d8b..d90e7bb94c1 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(); + /** + * Checks whether asynchronous propagation is enabled, meaning this context will propagate across + * asynchronous boundaries. + * + * @deprecated Unstable API. Might be removed at any time. + * @return {@code true} if asynchronous propagation is enabled, {@code false} otherwise. + */ + @Deprecated + boolean isAsyncPropagationEnabled(); + + /** + * Enables or disables asynchronous propagation for the active span. + * + *

Asynchronous propagation is enabled by default from {@link + * ConfigDefaults#DEFAULT_ASYNC_PROPAGATING}. + * + * @deprecated Unstable API. Might be removed at any time. + * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code false} + * to disable it. + */ + @Deprecated + void setAsyncPropagationEnabled(boolean asyncPropagationEnabled); + /** * Add a new interceptor to the tracer. Interceptors with duplicate priority to existing ones are * ignored. 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 69f6b8ee895..4ec59fb71d2 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 @@ -31,12 +31,4 @@ public Continuation captureConcurrent() { @Override public void close() {} - - @Override - public boolean isAsyncPropagating() { - return false; - } - - @Override - public void setAsyncPropagation(boolean value) {} } 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 effa5a5758e..692f2857075 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 @@ -1,5 +1,7 @@ package datadog.trace.context; +import datadog.trace.api.GlobalTracer; +import datadog.trace.api.Tracer; import java.io.Closeable; /** An object which can propagate a datadog trace across multiple threads. */ @@ -29,15 +31,28 @@ public interface TraceScope extends Closeable { @Override void close(); - /** If true, this context will propagate across async boundaries. */ - boolean isAsyncPropagating(); + /** + * @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(); + } /** - * Enable or disable async propagation. Async propagation is initially set to false. - * - * @param value The new propagation value. True == propagate. False == don't propagate. + * @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. */ - void setAsyncPropagation(boolean value); + @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 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 29208628624..de8ae508046 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 @@ -919,6 +919,20 @@ public AgentScope.Continuation captureSpan(final AgentSpan span) { return scopeManager.captureSpan(span); } + @Override + public boolean isAsyncPropagationEnabled() { + AgentScope activeScope = this.scopeManager.active(); + return activeScope != null && activeScope.isAsyncPropagating(); + } + + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { + AgentScope activeScope = this.scopeManager.active(); + if (activeScope != null) { + activeScope.setAsyncPropagation(asyncPropagationEnabled); + } + } + @Override public void closePrevious(boolean finishSpan) { scopeManager.closePrevious(finishSpan); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceStrictWriteTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceStrictWriteTest.groovy index 18b71a34beb..6f4d9a8beda 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceStrictWriteTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceStrictWriteTest.groovy @@ -1,11 +1,13 @@ package datadog.trace.core +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled + class PendingTraceStrictWriteTest extends PendingTraceTestBase { def "trace is not reported until unfinished continuation is closed"() { when: def scope = tracer.activateSpan(rootSpan) - scope.setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = scope.capture() scope.close() rootSpan.finish() @@ -37,7 +39,7 @@ class PendingTraceStrictWriteTest extends PendingTraceTestBase { def "negative reference count throws an exception"() { when: def scope = tracer.activateSpan(rootSpan) - scope.setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = scope.capture() scope.close() rootSpan.finish() diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceTest.groovy index 250a752ae0e..8ec381235bb 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/PendingTraceTest.groovy @@ -10,6 +10,8 @@ import spock.lang.Timeout import java.util.concurrent.TimeUnit +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled + class PendingTraceTest extends PendingTraceTestBase { @Override @@ -49,7 +51,7 @@ class PendingTraceTest extends PendingTraceTestBase { def "trace is still reported when unfinished continuation discarded"() { when: def scope = tracer.activateSpan(rootSpan) - scope.setAsyncPropagation(true) + setAsyncPropagationEnabled(true) scope.capture() scope.close() rootSpan.finish() diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy index 27fd21fd610..f63a4134158 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/scopemanager/ScopeManagerTest.groovy @@ -251,16 +251,16 @@ class ScopeManagerTest extends DDCoreSpecification { def "DDScope only creates continuations when propagation is set"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(false) + tracer.setAsyncPropagationEnabled(false) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: continuation == null when: - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -275,9 +275,9 @@ class ScopeManagerTest extends DDCoreSpecification { def "Continuation.cancel doesn't close parent scope"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -296,9 +296,9 @@ class ScopeManagerTest extends DDCoreSpecification { // @Flaky("awaitGC is flaky") def "test continuation doesn't have hard reference on scope"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scopeRef = new AtomicReference(tracer.activateSpan(span)) - scopeRef.get().setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scopeRef.get().captureConcurrent() : scopeRef.get().capture() then: @@ -327,9 +327,9 @@ class ScopeManagerTest extends DDCoreSpecification { def "hard reference on continuation does not prevent trace from reporting"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -362,11 +362,11 @@ class ScopeManagerTest extends DDCoreSpecification { def "continuation restores trace"() { when: - def parentSpan = tracer.buildSpan("parent").start() + def parentSpan = tracer.buildSpan("test", "parent").start() def parentScope = tracer.activateSpan(parentSpan) - def childSpan = tracer.buildSpan("child").start() + def childSpan = tracer.buildSpan("test", "child").start() def childScope = tracer.activateSpan(childSpan) - childScope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrentChild ? childScope.captureConcurrent() : childScope.capture() childScope.close() @@ -431,9 +431,9 @@ class ScopeManagerTest extends DDCoreSpecification { def "continuation allows adding spans even after other spans were completed"() { when: "creating and activating a continuation" - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -451,7 +451,7 @@ class ScopeManagerTest extends DDCoreSpecification { writer == [] when: "creating a new child span under a continued scope" - def childSpan = tracer.buildSpan("child").start() + def childSpan = tracer.buildSpan("test", "child").start() def childScope = tracer.activateSpan(childSpan) childScope.close() childSpan.finish() @@ -475,7 +475,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "test activating same span multiple times"() { setup: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def state = Mock(Stateful) when: @@ -509,7 +509,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "opening and closing multiple scopes"() { when: - AgentSpan span = tracer.buildSpan("foo").start() + AgentSpan span = tracer.buildSpan("test", "foo").start() AgentScope continuableScope = tracer.activateSpan(span) then: @@ -517,7 +517,7 @@ class ScopeManagerTest extends DDCoreSpecification { assertEvents([ACTIVATE]) when: - AgentSpan childSpan = tracer.buildSpan("foo").start() + AgentSpan childSpan = tracer.buildSpan("test", "foo").start() AgentScope childDDScope = tracer.activateSpan(childSpan) then: @@ -541,10 +541,10 @@ class ScopeManagerTest extends DDCoreSpecification { def "closing scope out of order - simple"() { when: - AgentSpan firstSpan = tracer.buildSpan("foo").start() + AgentSpan firstSpan = tracer.buildSpan("test", "foo").start() AgentScope firstScope = tracer.activateSpan(firstSpan) - AgentSpan secondSpan = tracer.buildSpan("bar").start() + AgentSpan secondSpan = tracer.buildSpan("test", "bar").start() AgentScope secondScope = tracer.activateSpan(secondSpan) firstSpan.finish() @@ -581,7 +581,7 @@ class ScopeManagerTest extends DDCoreSpecification { // tracer.activeScope() or tracer.activeSpan() doesn't change the count when: - AgentSpan firstSpan = tracer.buildSpan("foo").start() + AgentSpan firstSpan = tracer.buildSpan("test", "foo").start() AgentScope firstScope = tracer.activateSpan(firstSpan) then: @@ -596,7 +596,7 @@ class ScopeManagerTest extends DDCoreSpecification { 0 * _ when: - AgentSpan secondSpan = tracer.buildSpan("bar").start() + AgentSpan secondSpan = tracer.buildSpan("test", "bar").start() AgentScope secondScope = tracer.activateSpan(secondSpan) then: @@ -609,7 +609,7 @@ class ScopeManagerTest extends DDCoreSpecification { 0 * _ when: - AgentSpan thirdSpan = tracer.buildSpan("quux").start() + AgentSpan thirdSpan = tracer.buildSpan("test", "quux").start() AgentScope thirdScope = tracer.activateSpan(thirdSpan) then: @@ -671,7 +671,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "closing scope out of order - multiple activations"() { setup: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() when: AgentScope scope1 = scopeManager.activate(span, ScopeSource.INSTRUMENTATION) @@ -686,7 +686,7 @@ class ScopeManagerTest extends DDCoreSpecification { assertEvents([ACTIVATE]) when: - AgentSpan thirdSpan = tracer.buildSpan("quux").start() + AgentSpan thirdSpan = tracer.buildSpan("test", "quux").start() AgentScope thirdScope = tracer.activateSpan(thirdSpan) 0 * _ @@ -723,9 +723,9 @@ class ScopeManagerTest extends DDCoreSpecification { def "Closing a continued scope out of order cancels the continuation"() { when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -740,7 +740,7 @@ class ScopeManagerTest extends DDCoreSpecification { if (concurrent) { continuation.cancel() } - AgentSpan secondSpan = tracer.buildSpan("test2").start() + AgentSpan secondSpan = tracer.buildSpan("test", "test2").start() AgentScope secondScope = (ContinuableScope) tracer.activateSpan(secondSpan) then: @@ -771,7 +771,7 @@ class ScopeManagerTest extends DDCoreSpecification { tracer.addTraceInterceptor(interceptor) when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) scope.close() span.finish() @@ -786,7 +786,7 @@ class ScopeManagerTest extends DDCoreSpecification { writer == [[span]] when: "completing another scope lifecycle" - def span2 = tracer.buildSpan("test").start() + def span2 = tracer.buildSpan("test", "test").start() def scope2 = tracer.activateSpan(span2) then: @@ -811,9 +811,9 @@ class ScopeManagerTest extends DDCoreSpecification { tracer.addTraceInterceptor(interceptor) when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -838,9 +838,9 @@ class ScopeManagerTest extends DDCoreSpecification { writer == [[span]] when: "completing another async scope lifecycle" - def span2 = tracer.buildSpan("test").start() + def span2 = tracer.buildSpan("test", "test").start() def scope2 = tracer.activateSpan(span2) - scope2.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) def continuation2 = concurrent ? scope2.captureConcurrent() : scope2.capture() then: @@ -875,10 +875,10 @@ class ScopeManagerTest extends DDCoreSpecification { long sendDelayNanos = TimeUnit.MILLISECONDS.toNanos(500 - 100) when: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() def start = System.nanoTime() def scope = (ContinuableScope) tracer.activateSpan(span) - scope.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) continuation = scope.captureConcurrent() scope.close() span.finish() @@ -917,7 +917,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "scope listener should be notified about the currently active scope"() { setup: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() when: AgentScope scope = scopeManager.activate(span, ScopeSource.INSTRUMENTATION) @@ -947,7 +947,7 @@ class ScopeManagerTest extends DDCoreSpecification { def "extended scope listener should be notified about the currently active scope"() { setup: - def span = tracer.buildSpan("test").start() + def span = tracer.buildSpan("test", "test").start() when: AgentScope scope = scopeManager.activate(span, ScopeSource.INSTRUMENTATION) @@ -1000,7 +1000,7 @@ class ScopeManagerTest extends DDCoreSpecification { scopeManager.addScopeListener(secondEventCountingListener) when: - AgentSpan span = tracer.buildSpan("foo").start() + AgentSpan span = tracer.buildSpan("test", "foo").start() AgentScope continuableScope = tracer.activateSpan(span) then: @@ -1008,7 +1008,7 @@ class ScopeManagerTest extends DDCoreSpecification { secondEventCountingListener.events == [ACTIVATE] when: - AgentSpan childSpan = tracer.buildSpan("foo").start() + AgentSpan childSpan = tracer.buildSpan("test", "foo").start() AgentScope childDDScope = tracer.activateSpan(childSpan) then: @@ -1053,12 +1053,12 @@ class ScopeManagerTest extends DDCoreSpecification { 0 * profilingContext.onAttach() when: "scopes activate on threads" - AgentSpan span = tracer.buildSpan("foo").start() + AgentSpan span = tracer.buildSpan("test", "foo").start() def futures = new Future[numTasks] for (int i = 0; i < numTasks; i++) { futures[i] = executor.submit({ AgentScope scope = tracer.activateSpan(span) - def child = tracer.buildSpan("foo" + i).start() + def child = tracer.buildSpan("test", "foo" + i).start() def childScope = tracer.activateSpan(child) try { Thread.sleep(100) 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 4e52736dfdc..7dc452bef89 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/DDTracer.java @@ -426,6 +426,16 @@ public String getSpanId() { return tracer.getSpanId(); } + @Override + public boolean isAsyncPropagationEnabled() { + return tracer.isAsyncPropagationEnabled(); + } + + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { + tracer.setAsyncPropagationEnabled(asyncPropagationEnabled); + } + @Override public boolean addTraceInterceptor(final TraceInterceptor traceInterceptor) { return tracer.addTraceInterceptor(traceInterceptor); 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 f34a66227db..3ac3eb017c7 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/OTScopeManager.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/OTScopeManager.java @@ -101,20 +101,6 @@ public Continuation captureConcurrent() { return delegate.captureConcurrent(); } - @Override - public boolean isAsyncPropagating() { - return delegate.isAsyncPropagating(); - } - - @Override - public void setAsyncPropagation(final boolean value) { - delegate.setAsyncPropagation(value); - } - - AgentScope unwrap() { - return delegate; - } - boolean isFinishSpanOnClose() { return finishSpanOnClose; } diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy index 6ed8fd994cb..7d4ccfb0761 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy @@ -4,8 +4,9 @@ import datadog.trace.api.DDTags import datadog.trace.api.config.TracerConfig import datadog.trace.api.interceptor.MutableSpan import datadog.trace.api.interceptor.TraceInterceptor -import datadog.trace.common.writer.ListWriter import datadog.trace.api.scopemanager.ScopeListener +import datadog.trace.bootstrap.instrumentation.api.AgentTracer +import datadog.trace.common.writer.ListWriter import datadog.trace.context.TraceScope import datadog.trace.test.util.DDSpecification import io.opentracing.Scope @@ -221,22 +222,25 @@ class OpenTracingAPITest extends DDSpecification { } def "span with async propagation"() { + setup: + AgentTracer.TracerAPI internalTracer = tracer.tracer + when: Scope scope = tracer.buildSpan("someOperation") .withTag(DDTags.SERVICE_NAME, "someService") .startActive(true) - ((TraceScope) scope).setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) then: scope instanceof TraceScope - !((TraceScope) scope).isAsyncPropagating() + !internalTracer.isAsyncPropagationEnabled() when: - ((TraceScope) scope).setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) TraceScope.Continuation continuation = ((TraceScope) scope).capture() then: - ((TraceScope) scope).isAsyncPropagating() + internalTracer.isAsyncPropagationEnabled() continuation != null when: @@ -262,26 +266,26 @@ class OpenTracingAPITest extends DDSpecification { } def "span inherits async propagation"() { + setup: + AgentTracer.TracerAPI internalTracer = tracer.tracer + when: Scope outer = tracer.buildSpan("someOperation") .withTag(DDTags.SERVICE_NAME, "someService") .startActive(true) - ((TraceScope) outer).setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) then: - outer instanceof TraceScope - !((TraceScope) outer).isAsyncPropagating() + !internalTracer.isAsyncPropagationEnabled() when: - ((TraceScope) outer).setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) Scope inner = tracer.buildSpan("otherOperation") .withTag(DDTags.SERVICE_NAME, "otherService") .startActive(true) then: - inner instanceof TraceScope - ((TraceScope) outer).isAsyncPropagating() - ((TraceScope) inner).isAsyncPropagating() + internalTracer.isAsyncPropagationEnabled() when: inner.close() diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java index 48f4da78f4c..396acd80140 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentScope.java @@ -14,9 +14,6 @@ public interface AgentScope extends TraceScope, Closeable { @Override Continuation captureConcurrent(); - @Override - void setAsyncPropagation(boolean value); - @Override void close(); 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 14152768173..9fb97ae2c74 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 @@ -3,6 +3,7 @@ import static datadog.trace.api.ConfigDefaults.DEFAULT_ASYNC_PROPAGATING; import static java.util.Collections.emptyList; +import datadog.trace.api.ConfigDefaults; import datadog.trace.api.DDSpanId; import datadog.trace.api.DDTraceId; import datadog.trace.api.EndpointCheckpointer; @@ -140,6 +141,29 @@ public static AgentScope.Continuation capture() { return activeScope == null ? null : activeScope.capture(); } + /** + * Checks whether asynchronous propagation is enabled, meaning this context will propagate across + * asynchronous boundaries. + * + * @return {@code true} if asynchronous propagation is enabled, {@code false} otherwise. + */ + public static boolean isAsyncPropagationEnabled() { + return get().isAsyncPropagationEnabled(); + } + + /** + * Enables or disables asynchronous propagation for the active span. + * + *

Asynchronous propagation is enabled by default from {@link + * ConfigDefaults#DEFAULT_ASYNC_PROPAGATING}. + * + * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code false} + * to disable it. + */ + public static void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { + get().setAsyncPropagationEnabled(asyncPropagationEnabled); + } + public static AgentPropagation propagate() { return get().propagate(); } @@ -284,9 +308,9 @@ default SpanBuilder buildSpan(CharSequence spanName) { AgentHistogram newHistogram(double relativeAccuracy, int maxNumBins); /** - * Sets the new service name to be used as a default + * Sets the new service name to be used as a default. * - * @param serviceName + * @param serviceName The service name to use as default. */ void updatePreferredServiceName(String serviceName); } @@ -371,6 +395,14 @@ public AgentScope.Continuation captureSpan(final AgentSpan span) { return NoopContinuation.INSTANCE; } + @Override + public boolean isAsyncPropagationEnabled() { + return false; + } + + @Override + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} + @Override public void closePrevious(final boolean finishSpan) {}