From 9b773f673f03d17b5892ff1bd307405d54658862 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 16 Jan 2025 15:21:25 +0100 Subject: [PATCH 1/9] feat(core): Move async propagation API from scope to tracer --- .../java/concurrent/AdviceUtils.java | 3 +- .../AkkaExecutorInstrumentationTest.groovy | 9 +- .../TraceContinuedFutureCallback.java | 7 +- .../TraceContinuedFutureCallback.java | 7 +- .../HystrixThreadPoolInstrumentation.java | 18 ++-- .../test/groovy/CompletableFutureTest.groovy | 4 +- .../src/test/groovy/VirtualThreadTest.groovy | 4 +- ...syncPropagatingDisableInstrumentation.java | 21 ++-- .../ExecutorInstrumentationTest.groovy | 12 +-- .../NettyExecutorInstrumentationTest.groovy | 6 +- .../executor/RejectedExecutionTest.groovy | 8 +- .../JettyExecutorInstrumentationTest.groovy | 4 +- .../coroutines/CoreKotlinCoroutineTests.kt | 4 +- .../opentelemetry/OtelScope.java | 10 -- .../src/test/groovy/OpenTelemetryTest.groovy | 4 +- .../opentracing31/OTScopeManager.java | 10 -- .../src/test/groovy/OpenTracing31Test.groovy | 7 +- .../opentracing32/OTScopeManager.java | 10 -- .../src/test/groovy/OpenTracing32Test.groovy | 7 +- .../play23/RequestCompleteCallback.java | 8 +- .../play24/RequestCompleteCallback.java | 8 +- .../play26/RequestCompleteCallback.java | 8 +- .../playws1/AsyncHandlerWrapper.java | 5 +- .../playws21/AsyncHandlerWrapper.java | 5 +- .../playws2/AsyncHandlerWrapper.java | 5 +- .../groovy/ReactorCoreTest.groovy | 17 ++-- .../src/test/groovy/ReactorCoreTest.groovy | 17 ++-- .../src/test/groovy/RxJava2Test.groovy | 7 +- .../ScalaExecutorInstrumentationTest.groovy | 6 +- .../test/groovy/ScalaPromiseTestBase.groovy | 4 +- .../servlet2/Servlet2Advice.java | 3 +- .../SpannedMethodInvocation.java | 3 +- .../trace/agent/test/utils/TraceUtils.groovy | 3 +- .../datadog/trace/context/NoopTraceScope.java | 8 -- .../datadog/trace/context/TraceScope.java | 12 ++- .../java/datadog/trace/core/CoreTracer.java | 14 +++ .../core/PendingTraceStrictWriteTest.groovy | 6 +- .../trace/core/PendingTraceTest.groovy | 4 +- .../core/scopemanager/ScopeManagerTest.groovy | 23 ++--- .../datadog/opentracing/OTScopeManager.java | 14 --- .../opentracing/OpenTracingAPITest.groovy | 96 +------------------ .../instrumentation/api/AgentScope.java | 3 - .../instrumentation/api/AgentTracer.java | 48 +++++++++- 43 files changed, 194 insertions(+), 288 deletions(-) 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..dbf481ee4ba 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.setAsyncPropagation; 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); + setAsyncPropagation(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..241a46bfb78 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.setAsyncPropagation + /** * 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) + setAsyncPropagation(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) + setAsyncPropagation(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) + setAsyncPropagation(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..57ee3c6b6b1 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.setAsyncPropagation; 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); + setAsyncPropagation(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); + setAsyncPropagation(true); failDelegate(ex); } } @@ -72,7 +73,7 @@ public void cancelled() { cancelDelegate(); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagation(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..7f98b7c86f9 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.setAsyncPropagation; 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); + setAsyncPropagation(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); + setAsyncPropagation(true); failDelegate(ex); } } @@ -75,7 +76,7 @@ public void cancelled() { cancelDelegate(); } else { try (final AgentScope scope = parentContinuation.activate()) { - scope.setAsyncPropagation(true); + setAsyncPropagation(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..3152b75fd57 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.isAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; 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 (!isAsyncPropagation()) { + setAsyncPropagation(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); - } + setAsyncPropagation(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..0833d222d2b 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.setAsyncPropagation /** * 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) + setAsyncPropagation(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..baf88910164 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.setAsyncPropagation class VirtualThreadTest extends AgentTestRunner { @Shared @@ -37,7 +37,7 @@ class VirtualThreadTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagation(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..c5c0f89ad67 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.isAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; 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 (isAsyncPropagation()) { + setAsyncPropagation(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) { + setAsyncPropagation(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..6ffc28c9e0e 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.setAsyncPropagation 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) + setAsyncPropagation(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) + setAsyncPropagation(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) + setAsyncPropagation(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) + setAsyncPropagation(true) m(pool, w(child)) } }.run() @@ -406,7 +406,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagation(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..522d3f70bd8 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.setAsyncPropagation 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) + setAsyncPropagation(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) + setAsyncPropagation(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..0b574ce9557 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.setAsyncPropagation class RejectedExecutionTest extends AgentTestRunner { @@ -193,7 +193,7 @@ class RejectedExecutionTest extends AgentTestRunner { when: runUnderTrace("parent") { - activeScope().setAsyncPropagation(true) + setAsyncPropagation(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) + setAsyncPropagation(true) pool.submit({}) } } @@ -261,7 +261,7 @@ class RejectedExecutionTest extends AgentTestRunner { return { runUnderTrace("parent") { - activeScope().setAsyncPropagation(true) + setAsyncPropagation(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..95e4c7fb1d2 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.setAsyncPropagation 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) + setAsyncPropagation(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..85fde634249 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.setAsyncPropagation 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) + setAsyncPropagation(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..6e66ba756a2 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.setAsyncPropagation + 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) + setAsyncPropagation(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..655b6b0df5a 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 @@ -27,6 +27,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.setAsyncPropagation class OpenTracing31Test extends AgentTestRunner { @@ -155,7 +156,7 @@ class OpenTracing31Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() def scope = tracer.scopeManager().activate(span, finishSpan) - (scope as TraceScope).setAsyncPropagation(false) + setAsyncPropagation(false) expect: span instanceof MutableSpan @@ -165,7 +166,7 @@ class OpenTracing31Test extends AgentTestRunner { (tracer.scopeManager().active().span().delegate == span.delegate) when: - (scope as TraceScope).setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = (scope as TraceScope).capture() continuation.cancel() @@ -215,7 +216,7 @@ class OpenTracing31Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() TraceScope scope = tracer.scopeManager().activate(span, false) - scope.setAsyncPropagation(true) + setAsyncPropagation(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..fb6ce4555f3 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 @@ -32,6 +32,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.setAsyncPropagation class OpenTracing32Test extends AgentTestRunner { @@ -165,7 +166,7 @@ class OpenTracing32Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() def scope = tracer.scopeManager().activate(span, finishSpan) - (scope as TraceScope).setAsyncPropagation(false) + setAsyncPropagation(false) expect: span instanceof MutableSpan @@ -175,7 +176,7 @@ class OpenTracing32Test extends AgentTestRunner { (tracer.scopeManager().active().span().delegate == span.delegate) when: - (scope as TraceScope).setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = (scope as TraceScope).capture() continuation.cancel() @@ -230,7 +231,7 @@ class OpenTracing32Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() TraceScope scope = tracer.scopeManager().activate(span, false) - scope.setAsyncPropagation(true) + setAsyncPropagation(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..0724194068f 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.setAsyncPropagation; 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); - } + setAsyncPropagation(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..8e5b2a98392 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.setAsyncPropagation; 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); - } + setAsyncPropagation(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..0f221425eec 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.setAsyncPropagation; 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); - } + setAsyncPropagation(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..c55c74dfb03 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.setAsyncPropagation; 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); + setAsyncPropagation(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); + setAsyncPropagation(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..b6dccbab67b 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.setAsyncPropagation; 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); + setAsyncPropagation(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); + setAsyncPropagation(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..7c898147113 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.setAsyncPropagation; 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); + setAsyncPropagation(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); + setAsyncPropagation(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..e193f842146 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.setAsyncPropagation /** * Test executor instrumentation for Scala specific classes. @@ -43,7 +43,7 @@ class ScalaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - activeScope().setAsyncPropagation(true) + setAsyncPropagation(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) + setAsyncPropagation(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..ee6ce655f35 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.setAsyncPropagation abstract class ScalaPromiseTestBase extends AbstractPromiseTest, Future> { @@ -61,7 +61,7 @@ abstract class ScalaPromiseTestBase extends AbstractPromiseTest } runUnderTrace("other") { - activeScope().setAsyncPropagation(false) + setAsyncPropagation(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..4ca84476014 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.setAsyncPropagation; 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); + setAsyncPropagation(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..e4ef7152958 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.setAsyncPropagation; 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); + setAsyncPropagation(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/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..313060528cf 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 @@ -30,14 +30,22 @@ public interface TraceScope extends Closeable { void close(); /** If true, this context will propagate across async boundaries. */ - boolean isAsyncPropagating(); + default boolean isAsyncPropagating() { + // TODO Deprecate and document the new method + // TODO Check expected behavior, returning false seems better + throw new UnsupportedOperationException(); + } /** * Enable or disable async propagation. Async propagation is initially set to false. * * @param value The new propagation value. True == propagate. False == don't propagate. */ - void setAsyncPropagation(boolean value); + default void setAsyncPropagation(boolean value) { + // TODO Deprecate and document the new method + // TODO Check expected behavior, doing nothing seems better + throw new UnsupportedOperationException(); + } /** * 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..dc28f725f7b 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 isAsyncPropagation() { + AgentScope activeScope = this.scopeManager.active(); + return activeScope != null && activeScope.isAsyncPropagating(); + } + + @Override + public void setAsyncPropagation(boolean asyncPropagation) { + AgentScope activeScope = this.scopeManager.active(); + if (activeScope != null) { + activeScope.setAsyncPropagation(asyncPropagation); + } + } + @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..a0be28b359e 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.setAsyncPropagation + class PendingTraceStrictWriteTest extends PendingTraceTestBase { def "trace is not reported until unfinished continuation is closed"() { when: def scope = tracer.activateSpan(rootSpan) - scope.setAsyncPropagation(true) + setAsyncPropagation(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) + setAsyncPropagation(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..5a494efc4fa 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.setAsyncPropagation + 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) + setAsyncPropagation(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..df3b1f6be20 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 @@ -27,6 +27,7 @@ import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation import static datadog.trace.core.scopemanager.EVENT.ACTIVATE import static datadog.trace.core.scopemanager.EVENT.CLOSE import static datadog.trace.test.util.GCUtils.awaitGC @@ -253,14 +254,14 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(false) + setAsyncPropagation(false) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: continuation == null when: - scope.setAsyncPropagation(true) + setAsyncPropagation(true) continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -277,7 +278,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -298,7 +299,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scopeRef = new AtomicReference(tracer.activateSpan(span)) - scopeRef.get().setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrent ? scopeRef.get().captureConcurrent() : scopeRef.get().capture() then: @@ -329,7 +330,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -366,7 +367,7 @@ class ScopeManagerTest extends DDCoreSpecification { def parentScope = tracer.activateSpan(parentSpan) def childSpan = tracer.buildSpan("child").start() def childScope = tracer.activateSpan(childSpan) - childScope.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrentChild ? childScope.captureConcurrent() : childScope.capture() childScope.close() @@ -433,7 +434,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: "creating and activating a continuation" def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -725,7 +726,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -813,7 +814,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -840,7 +841,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: "completing another async scope lifecycle" def span2 = tracer.buildSpan("test").start() def scope2 = tracer.activateSpan(span2) - scope2.setAsyncPropagation(true) + setAsyncPropagation(true) def continuation2 = concurrent ? scope2.captureConcurrent() : scope2.capture() then: @@ -878,7 +879,7 @@ class ScopeManagerTest extends DDCoreSpecification { def span = tracer.buildSpan("test").start() def start = System.nanoTime() def scope = (ContinuableScope) tracer.activateSpan(span) - scope.setAsyncPropagation(true) + setAsyncPropagation(true) continuation = scope.captureConcurrent() scope.close() span.finish() 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..76dce50ca47 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy @@ -4,9 +4,8 @@ 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.context.TraceScope +import datadog.trace.common.writer.ListWriter import datadog.trace.test.util.DDSpecification import io.opentracing.Scope import io.opentracing.Span @@ -220,99 +219,6 @@ class OpenTracingAPITest extends DDSpecification { } } - def "span with async propagation"() { - when: - Scope scope = tracer.buildSpan("someOperation") - .withTag(DDTags.SERVICE_NAME, "someService") - .startActive(true) - ((TraceScope) scope).setAsyncPropagation(false) - - then: - scope instanceof TraceScope - !((TraceScope) scope).isAsyncPropagating() - - when: - ((TraceScope) scope).setAsyncPropagation(true) - TraceScope.Continuation continuation = ((TraceScope) scope).capture() - - then: - ((TraceScope) scope).isAsyncPropagating() - continuation != null - - when: - continuation.cancel() - scope.close() - writer.waitForTraces(1) - - then: - 1 * traceInterceptor.onTraceComplete({ it.size() == 1 }) >> { args -> args[0] } - - assertTraces(writer, 1) { - trace(1) { - span { - serviceName "someService" - operationName "someOperation" - resourceName "someOperation" - tags { - defaultTags() - } - } - } - } - } - - def "span inherits async propagation"() { - when: - Scope outer = tracer.buildSpan("someOperation") - .withTag(DDTags.SERVICE_NAME, "someService") - .startActive(true) - ((TraceScope) outer).setAsyncPropagation(false) - - then: - outer instanceof TraceScope - !((TraceScope) outer).isAsyncPropagating() - - when: - ((TraceScope) outer).setAsyncPropagation(true) - Scope inner = tracer.buildSpan("otherOperation") - .withTag(DDTags.SERVICE_NAME, "otherService") - .startActive(true) - - then: - inner instanceof TraceScope - ((TraceScope) outer).isAsyncPropagating() - ((TraceScope) inner).isAsyncPropagating() - - when: - inner.close() - outer.close() - writer.waitForTraces(1) - - then: - 1 * traceInterceptor.onTraceComplete({ it.size() == 2 }) >> { args -> args[0] } - - assertTraces(writer, 1) { - trace(2) { - span { - serviceName "someService" - operationName "someOperation" - resourceName "someOperation" - tags { - defaultTags() - } - } - span { - serviceName "otherService" - operationName "otherOperation" - resourceName "otherOperation" - tags { - defaultTags() - } - } - } - } - } - def "SpanContext ids equal tracer ids"() { when: Span testSpan = tracer.buildSpan("someOperation") 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..c785be7a615 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 @@ -140,6 +140,26 @@ public static AgentScope.Continuation capture() { return activeScope == null ? null : activeScope.capture(); } + /** + * Checks whether the asynchronous propagation is enabled, meaning this context will propagate + * across asynchronous boundaries. + */ + public static boolean isAsyncPropagation() { + return get().isAsyncPropagation(); + } + + /** + * Enables or disables asynchronous propagation for the active span. + * + *

Asynchronous propagation is disabled by default. + * + * @param asyncPropagation @{@code true} to enable asynchronous propagation, {@code false} to + * disable it. + */ + public static void setAsyncPropagation(boolean asyncPropagation) { + get().setAsyncPropagation(asyncPropagation); + } + public static AgentPropagation propagate() { return get().propagate(); } @@ -230,6 +250,22 @@ AgentSpan startSpan( AgentScope.Continuation captureSpan(AgentSpan span); + /** + * Checks whether the asynchronous propagation is enabled, meaning this context will propagate + * across asynchronous boundaries. + */ + boolean isAsyncPropagation(); + + /** + * Enables or disables asynchronous propagation for the active span. + * + *

Asynchronous propagation is disabled by default. + * + * @param asyncPropagation @{@code true} to enable asynchronous propagation, {@code false} to + * disable it. + */ + void setAsyncPropagation(boolean asyncPropagation); + void closePrevious(boolean finishSpan); AgentScope activateNext(AgentSpan span); @@ -284,9 +320,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 +407,14 @@ public AgentScope.Continuation captureSpan(final AgentSpan span) { return NoopContinuation.INSTANCE; } + @Override + public boolean isAsyncPropagation() { + return false; + } + + @Override + public void setAsyncPropagation(boolean asyncPropagation) {} + @Override public void closePrevious(final boolean finishSpan) {} From d1276248ee6b4e8d46e8cfab205adf412698bb15 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 16 Jan 2025 16:07:05 +0100 Subject: [PATCH 2/9] fix(core): Fix unit tests --- .../datadog/trace/core/scopemanager/ScopeManagerTest.groovy | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 df3b1f6be20..1c05322fc81 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 @@ -252,16 +252,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) - setAsyncPropagation(false) + tracer.setAsyncPropagation(false) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: continuation == null when: - setAsyncPropagation(true) + tracer.setAsyncPropagation(true) continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: From 863cdbcfe229ca0d6e02ac1f8d03d5625b68a1ce Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 16 Jan 2025 16:26:16 +0100 Subject: [PATCH 3/9] fix(ot): Fix unit tests --- .../src/test/groovy/OpenTracing31Test.groovy | 10 +- .../src/test/groovy/OpenTracing32Test.groovy | 10 +- .../opentracing/OpenTracingAPITest.groovy | 98 +++++++++++++++++++ 3 files changed, 110 insertions(+), 8 deletions(-) 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 655b6b0df5a..8ef332ad9e5 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 @@ -154,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) - setAsyncPropagation(false) + internalTracer.setAsyncPropagation(false) expect: span instanceof MutableSpan scope instanceof TraceScope - !(scope as TraceScope).isAsyncPropagating() + !internalTracer.isAsyncPropagation() (scope as TraceScope).capture() == null (tracer.scopeManager().active().span().delegate == span.delegate) when: - setAsyncPropagation(true) + internalTracer.setAsyncPropagation(true) def continuation = (scope as TraceScope).capture() continuation.cancel() then: - (scope as TraceScope).isAsyncPropagating() + internalTracer.isAsyncPropagation() continuation instanceof TraceScope.Continuation when: "attempting to close the span this way doesn't work because we lost the 'finishSpan' reference" 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 fb6ce4555f3..9c36fff6e12 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 @@ -164,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) - setAsyncPropagation(false) + internalTracer.setAsyncPropagation(false) expect: span instanceof MutableSpan scope instanceof TraceScope - !(scope as TraceScope).isAsyncPropagating() + !internalTracer.isAsyncPropagation() (scope as TraceScope).capture() == null (tracer.scopeManager().active().span().delegate == span.delegate) when: - setAsyncPropagation(true) + internalTracer.setAsyncPropagation(true) def continuation = (scope as TraceScope).capture() continuation.cancel() then: - (scope as TraceScope).isAsyncPropagating() + internalTracer.isAsyncPropagation() continuation instanceof TraceScope.Continuation when: "attempting to close the span this way doesn't work because we lost the 'finishSpan' reference" 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 76dce50ca47..77515502717 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy @@ -5,7 +5,9 @@ import datadog.trace.api.config.TracerConfig import datadog.trace.api.interceptor.MutableSpan import datadog.trace.api.interceptor.TraceInterceptor 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 import io.opentracing.Span @@ -219,6 +221,102 @@ 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) + internalTracer.setAsyncPropagation(false) + + then: + scope instanceof TraceScope + !internalTracer.isAsyncPropagation() + + when: + internalTracer.setAsyncPropagation(true) + TraceScope.Continuation continuation = ((TraceScope) scope).capture() + + then: + internalTracer.isAsyncPropagation() + continuation != null + + when: + continuation.cancel() + scope.close() + writer.waitForTraces(1) + + then: + 1 * traceInterceptor.onTraceComplete({ it.size() == 1 }) >> { args -> args[0] } + + assertTraces(writer, 1) { + trace(1) { + span { + serviceName "someService" + operationName "someOperation" + resourceName "someOperation" + tags { + defaultTags() + } + } + } + } + } + + def "span inherits async propagation"() { + setup: + AgentTracer.TracerAPI internalTracer = tracer.tracer + + when: + Scope outer = tracer.buildSpan("someOperation") + .withTag(DDTags.SERVICE_NAME, "someService") + .startActive(true) + internalTracer.setAsyncPropagation(false) + + then: + !internalTracer.isAsyncPropagation() + + when: + internalTracer.setAsyncPropagation(true) + Scope inner = tracer.buildSpan("otherOperation") + .withTag(DDTags.SERVICE_NAME, "otherService") + .startActive(true) + + then: + internalTracer.isAsyncPropagation() + + when: + inner.close() + outer.close() + writer.waitForTraces(1) + + then: + 1 * traceInterceptor.onTraceComplete({ it.size() == 2 }) >> { args -> args[0] } + + assertTraces(writer, 1) { + trace(2) { + span { + serviceName "someService" + operationName "someOperation" + resourceName "someOperation" + tags { + defaultTags() + } + } + span { + serviceName "otherService" + operationName "otherOperation" + resourceName "otherOperation" + tags { + defaultTags() + } + } + } + } + } + def "SpanContext ids equal tracer ids"() { when: Span testSpan = tracer.buildSpan("someOperation") From 9a815a286e8867855d2bd7206199be1234f9a9b4 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 16 Jan 2025 16:43:26 +0100 Subject: [PATCH 4/9] feat(core): Improve API --- .../java/concurrent/AdviceUtils.java | 4 ++-- .../AkkaExecutorInstrumentationTest.groovy | 8 +++---- .../TraceContinuedFutureCallback.java | 8 +++---- .../TraceContinuedFutureCallback.java | 8 +++---- .../HystrixThreadPoolInstrumentation.java | 10 ++++---- .../test/groovy/CompletableFutureTest.groovy | 4 ++-- .../src/test/groovy/VirtualThreadTest.groovy | 4 ++-- ...syncPropagatingDisableInstrumentation.java | 10 ++++---- .../ExecutorInstrumentationTest.groovy | 12 +++++----- .../NettyExecutorInstrumentationTest.groovy | 6 ++--- .../executor/RejectedExecutionTest.groovy | 8 +++---- .../JettyExecutorInstrumentationTest.groovy | 4 ++-- .../coroutines/CoreKotlinCoroutineTests.kt | 4 ++-- .../src/test/groovy/OpenTelemetryTest.groovy | 4 ++-- .../src/test/groovy/OpenTracing31Test.groovy | 12 +++++----- .../src/test/groovy/OpenTracing32Test.groovy | 12 +++++----- .../play23/RequestCompleteCallback.java | 4 ++-- .../play24/RequestCompleteCallback.java | 4 ++-- .../play26/RequestCompleteCallback.java | 4 ++-- .../playws1/AsyncHandlerWrapper.java | 6 ++--- .../playws21/AsyncHandlerWrapper.java | 6 ++--- .../playws2/AsyncHandlerWrapper.java | 6 ++--- .../ScalaExecutorInstrumentationTest.groovy | 6 ++--- .../test/groovy/ScalaPromiseTestBase.groovy | 4 ++-- .../servlet2/Servlet2Advice.java | 4 ++-- .../SpannedMethodInvocation.java | 4 ++-- .../java/datadog/trace/core/CoreTracer.java | 6 ++--- .../core/PendingTraceStrictWriteTest.groovy | 6 ++--- .../trace/core/PendingTraceTest.groovy | 4 ++-- .../core/scopemanager/ScopeManagerTest.groovy | 24 +++++++++---------- .../opentracing/OpenTracingAPITest.groovy | 16 ++++++------- .../instrumentation/api/AgentTracer.java | 24 +++++++++---------- 32 files changed, 123 insertions(+), 123 deletions(-) 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 dbf481ee4ba..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,7 +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.setAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -27,7 +27,7 @@ public static AgentScope startTaskScope(State state) { final AgentScope.Continuation continuation = state.getAndResetContinuation(); if (continuation != null) { final AgentScope scope = continuation.activate(); - 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 241a46bfb78..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,7 @@ import java.util.concurrent.RejectedExecutionException import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled /** * Test executor instrumentation for Akka specific classes. @@ -46,7 +46,7 @@ class AkkaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span m(pool, new AkkaAsyncChild()) // this child won't @@ -102,7 +102,7 @@ class AkkaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) // this child will have a span dispatcher.execute(new AkkaAsyncChild()) // this child won't @@ -133,7 +133,7 @@ class AkkaExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - 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 57ee3c6b6b1..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,6 +1,6 @@ package datadog.trace.instrumentation.apachehttpasyncclient; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.apachehttpasyncclient.ApacheHttpAsyncClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -40,7 +40,7 @@ public void completed(final T result) { completeDelegate(result); } else { try (final AgentScope scope = parentContinuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); completeDelegate(result); } } @@ -57,7 +57,7 @@ public void failed(final Exception ex) { failDelegate(ex); } else { try (final AgentScope scope = parentContinuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); failDelegate(ex); } } @@ -73,7 +73,7 @@ public void cancelled() { cancelDelegate(); } else { try (final AgentScope scope = parentContinuation.activate()) { - 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 7f98b7c86f9..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,6 +1,6 @@ package datadog.trace.instrumentation.apachehttpclient5; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.apachehttpclient5.ApacheHttpClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -43,7 +43,7 @@ public void completed(final T result) { completeDelegate(result); } else { try (final AgentScope scope = parentContinuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); completeDelegate(result); } } @@ -60,7 +60,7 @@ public void failed(final Exception ex) { failDelegate(ex); } else { try (final AgentScope scope = parentContinuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); failDelegate(ex); } } @@ -76,7 +76,7 @@ public void cancelled() { cancelDelegate(); } else { try (final AgentScope scope = parentContinuation.activate()) { - 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 3152b75fd57..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,8 +1,8 @@ package datadog.trace.instrumentation.hystrix; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.isAsyncPropagation; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -35,8 +35,8 @@ public static class EnableAsyncAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static boolean enableAsyncTracking() { - if (!isAsyncPropagation()) { - setAsyncPropagation(true); + if (!isAsyncPropagationEnabled()) { + setAsyncPropagationEnabled(true); return true; } return false; @@ -45,7 +45,7 @@ public static boolean enableAsyncTracking() { @Advice.OnMethodExit(suppress = Throwable.class) public static void disableAsyncTracking(@Advice.Enter final boolean wasEnabled) { if (wasEnabled) { - 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 0833d222d2b..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.setAsyncPropagation +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 { - 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 baf88910164..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.setAsyncPropagation +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() { - 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 c5c0f89ad67..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,8 +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.isAsyncPropagation; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -178,8 +178,8 @@ public static class DisableAsyncAdvice { @Advice.OnMethodEnter public static boolean before() { - if (isAsyncPropagation()) { - setAsyncPropagation(false); + if (isAsyncPropagationEnabled()) { + setAsyncPropagationEnabled(false); return true; } return false; @@ -188,7 +188,7 @@ public static boolean before() { @Advice.OnMethodExit(onThrowable = Throwable.class) public static void after(@Advice.Enter boolean wasDisabled) { if (wasDisabled) { - setAsyncPropagation(true); + 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 6ffc28c9e0e..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.setAsyncPropagation +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() { - 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() { - 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() { - 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() { - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) m(pool, w(child)) } }.run() @@ -406,7 +406,7 @@ abstract class ExecutorInstrumentationTest extends AgentTestRunner { @Override @Trace(operationName = "parent") void run() { - 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 522d3f70bd8..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.setAsyncPropagation +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() { - 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() { - 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 0b574ce9557..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.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class RejectedExecutionTest extends AgentTestRunner { @@ -193,7 +193,7 @@ class RejectedExecutionTest extends AgentTestRunner { when: runUnderTrace("parent") { - 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") { - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) pool.submit({}) } } @@ -261,7 +261,7 @@ class RejectedExecutionTest extends AgentTestRunner { return { runUnderTrace("parent") { - 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 95e4c7fb1d2..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.setAsyncPropagation +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() { - 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 85fde634249..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 @@ -4,7 +4,7 @@ import datadog.trace.api.Trace import datadog.trace.bootstrap.instrumentation.api.AgentSpan import datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan import datadog.trace.bootstrap.instrumentation.api.AgentTracer.get -import datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +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 { - setAsyncPropagation(asyncPropagation) + setAsyncPropagationEnabled(asyncPropagation) return runBlocking(jobName("test") + dispatcher, block = block) } } 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 6e66ba756a2..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,7 +19,7 @@ import io.opentelemetry.trace.Status import io.opentelemetry.trace.TracingContextUtils import spock.lang.Subject -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTelemetryTest extends AgentTestRunner { @Subject @@ -234,7 +234,7 @@ class OpenTelemetryTest extends AgentTestRunner { setup: def span = tracer.spanBuilder("some name").startSpan() TraceScope scope = tracer.withSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) expect: tracer.currentSpan.delegate == span.delegate 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 8ef332ad9e5..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 @@ -28,7 +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.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTracing31Test extends AgentTestRunner { @@ -158,22 +158,22 @@ class OpenTracing31Test extends AgentTestRunner { AgentTracer.TracerAPI internalTracer = tracer.tracer.tracer def span = tracer.buildSpan("some name").start() def scope = tracer.scopeManager().activate(span, finishSpan) - internalTracer.setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) expect: span instanceof MutableSpan scope instanceof TraceScope - !internalTracer.isAsyncPropagation() + !internalTracer.isAsyncPropagationEnabled() (scope as TraceScope).capture() == null (tracer.scopeManager().active().span().delegate == span.delegate) when: - internalTracer.setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) def continuation = (scope as TraceScope).capture() continuation.cancel() then: - internalTracer.isAsyncPropagation() + internalTracer.isAsyncPropagationEnabled() continuation instanceof TraceScope.Continuation when: "attempting to close the span this way doesn't work because we lost the 'finishSpan' reference" @@ -218,7 +218,7 @@ class OpenTracing31Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() TraceScope scope = tracer.scopeManager().activate(span, false) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) expect: tracer.activeSpan().delegate == span.delegate 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 9c36fff6e12..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 @@ -33,7 +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.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class OpenTracing32Test extends AgentTestRunner { @@ -168,22 +168,22 @@ class OpenTracing32Test extends AgentTestRunner { AgentTracer.TracerAPI internalTracer = tracer.tracer.tracer def span = tracer.buildSpan("some name").start() def scope = tracer.scopeManager().activate(span, finishSpan) - internalTracer.setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) expect: span instanceof MutableSpan scope instanceof TraceScope - !internalTracer.isAsyncPropagation() + !internalTracer.isAsyncPropagationEnabled() (scope as TraceScope).capture() == null (tracer.scopeManager().active().span().delegate == span.delegate) when: - internalTracer.setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) def continuation = (scope as TraceScope).capture() continuation.cancel() then: - internalTracer.isAsyncPropagation() + internalTracer.isAsyncPropagationEnabled() continuation instanceof TraceScope.Continuation when: "attempting to close the span this way doesn't work because we lost the 'finishSpan' reference" @@ -233,7 +233,7 @@ class OpenTracing32Test extends AgentTestRunner { setup: def span = tracer.buildSpan("some name").start() TraceScope scope = tracer.scopeManager().activate(span, false) - 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 0724194068f..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,6 +1,6 @@ package datadog.trace.instrumentation.play23; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -30,7 +30,7 @@ public Object apply(final Try result) { } } DECORATE.beforeFinish(span); - 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 8e5b2a98392..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,6 +1,6 @@ package datadog.trace.instrumentation.play24; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -29,7 +29,7 @@ public Object apply(final Try result) { } } DECORATE.beforeFinish(span); - 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 0f221425eec..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,6 +1,6 @@ package datadog.trace.instrumentation.play26; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -31,7 +31,7 @@ public Object apply(final Try result) { } } DECORATE.beforeFinish(span); - 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 c55c74dfb03..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,7 +1,7 @@ package datadog.trace.instrumentation.playws1; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -55,7 +55,7 @@ public Object onCompleted() throws Exception { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return delegate.onCompleted(); } } else { @@ -71,7 +71,7 @@ public void onThrowable(final Throwable throwable) { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - 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 b6dccbab67b..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,7 +1,7 @@ package datadog.trace.instrumentation.playws21; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled; import static datadog.trace.instrumentation.playws.PlayWSClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentScope; @@ -60,7 +60,7 @@ public Object onCompleted() throws Exception { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return delegate.onCompleted(); } } else { @@ -76,7 +76,7 @@ public void onThrowable(final Throwable throwable) { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - 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 7c898147113..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,7 +1,7 @@ package datadog.trace.instrumentation.playws2; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.capture; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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 +59,7 @@ public Object onCompleted() throws Exception { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return delegate.onCompleted(); } } else { @@ -75,7 +75,7 @@ public void onThrowable(final Throwable throwable) { if (continuation != null) { try (final AgentScope scope = continuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); delegate.onThrowable(throwable); } } else { 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 e193f842146..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.setAsyncPropagation +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() { - 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() { - 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 ee6ce655f35..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 @@ -7,7 +7,7 @@ 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.activeSpan -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +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") { - 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 4ca84476014..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,7 +1,7 @@ package datadog.trace.instrumentation.servlet2; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -119,7 +119,7 @@ public static void stopSpan( } DECORATE.beforeFinish(span); - 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 e4ef7152958..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,7 +1,7 @@ package datadog.trace.instrumentation.springscheduling; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation; +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; @@ -39,7 +39,7 @@ public Object proceed() throws Throwable { private Object invokeWithContinuation(CharSequence spanName) throws Throwable { try (AgentScope scope = continuation.activate()) { - setAsyncPropagation(true); + setAsyncPropagationEnabled(true); return invokeWithSpan(spanName); } } 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 dc28f725f7b..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 @@ -920,16 +920,16 @@ public AgentScope.Continuation captureSpan(final AgentSpan span) { } @Override - public boolean isAsyncPropagation() { + public boolean isAsyncPropagationEnabled() { AgentScope activeScope = this.scopeManager.active(); return activeScope != null && activeScope.isAsyncPropagating(); } @Override - public void setAsyncPropagation(boolean asyncPropagation) { + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { AgentScope activeScope = this.scopeManager.active(); if (activeScope != null) { - activeScope.setAsyncPropagation(asyncPropagation); + activeScope.setAsyncPropagation(asyncPropagationEnabled); } } 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 a0be28b359e..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,13 +1,13 @@ package datadog.trace.core -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +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) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = scope.capture() scope.close() rootSpan.finish() @@ -39,7 +39,7 @@ class PendingTraceStrictWriteTest extends PendingTraceTestBase { def "negative reference count throws an exception"() { when: def scope = tracer.activateSpan(rootSpan) - 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 5a494efc4fa..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,7 +10,7 @@ import spock.lang.Timeout import java.util.concurrent.TimeUnit -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled class PendingTraceTest extends PendingTraceTestBase { @@ -51,7 +51,7 @@ class PendingTraceTest extends PendingTraceTestBase { def "trace is still reported when unfinished continuation discarded"() { when: def scope = tracer.activateSpan(rootSpan) - 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 1c05322fc81..00dca269739 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 @@ -27,7 +27,7 @@ import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagation +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled import static datadog.trace.core.scopemanager.EVENT.ACTIVATE import static datadog.trace.core.scopemanager.EVENT.CLOSE import static datadog.trace.test.util.GCUtils.awaitGC @@ -254,14 +254,14 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test", "test").start() def scope = tracer.activateSpan(span) - tracer.setAsyncPropagation(false) + tracer.setAsyncPropagationEnabled(false) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: continuation == null when: - tracer.setAsyncPropagation(true) + tracer.setAsyncPropagationEnabled(true) continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -278,7 +278,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -299,7 +299,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scopeRef = new AtomicReference(tracer.activateSpan(span)) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrent ? scopeRef.get().captureConcurrent() : scopeRef.get().capture() then: @@ -330,7 +330,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -367,7 +367,7 @@ class ScopeManagerTest extends DDCoreSpecification { def parentScope = tracer.activateSpan(parentSpan) def childSpan = tracer.buildSpan("child").start() def childScope = tracer.activateSpan(childSpan) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrentChild ? childScope.captureConcurrent() : childScope.capture() childScope.close() @@ -434,7 +434,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: "creating and activating a continuation" def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -726,7 +726,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -814,7 +814,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -841,7 +841,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: "completing another async scope lifecycle" def span2 = tracer.buildSpan("test").start() def scope2 = tracer.activateSpan(span2) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) def continuation2 = concurrent ? scope2.captureConcurrent() : scope2.capture() then: @@ -879,7 +879,7 @@ class ScopeManagerTest extends DDCoreSpecification { def span = tracer.buildSpan("test").start() def start = System.nanoTime() def scope = (ContinuableScope) tracer.activateSpan(span) - setAsyncPropagation(true) + setAsyncPropagationEnabled(true) continuation = scope.captureConcurrent() scope.close() span.finish() 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 77515502717..7d4ccfb0761 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/OpenTracingAPITest.groovy @@ -229,18 +229,18 @@ class OpenTracingAPITest extends DDSpecification { Scope scope = tracer.buildSpan("someOperation") .withTag(DDTags.SERVICE_NAME, "someService") .startActive(true) - internalTracer.setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) then: scope instanceof TraceScope - !internalTracer.isAsyncPropagation() + !internalTracer.isAsyncPropagationEnabled() when: - internalTracer.setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) TraceScope.Continuation continuation = ((TraceScope) scope).capture() then: - internalTracer.isAsyncPropagation() + internalTracer.isAsyncPropagationEnabled() continuation != null when: @@ -273,19 +273,19 @@ class OpenTracingAPITest extends DDSpecification { Scope outer = tracer.buildSpan("someOperation") .withTag(DDTags.SERVICE_NAME, "someService") .startActive(true) - internalTracer.setAsyncPropagation(false) + internalTracer.setAsyncPropagationEnabled(false) then: - !internalTracer.isAsyncPropagation() + !internalTracer.isAsyncPropagationEnabled() when: - internalTracer.setAsyncPropagation(true) + internalTracer.setAsyncPropagationEnabled(true) Scope inner = tracer.buildSpan("otherOperation") .withTag(DDTags.SERVICE_NAME, "otherService") .startActive(true) then: - internalTracer.isAsyncPropagation() + internalTracer.isAsyncPropagationEnabled() when: inner.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 c785be7a615..cdca0e3da38 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 @@ -144,8 +144,8 @@ public static AgentScope.Continuation capture() { * Checks whether the asynchronous propagation is enabled, meaning this context will propagate * across asynchronous boundaries. */ - public static boolean isAsyncPropagation() { - return get().isAsyncPropagation(); + public static boolean isAsyncPropagationEnabled() { + return get().isAsyncPropagationEnabled(); } /** @@ -153,11 +153,11 @@ public static boolean isAsyncPropagation() { * *

Asynchronous propagation is disabled by default. * - * @param asyncPropagation @{@code true} to enable asynchronous propagation, {@code false} to - * disable it. + * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code false} + * to disable it. */ - public static void setAsyncPropagation(boolean asyncPropagation) { - get().setAsyncPropagation(asyncPropagation); + public static void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) { + get().setAsyncPropagationEnabled(asyncPropagationEnabled); } public static AgentPropagation propagate() { @@ -254,17 +254,17 @@ AgentSpan startSpan( * Checks whether the asynchronous propagation is enabled, meaning this context will propagate * across asynchronous boundaries. */ - boolean isAsyncPropagation(); + boolean isAsyncPropagationEnabled(); /** * Enables or disables asynchronous propagation for the active span. * *

Asynchronous propagation is disabled by default. * - * @param asyncPropagation @{@code true} to enable asynchronous propagation, {@code false} to - * disable it. + * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code + * false} to disable it. */ - void setAsyncPropagation(boolean asyncPropagation); + void setAsyncPropagationEnabled(boolean asyncPropagationEnabled); void closePrevious(boolean finishSpan); @@ -408,12 +408,12 @@ public AgentScope.Continuation captureSpan(final AgentSpan span) { } @Override - public boolean isAsyncPropagation() { + public boolean isAsyncPropagationEnabled() { return false; } @Override - public void setAsyncPropagation(boolean asyncPropagation) {} + public void setAsyncPropagationEnabled(boolean asyncPropagationEnabled) {} @Override public void closePrevious(final boolean finishSpan) {} From 640cc3de633f13f23e4b2289caa2618196ca2a85 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 16 Jan 2025 17:43:24 +0100 Subject: [PATCH 5/9] feat(api): Document old API deprecation --- dd-trace-api/build.gradle | 2 ++ .../datadog/trace/context/TraceScope.java | 20 +++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/dd-trace-api/build.gradle b/dd-trace-api/build.gradle index 22a588db3ba..eb9a00e37b7 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.*', + 'datadog.trace.context.TraceScope', + // Default fallback methods to not break legacy API 'datadog.trace.context.NoopTraceScope.NoopContinuation', 'datadog.trace.context.NoopTraceScope', 'datadog.trace.payloadtags.PayloadTagsData', 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 313060528cf..df09cf01184 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 @@ -29,23 +29,21 @@ public interface TraceScope extends Closeable { @Override void close(); - /** If true, this context will propagate across async boundaries. */ + /** + * Deprecated. Use TracerAPI.isAsyncPropagationEnabled() instead. Will always return {@code false} + */ + @Deprecated default boolean isAsyncPropagating() { - // TODO Deprecate and document the new method - // TODO Check expected behavior, returning false seems better - throw new UnsupportedOperationException(); + return false; } /** - * Enable or disable async propagation. Async propagation is initially set to false. + * Deprecated. Use TracerAPI.setAsyncPropagationEnabled(boolean) instead. Will do nothing. * - * @param value The new propagation value. True == propagate. False == don't propagate. + * @param value ignored. */ - default void setAsyncPropagation(boolean value) { - // TODO Deprecate and document the new method - // TODO Check expected behavior, doing nothing seems better - throw new UnsupportedOperationException(); - } + @Deprecated + default void setAsyncPropagation(boolean value) {} /** * Used to pass async context between workers. A trace will not be reported until all spans and From 6254b700f98022b5a50ccdf46046176a928f276c Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 21 Jan 2025 13:41:22 +0100 Subject: [PATCH 6/9] feat(core): Move async propagation API from scope to tracer --- .../java/datadog/trace/api/GlobalTracer.java | 8 ++++++ .../main/java/datadog/trace/api/Tracer.java | 19 ++++++++++++++ .../datadog/trace/context/TraceScope.java | 21 ++++++++++----- .../java/datadog/opentracing/DDTracer.java | 10 +++++++ .../instrumentation/api/AgentTracer.java | 26 +++++-------------- 5 files changed, 59 insertions(+), 25 deletions(-) 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..58603b3d2d8 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,25 @@ public interface Tracer { */ String getSpanId(); + /** + * 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. + */ + boolean 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. + */ + 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/TraceScope.java b/dd-trace-api/src/main/java/datadog/trace/context/TraceScope.java index df09cf01184..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. */ @@ -30,20 +32,27 @@ public interface TraceScope extends Closeable { void close(); /** - * Deprecated. Use TracerAPI.isAsyncPropagationEnabled() instead. Will always return {@code false} + * @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 false; + return GlobalTracer.get().isAsyncPropagationEnabled(); } /** - * Deprecated. Use TracerAPI.setAsyncPropagationEnabled(boolean) instead. Will do nothing. - * - * @param value ignored. + * @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) {} + 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-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/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 cdca0e3da38..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; @@ -141,8 +142,10 @@ public static AgentScope.Continuation capture() { } /** - * Checks whether the asynchronous propagation is enabled, meaning this context will propagate - * across asynchronous boundaries. + * 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(); @@ -151,7 +154,8 @@ public static boolean isAsyncPropagationEnabled() { /** * Enables or disables asynchronous propagation for the active span. * - *

Asynchronous propagation is disabled by default. + *

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. @@ -250,22 +254,6 @@ AgentSpan startSpan( AgentScope.Continuation captureSpan(AgentSpan span); - /** - * Checks whether the asynchronous propagation is enabled, meaning this context will propagate - * across asynchronous boundaries. - */ - boolean isAsyncPropagationEnabled(); - - /** - * Enables or disables asynchronous propagation for the active span. - * - *

Asynchronous propagation is disabled by default. - * - * @param asyncPropagationEnabled @{@code true} to enable asynchronous propagation, {@code - * false} to disable it. - */ - void setAsyncPropagationEnabled(boolean asyncPropagationEnabled); - void closePrevious(boolean finishSpan); AgentScope activateNext(AgentSpan span); From 4bd127f321aa8d8314bfae9d9f146b40cef9c724 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 21 Jan 2025 14:12:07 +0100 Subject: [PATCH 7/9] feat(core): Move async propagation API from scope to tracer --- dd-trace-api/build.gradle | 2 +- .../main/java/datadog/trace/api/Tracer.java | 4 ++++ .../core/scopemanager/ScopeManagerTest.groovy | 18 +++++++++--------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/dd-trace-api/build.gradle b/dd-trace-api/build.gradle index eb9a00e37b7..7c25ddeb164 100644 --- a/dd-trace-api/build.gradle +++ b/dd-trace-api/build.gradle @@ -36,8 +36,8 @@ excludedClassesCoverage += [ 'datadog.trace.api.experimental.DataStreamsContextCarrier', 'datadog.trace.api.experimental.DataStreamsContextCarrier.NoOp', 'datadog.appsec.api.blocking.*', - 'datadog.trace.context.TraceScope', // 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/Tracer.java b/dd-trace-api/src/main/java/datadog/trace/api/Tracer.java index 58603b3d2d8..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 @@ -18,8 +18,10 @@ public interface Tracer { * 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(); /** @@ -28,9 +30,11 @@ public interface Tracer { *

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); /** 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 00dca269739..6e8c1e06e6f 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 @@ -278,7 +278,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -299,7 +299,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scopeRef = new AtomicReference(tracer.activateSpan(span)) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scopeRef.get().captureConcurrent() : scopeRef.get().capture() then: @@ -330,7 +330,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() then: @@ -367,7 +367,7 @@ class ScopeManagerTest extends DDCoreSpecification { def parentScope = tracer.activateSpan(parentSpan) def childSpan = tracer.buildSpan("child").start() def childScope = tracer.activateSpan(childSpan) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrentChild ? childScope.captureConcurrent() : childScope.capture() childScope.close() @@ -434,7 +434,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: "creating and activating a continuation" def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -726,7 +726,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -814,7 +814,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: def span = tracer.buildSpan("test").start() def scope = tracer.activateSpan(span) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() scope.close() span.finish() @@ -841,7 +841,7 @@ class ScopeManagerTest extends DDCoreSpecification { when: "completing another async scope lifecycle" def span2 = tracer.buildSpan("test").start() def scope2 = tracer.activateSpan(span2) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) def continuation2 = concurrent ? scope2.captureConcurrent() : scope2.capture() then: @@ -879,7 +879,7 @@ class ScopeManagerTest extends DDCoreSpecification { def span = tracer.buildSpan("test").start() def start = System.nanoTime() def scope = (ContinuableScope) tracer.activateSpan(span) - setAsyncPropagationEnabled(true) + tracer.setAsyncPropagationEnabled(true) continuation = scope.captureConcurrent() scope.close() span.finish() From ae013ac2ce6ca674442f31156c4deacf9935c6ab Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 21 Jan 2025 14:14:29 +0100 Subject: [PATCH 8/9] fix(core): Fix buildSpan deprecated use --- .../core/scopemanager/ScopeManagerTest.groovy | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) 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 6e8c1e06e6f..a854e71534f 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 @@ -276,7 +276,7 @@ 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) tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() @@ -297,7 +297,7 @@ 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)) tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scopeRef.get().captureConcurrent() : scopeRef.get().capture() @@ -328,7 +328,7 @@ 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) tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() @@ -363,9 +363,9 @@ 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) tracer.setAsyncPropagationEnabled(true) @@ -432,7 +432,7 @@ 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) tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() @@ -452,7 +452,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() @@ -476,7 +476,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: @@ -510,7 +510,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: @@ -518,7 +518,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: @@ -542,10 +542,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() @@ -582,7 +582,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: @@ -597,7 +597,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: @@ -610,7 +610,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: @@ -672,7 +672,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) @@ -687,7 +687,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 * _ @@ -724,7 +724,7 @@ 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) tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() @@ -741,7 +741,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: @@ -772,7 +772,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() @@ -787,7 +787,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: @@ -812,7 +812,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) tracer.setAsyncPropagationEnabled(true) def continuation = concurrent ? scope.captureConcurrent() : scope.capture() @@ -839,7 +839,7 @@ 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) tracer.setAsyncPropagationEnabled(true) def continuation2 = concurrent ? scope2.captureConcurrent() : scope2.capture() @@ -876,7 +876,7 @@ 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) tracer.setAsyncPropagationEnabled(true) @@ -918,7 +918,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) @@ -948,7 +948,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) @@ -1001,7 +1001,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: @@ -1009,7 +1009,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: @@ -1054,12 +1054,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) From 92e1a55c31cbb464255cbcfe68e460d47ab29948 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 21 Jan 2025 14:17:02 +0100 Subject: [PATCH 9/9] feat(core): Move async propagation API from scope to tracer --- .../datadog/trace/core/scopemanager/ScopeManagerTest.groovy | 1 - 1 file changed, 1 deletion(-) 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 a854e71534f..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 @@ -27,7 +27,6 @@ import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.setAsyncPropagationEnabled import static datadog.trace.core.scopemanager.EVENT.ACTIVATE import static datadog.trace.core.scopemanager.EVENT.CLOSE import static datadog.trace.test.util.GCUtils.awaitGC