diff --git a/dd-java-agent/agent-debugger/debugger-el/build.gradle b/dd-java-agent/agent-debugger/debugger-el/build.gradle index fe2653ca9ab..ff9d5d44187 100644 --- a/dd-java-agent/agent-debugger/debugger-el/build.gradle +++ b/dd-java-agent/agent-debugger/debugger-el/build.gradle @@ -12,7 +12,8 @@ excludedClassesCoverage += [ 'com.datadog.debugger.el.Script*', 'com.datadog.debugger.el.ValueScript*', 'com.datadog.debugger.el.values.CollectionValue*', - 'com.datadog.debugger.el.InvalidValueException' + 'com.datadog.debugger.el.InvalidValueException', + 'com.datadog.debugger.el.EvaluationException' ] dependencies { diff --git a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/EvaluationException.java b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/EvaluationException.java index 4cb9cdb555b..06b09b8e25f 100644 --- a/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/EvaluationException.java +++ b/dd-java-agent/agent-debugger/debugger-el/src/main/java/com/datadog/debugger/el/EvaluationException.java @@ -1,5 +1,7 @@ package com.datadog.debugger.el; +import java.util.Objects; + public class EvaluationException extends RuntimeException { private final String expr; @@ -16,4 +18,22 @@ public EvaluationException(String message, String expr, Throwable cause) { public String getExpr() { return expr; } + + @Override + public final boolean equals(Object o) { + if (!(o instanceof EvaluationException)) { + return false; + } + + EvaluationException that = (EvaluationException) o; + return Objects.equals(getExpr(), that.getExpr()) + && Objects.equals(getMessage(), that.getMessage()); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(getExpr()); + result = 31 * result + Objects.hashCode(getMessage()); + return result; + } } diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java index 0a35c845efa..8cc150d980e 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/agent/DebuggerTransformer.java @@ -634,7 +634,10 @@ private List filterAndSortDefinitions( // Log and span decoration probe shared the same instrumentor: CaptureContextInstrumentor // and therefore need to be instrumented once // note: exception probes are log probes and are handled the same way - if (isCapturedContextProbe(definition)) { + if (!Config.get().isDistributedDebuggerEnabled() && definition instanceof TriggerProbe) { + log.debug( + "The distributed debugger feature is disabled. Trigger probes will not be installed."); + } else if (isCapturedContextProbe(definition)) { if (definition.isLineProbe()) { capturedContextLineProbes .computeIfAbsent(definition.getWhere(), key -> new ArrayList<>()) diff --git a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/TriggerProbe.java b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/TriggerProbe.java index e29e691459e..b4dd186dabf 100644 --- a/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/TriggerProbe.java +++ b/dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/probe/TriggerProbe.java @@ -59,10 +59,6 @@ public InstrumentationResult.Status instrument( .instrument(); } - public String getSessionId() { - return sessionId; - } - public TriggerProbe setSessionId(String sessionId) { this.sessionId = sessionId; return this; @@ -86,6 +82,7 @@ public TriggerProbe setProbeCondition(ProbeCondition probeCondition) { public void evaluate( CapturedContext context, CapturedContext.Status status, MethodLocation location) { + Sampling sampling = getSampling(); if (sampling == null || !sampling.inCoolDown()) { boolean sample = true; if (!hasCondition()) { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java index 2651a729859..367080a068d 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/trigger/TriggerProbeTest.java @@ -5,11 +5,14 @@ import static java.lang.String.format; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.verify; import static utils.InstrumentationTestHelper.compileAndLoadClass; import com.datadog.debugger.agent.CapturingTestBase; import com.datadog.debugger.agent.Configuration; import com.datadog.debugger.agent.MockSampler; +import com.datadog.debugger.el.EvaluationException; import com.datadog.debugger.el.ProbeCondition; import com.datadog.debugger.probe.Sampling; import com.datadog.debugger.probe.TriggerProbe; @@ -50,6 +53,53 @@ public void before() { setFieldInConfig(Config.get(), "debuggerCodeOriginEnabled", true); setFieldInConfig(InstrumenterConfig.get(), "codeOriginEnabled", true); + setFieldInConfig(Config.get(), "distributedDebuggerEnabled", true); + } + + @Test + public void conditions() throws IOException, URISyntaxException { + final String className = "com.datadog.debugger.TriggerProbe02"; + TriggerProbe probe1 = + createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "(int)", + new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), + new Sampling(10.0)); + installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); + Class testClass = compileAndLoadClass(className); + for (int i = 0; i < 100; i++) { + Reflect.onClass(testClass).call("main", i).get(); + } + List> allTraces = traceInterceptor.getAllTraces(); + long count = + allTraces.stream() + .map(span -> span.get(0)) + .filter( + span -> { + DDSpan ddSpan = (DDSpan) span; + PropagationTags tags = ddSpan.context().getPropagationTags(); + return (TRIGGER_PROBE_SESSION_ID + ":1").equals(tags.getDebugPropagation()); + }) + .count(); + assertEquals(100, allTraces.size(), "actual traces: " + allTraces.size()); + assertTrue(count <= 25, "Should have at most 25 debug sessions. found: " + count); + } + + private static TriggerProbe createTriggerProbe( + ProbeId id, + String sessionId, + String typeName, + String methodName, + String signature, + ProbeCondition probeCondition, + Sampling sampling) { + return new TriggerProbe(id, Where.of(typeName, methodName, signature)) + .setSessionId(sessionId) + .setProbeCondition(probeCondition) + .setSampling(sampling); } @Test @@ -104,6 +154,58 @@ public void cooldown() throws IOException, URISyntaxException { } } + @Test + public void badCondition() throws IOException, URISyntaxException { + String className = "com.datadog.debugger.TriggerProbe02"; + TriggerProbe probe1 = + createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "(int)", + new ProbeCondition(when(lt(ref("limit"), value(25))), "limit < 25"), + new Sampling(10.0)); + + installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); + Class testClass = compileAndLoadClass(className); + Reflect.onClass(testClass).call("main", 0).get(); + verify(probeStatusSink) + .addError( + eq(TRIGGER_PROBE_ID1), + eq(new EvaluationException("Cannot find symbol: limit", "limit"))); + } + + @Test + public void debuggerDisabled() throws IOException, URISyntaxException { + boolean original = Config.get().isDistributedDebuggerEnabled(); + try { + setFieldInConfig(Config.get(), "distributedDebuggerEnabled", false); + + MockSampler sampler = new MockSampler(); + ProbeRateLimiter.setSamplerSupplier(value -> sampler); + + final String className = "com.datadog.debugger.TriggerProbe02"; + TriggerProbe probe1 = + createTriggerProbe( + TRIGGER_PROBE_ID1, + TRIGGER_PROBE_SESSION_ID, + className, + "entry", + "(int)", + new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), + new Sampling(10.0)); + installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); + Class testClass = compileAndLoadClass(className); + Reflect.onClass(testClass).call("main", 0).get(); + + assertEquals(0, sampler.getCallCount()); + } finally { + setFieldInConfig(Config.get(), "distributedDebuggerEnabled", original); + ProbeRateLimiter.setSamplerSupplier(null); + } + } + @Test public void sampling() throws IOException, URISyntaxException { try { @@ -134,49 +236,25 @@ public void sampling() throws IOException, URISyntaxException { } @Test - public void conditions() throws IOException, URISyntaxException { + public void noSampling() throws IOException, URISyntaxException { + try { + MockSampler sampler = new MockSampler(); + ProbeRateLimiter.setSamplerSupplier(value -> sampler); - final String className = "com.datadog.debugger.TriggerProbe02"; - TriggerProbe probe1 = - createTriggerProbe( - TRIGGER_PROBE_ID1, - TRIGGER_PROBE_SESSION_ID, - className, - "entry", - "(int)", - new ProbeCondition(when(lt(ref("value"), value(25))), "value < 25"), - new Sampling(10.0)); - installProbes(Configuration.builder().setService(SERVICE_NAME).add(probe1).build()); - Class testClass = compileAndLoadClass(className); - for (int i = 0; i < 100; i++) { - Reflect.onClass(testClass).call("main", i).get(); - } - List> allTraces = traceInterceptor.getAllTraces(); - long count = - allTraces.stream() - .map(span -> span.get(0)) - .filter( - span -> { - DDSpan ddSpan = (DDSpan) span; - PropagationTags tags = ddSpan.context().getPropagationTags(); - return (TRIGGER_PROBE_SESSION_ID + ":1").equals(tags.getDebugPropagation()); - }) - .count(); - assertEquals(100, allTraces.size(), "actual traces: " + allTraces.size()); - assertTrue(count <= 25, "Should have at most 25 debug sessions. found: " + count); - } + final String className = "com.datadog.debugger.TriggerProbe01"; + TriggerProbe probe1 = + createTriggerProbe( + TRIGGER_PROBE_ID1, TRIGGER_PROBE_SESSION_ID, className, "entry", "()", null, null); + Configuration config = Configuration.builder().setService(SERVICE_NAME).add(probe1).build(); + installProbes(config); + Class testClass = compileAndLoadClass(className); + for (int i = 0; i < 100; i++) { + Reflect.onClass(testClass).call("main", "").get(); + } - public static TriggerProbe createTriggerProbe( - ProbeId id, - String sessionId, - String typeName, - String methodName, - String signature, - ProbeCondition probeCondition, - Sampling sampling) { - return new TriggerProbe(id, Where.of(typeName, methodName, signature)) - .setSessionId(sessionId) - .setProbeCondition(probeCondition) - .setSampling(sampling); + assertTrue(sampler.getCallCount() != 0); + } finally { + ProbeRateLimiter.setSamplerSupplier(null); + } } } diff --git a/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseCoreInstrumentation.java b/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseCoreInstrumentation.java index 329c49ac797..4d60aff4a08 100644 --- a/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseCoreInstrumentation.java +++ b/dd-java-agent/instrumentation/couchbase/couchbase-2.6/src/main/java/datadog/trace/instrumentation/couchbase/client/CouchbaseCoreInstrumentation.java @@ -1,7 +1,7 @@ package datadog.trace.instrumentation.couchbase.client; 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.activeSpan; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; @@ -13,7 +13,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.ContextStore; import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -52,18 +51,15 @@ public static class CouchbaseCoreAdvice { @Advice.OnMethodExit(suppress = Throwable.class) public static void addOperationIdToSpan(@Advice.Argument(0) final CouchbaseRequest request) { - final AgentScope scope = activeScope(); - if (scope != null) { - // The scope from the initial rxJava subscribe is not available to the networking layer + final AgentSpan span = activeSpan(); + if (span != null) { + // The context from the initial rxJava subscribe is not available to the networking layer // To transfer the span, the span is added to the context store final ContextStore contextStore = InstrumentationContext.get(CouchbaseRequest.class, AgentSpan.class); - AgentSpan span = contextStore.get(request); - - if (span == null) { - span = scope.span(); + if (contextStore.get(request) == null) { contextStore.put(request, span); if (request.operationId() != null) { diff --git a/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberInstrumentation.java b/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberInstrumentation.java index de6abe07396..e9315bde090 100644 --- a/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberInstrumentation.java +++ b/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberInstrumentation.java @@ -8,6 +8,7 @@ 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 io.cucumber.core.backend.StepDefinition; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -46,14 +47,14 @@ public void methodAdvice(MethodTransformer transformer) { public static class CucumberAdvice { @Advice.OnMethodEnter - public static void onCucumberStepStart( + public static AgentScope onCucumberStepStart( @Advice.This StepDefinition step, @Advice.Argument(0) Object[] arguments) { - CucumberStepDecorator.DECORATE.onStepStart(step, arguments); + return CucumberStepDecorator.DECORATE.onStepStart(step, arguments); } @Advice.OnMethodExit - public static void onCucumberStepFinish(@Advice.This StepDefinition step) { - CucumberStepDecorator.DECORATE.onStepFinish(step); + public static void onCucumberStepFinish(@Advice.Enter AgentScope scope) { + CucumberStepDecorator.DECORATE.onStepFinish(scope); } // Cucumber 5.0.0 and above diff --git a/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberStepDecorator.java b/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberStepDecorator.java index f86396da4f6..4e5ac4401af 100644 --- a/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberStepDecorator.java +++ b/dd-java-agent/instrumentation/cucumber/src/main/java/datadog/trace/instrumentation/cucumber/CucumberStepDecorator.java @@ -26,9 +26,8 @@ protected CharSequence component() { return "cucumber"; } - public void onStepStart(StepDefinition step, Object[] arguments) { + public AgentScope onStepStart(StepDefinition step, Object[] arguments) { AgentSpan span = AgentTracer.startSpan("cucumber", "cucumber.step"); - AgentScope scope = AgentTracer.activateSpan(span); afterStart(span); span.setResourceName(step.getPattern()); @@ -38,20 +37,14 @@ public void onStepStart(StepDefinition step, Object[] arguments) { if (arguments != null && arguments.length > 0) { span.setTag("step.arguments", Arrays.toString(arguments)); } - } - - public void onStepFinish(StepDefinition step) { - AgentSpan span = AgentTracer.activeSpan(); - if (span == null) { - return; - } - AgentScope scope = AgentTracer.activeScope(); - if (scope != null) { - scope.close(); - } + return AgentTracer.activateSpan(span); + } + public void onStepFinish(AgentScope scope) { + AgentSpan span = scope.span(); beforeFinish(span); span.finish(); + scope.close(); } } diff --git a/dd-java-agent/instrumentation/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java b/dd-java-agent/instrumentation/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java index 858679520fb..33567a42048 100644 --- a/dd-java-agent/instrumentation/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java +++ b/dd-java-agent/instrumentation/enable-wallclock-profiling/src/main/java/datadog/trace/instrumentation/wallclock/EnableWallclockProfilingInstrumentation.java @@ -14,7 +14,7 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.InstrumenterConfig; import datadog.trace.bootstrap.config.provider.ConfigProvider; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import java.util.Arrays; import net.bytebuddy.asm.Advice; @@ -86,8 +86,8 @@ public static final class EnableWallclockSampling { @Advice.OnMethodEnter(suppress = Throwable.class) public static boolean before() { - AgentScope active = AgentTracer.activeScope(); - if (active == null) { + AgentSpan span = AgentTracer.activeSpan(); + if (span == null) { AgentTracer.get().getProfilingContext().onAttach(); return true; } diff --git a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java index ba2c01b6991..f834521a8f8 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java +++ b/dd-java-agent/instrumentation/grpc-1.5/src/main/java/datadog/trace/instrumentation/grpc/client/ClientStreamListenerImplInstrumentation.java @@ -3,7 +3,7 @@ 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.activateSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.instrumentation.grpc.client.GrpcClientDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -66,9 +66,8 @@ public static final class Construct { @Advice.OnMethodExit public static void capture(@Advice.This ClientStreamListener listener) { // instrumentation of ClientCallImpl::start ensures this scope is present and valid - AgentScope scope = activeScope(); - if (null != scope) { - AgentSpan span = scope.span(); + AgentSpan span = activeSpan(); + if (null != span) { InstrumentationContext.get(ClientStreamListener.class, AgentSpan.class).put(listener, span); } } diff --git a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionConnectFirstTest.groovy b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionConnectFirstTest.groovy index 33d690c5719..1f21f93517c 100644 --- a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionConnectFirstTest.groovy +++ b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionConnectFirstTest.groovy @@ -1,7 +1,7 @@ import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions import spock.lang.Timeout -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan @Timeout(5) class HttpUrlConnectionConnectFirstTest extends HttpUrlConnectionTest implements TestingGenericHttpNamingConventions.ClientV0{ @@ -15,7 +15,7 @@ class HttpUrlConnectionConnectFirstTest extends HttpUrlConnectionTest implements connection.setRequestProperty("Connection", "close") connection.connectTimeout = CONNECT_TIMEOUT_MS connection.readTimeout = READ_TIMEOUT_MS - def parentSpan = activeScope() + def parentSpan = activeSpan() connection.connect() // test connect before getting stream def stream try { @@ -24,7 +24,7 @@ class HttpUrlConnectionConnectFirstTest extends HttpUrlConnectionTest implements stream = connection.errorStream ex.printStackTrace() } - assert activeScope() == parentSpan + assert activeSpan() == parentSpan stream?.readLines() stream?.close() callback?.call() diff --git a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionTest.groovy b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionTest.groovy index 88b88238e2e..85203268014 100644 --- a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionTest.groovy +++ b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionTest.groovy @@ -10,7 +10,7 @@ import sun.net.www.protocol.https.HttpsURLConnectionImpl import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.api.config.TraceInstrumentationConfig.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan @Timeout(5) abstract class HttpUrlConnectionTest extends HttpClientTest { @@ -28,7 +28,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { connection.useCaches = true connection.connectTimeout = CONNECT_TIMEOUT_MS connection.readTimeout = READ_TIMEOUT_MS - def parentSpan = activeScope() + def parentSpan = activeSpan() def stream try { stream = connection.inputStream @@ -36,7 +36,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { stream = connection.errorStream ex.printStackTrace() } - assert activeScope() == parentSpan + assert activeSpan() == parentSpan stream?.readLines() stream?.close() callback?.call() @@ -66,7 +66,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { runUnderTrace("someTrace") { HttpURLConnection connection = url.openConnection() connection.useCaches = useCaches - assert activeScope() != null + assert activeSpan() != null def stream = connection.inputStream def lines = stream.readLines() stream.close() @@ -76,7 +76,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { // call again to ensure the cycling is ok connection = url.openConnection() connection.useCaches = useCaches - assert activeScope() != null + assert activeSpan() != null assert connection.getResponseCode() == STATUS // call before input stream to test alternate behavior connection.inputStream stream = connection.inputStream // one more to ensure state is working @@ -157,7 +157,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { HttpURLConnection connection = url.openConnection() connection.useCaches = useCaches connection.addRequestProperty("is-dd-server", "false") - assert activeScope() != null + assert activeSpan() != null def stream = connection.inputStream connection.inputStream // one more to ensure state is working def lines = stream.readLines() @@ -169,7 +169,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { connection = url.openConnection() connection.useCaches = useCaches connection.addRequestProperty("is-dd-server", "false") - assert activeScope() != null + assert activeSpan() != null assert connection.getResponseCode() == STATUS // call before input stream to test alternate behavior stream = connection.inputStream lines = stream.readLines() @@ -247,7 +247,7 @@ abstract class HttpUrlConnectionTest extends HttpClientTest { HttpURLConnection connection = url.openConnection() connection.setRequestProperty("Connection", "close") connection.addRequestProperty("is-dd-server", "false") - assert activeScope() != null + assert activeSpan() != null assert connection.getResponseCode() == STATUS return connection } diff --git a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy index 9412528b8f7..98acc87ebb4 100644 --- a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy +++ b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/HttpUrlConnectionUseCachesFalseTest.groovy @@ -1,7 +1,7 @@ import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions import spock.lang.Timeout -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan @Timeout(5) class HttpUrlConnectionUseCachesFalseTest extends HttpUrlConnectionTest implements TestingGenericHttpNamingConventions.ClientV0 { @@ -16,7 +16,7 @@ class HttpUrlConnectionUseCachesFalseTest extends HttpUrlConnectionTest implemen connection.useCaches = false connection.connectTimeout = CONNECT_TIMEOUT_MS connection.readTimeout = READ_TIMEOUT_MS - def parentSpan = activeScope() + def parentSpan = activeSpan() def stream try { stream = connection.inputStream @@ -24,7 +24,7 @@ class HttpUrlConnectionUseCachesFalseTest extends HttpUrlConnectionTest implemen stream = connection.errorStream ex.printStackTrace() } - assert activeScope() == parentSpan + assert activeSpan() == parentSpan stream?.readLines() stream?.close() callback?.call() diff --git a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy index 8ba15a044dd..7bf3aa48a69 100644 --- a/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy +++ b/dd-java-agent/instrumentation/http-url-connection/src/test/groovy/UrlConnectionTest.groovy @@ -6,7 +6,7 @@ import datadog.trace.bootstrap.instrumentation.api.Tags import static datadog.trace.agent.test.utils.PortUtils.UNUSABLE_PORT import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace import static datadog.trace.api.config.TraceInstrumentationConfig.HTTP_CLIENT_HOST_SPLIT_BY_DOMAIN -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan abstract class UrlConnectionTest extends VersionedNamingTestBase { @@ -17,7 +17,7 @@ abstract class UrlConnectionTest extends VersionedNamingTestBase { URLConnection connection = url.openConnection() connection.setConnectTimeout(10000) connection.setReadTimeout(10000) - assert activeScope() != null + assert activeSpan() != null connection.inputStream } diff --git a/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/java/Fanout.java b/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/java/Fanout.java index c8585182a66..9b7d77e22ca 100644 --- a/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/java/Fanout.java +++ b/dd-java-agent/instrumentation/java-concurrent/java-completablefuture/src/test/java/Fanout.java @@ -1,4 +1,4 @@ -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import datadog.trace.api.Trace; import java.util.concurrent.CompletableFuture; @@ -52,11 +52,11 @@ public void executeTwoLevels() { } private void untracedWork() { - assert null != activeScope(); + assert null != activeSpan(); } @Trace private void tracedWork() { - assert null != activeScope(); + assert null != activeSpan(); } } diff --git a/dd-java-agent/instrumentation/java-concurrent/src/test/java/runnable/CheckpointTask.java b/dd-java-agent/instrumentation/java-concurrent/src/test/java/runnable/CheckpointTask.java index 04db8db76b9..9d559546920 100644 --- a/dd-java-agent/instrumentation/java-concurrent/src/test/java/runnable/CheckpointTask.java +++ b/dd-java-agent/instrumentation/java-concurrent/src/test/java/runnable/CheckpointTask.java @@ -1,6 +1,6 @@ package runnable; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import datadog.trace.api.Trace; import java.util.concurrent.CountDownLatch; @@ -29,6 +29,6 @@ public void run() { @Trace private void traceableChild() { - assert null != activeScope(); + assert null != activeSpan(); } } diff --git a/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/MUnitTracingListener.java b/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/MUnitTracingListener.java index 43194f1eee2..d89f32a8bb1 100644 --- a/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/MUnitTracingListener.java +++ b/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/src/main/java/datadog/trace/instrumentation/junit4/MUnitTracingListener.java @@ -5,7 +5,6 @@ import datadog.trace.api.civisibility.execution.TestExecutionHistory; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; import datadog.trace.bootstrap.ContextStore; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; @@ -226,12 +225,11 @@ public void testIgnored(final Description description) { } private static boolean isSpanInProgress(UTF8BytesString type) { - final AgentScope scope = AgentTracer.activeScope(); - if (scope == null) { + final AgentSpan span = AgentTracer.activeSpan(); + if (span == null) { return false; } - AgentSpan scopeSpan = scope.span(); - String spanType = scopeSpan.getSpanType(); + String spanType = span.getSpanType(); return spanType != null && spanType.contentEquals(type); } diff --git a/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java b/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java index 3c81cb3f45d..74cfde45593 100644 --- a/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java +++ b/dd-java-agent/instrumentation/junit-5.3/src/main/java/datadog/trace/instrumentation/junit5/JUnitPlatformUtils.java @@ -5,7 +5,6 @@ import datadog.trace.api.civisibility.config.TestIdentifier; import datadog.trace.api.civisibility.config.TestSourceData; import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; @@ -149,11 +148,7 @@ public static boolean isAssumptionFailure(Throwable throwable) { } public static boolean isTestInProgress() { - AgentScope activeScope = AgentTracer.activeScope(); - if (activeScope == null) { - return false; - } - AgentSpan span = activeScope.span(); + AgentSpan span = AgentTracer.activeSpan(); if (span == null) { return false; } diff --git a/dd-java-agent/instrumentation/rediscala-1.8.0/src/main/java/datadog/trace/instrumentation/rediscala/OnCompleteHandler.java b/dd-java-agent/instrumentation/rediscala-1.8.0/src/main/java/datadog/trace/instrumentation/rediscala/OnCompleteHandler.java index 51be0f00618..7d70e3fe668 100644 --- a/dd-java-agent/instrumentation/rediscala-1.8.0/src/main/java/datadog/trace/instrumentation/rediscala/OnCompleteHandler.java +++ b/dd-java-agent/instrumentation/rediscala-1.8.0/src/main/java/datadog/trace/instrumentation/rediscala/OnCompleteHandler.java @@ -1,11 +1,10 @@ package datadog.trace.instrumentation.rediscala; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeScope; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.instrumentation.rediscala.RediscalaClientDecorator.DECORATE; import akka.actor.ActorRef; import datadog.trace.bootstrap.ContextStore; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import scala.runtime.AbstractFunction1; import scala.util.Try; @@ -24,9 +23,8 @@ public OnCompleteHandler( @Override public Void apply(final Try result) { // propagation handled by scala promise instrumentation - AgentScope activeScope = activeScope(); - if (null != activeScope) { - AgentSpan span = activeScope.span(); + AgentSpan span = activeSpan(); + if (null != span) { try { if (actorRef != null) { DECORATE.onConnection(span, contextStore.get(actorRef));