diff --git a/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java b/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java index 3446c8aa575..64ef5377364 100644 --- a/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java +++ b/dd-java-agent/agent-bootstrap/src/jmh/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorBenchmark.java @@ -3,9 +3,11 @@ import static java.util.concurrent.TimeUnit.MICROSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; +import datadog.context.Context; import datadog.trace.api.GlobalTracer; import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.ContextVisitors; import datadog.trace.bootstrap.instrumentation.api.URIDataAdapter; import datadog.trace.bootstrap.instrumentation.api.URIDefaultDataAdapter; @@ -56,12 +58,12 @@ public void setUp() { .build(); GlobalTracer.forceRegister(tracer); decorator = new BenchmarkHttpServerDecorator(); - span = decorator.startSpan(Collections.emptyMap(), null); + span = decorator.startSpan(Collections.emptyMap(), (Context) null); } @Benchmark public AgentSpan onRequest() { - return decorator.onRequest(span, null, request, null); + return decorator.onRequest(span, null, request, (AgentSpanContext.Extracted) null); } public static class Request { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java index 72728c6c94f..867473b5d30 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/api/Java8BytecodeBridge.java @@ -29,4 +29,9 @@ public static Context getContextFrom(Object carrier) { public static Context detachContextFrom(Object carrier) { return Context.detachFrom(carrier); } + + /** @see AgentSpan#fromContext(Context) */ + public static AgentSpan spanFromContext(Context context) { + return AgentSpan.fromContext(context); + } } diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java index 9bcec9e8aec..d5bc9b56550 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/BaseDecorator.java @@ -3,6 +3,7 @@ import static datadog.trace.api.cache.RadixTreeCache.PORTS; import static datadog.trace.api.cache.RadixTreeCache.UNSET_PORT; +import datadog.context.ContextScope; import datadog.trace.api.Config; import datadog.trace.api.DDTags; import datadog.trace.api.Functions; @@ -105,6 +106,11 @@ public AgentSpan onError(final AgentSpan span, final Throwable throwable, byte e return span; } + public ContextScope onError(final ContextScope scope, final Throwable throwable) { + onError(AgentSpan.fromContext(scope.context()), throwable); + return scope; + } + public AgentSpan onPeerConnection( final AgentSpan span, final InetSocketAddress remoteConnection) { if (remoteConnection != null) { diff --git a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java index bed9b4d2178..f4b118130c6 100644 --- a/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java +++ b/dd-java-agent/agent-bootstrap/src/main/java/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecorator.java @@ -1,7 +1,6 @@ package datadog.trace.bootstrap.instrumentation.decorator; import static datadog.context.Context.root; -import static datadog.context.propagation.Propagators.defaultPropagator; import static datadog.trace.api.cache.RadixTreeCache.UNSET_STATUS; import static datadog.trace.api.datastreams.DataStreamsContext.fromTags; import static datadog.trace.api.gateway.Events.EVENTS; @@ -11,6 +10,7 @@ import datadog.appsec.api.blocking.BlockingException; import datadog.context.Context; +import datadog.context.propagation.Propagators; import datadog.trace.api.Config; import datadog.trace.api.DDTags; import datadog.trace.api.function.TriConsumer; @@ -137,17 +137,17 @@ public AgentSpanContext.Extracted extract(REQUEST_CARRIER carrier) { } /** - * Will be renamed to #extract(REQUEST_CARRIER) when refactoring of instrumentation's is complete + * Will be renamed to #extract(REQUEST_CARRIER) when refactoring of instrumentations is complete */ public Context extractContext(REQUEST_CARRIER carrier) { AgentPropagation.ContextVisitor getter = getter(); if (null == carrier || null == getter) { return root(); } - return defaultPropagator().extract(root(), carrier, getter); + return Propagators.defaultPropagator().extract(root(), carrier, getter); } - /** Deprecated. Use {@link #startSpanFromContext(String, Object, Context)} instead. */ + /** Deprecated. Use {@link #startSpan(Object, Context)} instead. */ @Deprecated public AgentSpan startSpan(REQUEST_CARRIER carrier, AgentSpanContext.Extracted context) { return startSpan("http-server", carrier, context); @@ -170,20 +170,23 @@ public AgentSpan startSpan( return span; } - /** - * Will be renamed to #startSpan(String, REQUEST_CARRIER, Context) when refactoring of - * instrumentation's is complete - */ - public AgentSpan startSpanFromContext( - String instrumentationName, REQUEST_CARRIER carrier, Context context) { - return startSpan(instrumentationName, carrier, getSpanContext(context)); + public AgentSpan startSpan(REQUEST_CARRIER carrier, Context context) { + return startSpan("http-server", carrier, getExtractedSpanContext(context)); } - public AgentSpanContext.Extracted getSpanContext(Context context) { + public AgentSpanContext.Extracted getExtractedSpanContext(Context context) { AgentSpan extractedSpan = AgentSpan.fromContext(context); return extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); } + public AgentSpan onRequest( + final AgentSpan span, + final CONNECTION connection, + final REQUEST request, + final Context context) { + return onRequest(span, connection, request, getExtractedSpanContext(context)); + } + public AgentSpan onRequest( final AgentSpan span, final CONNECTION connection, diff --git a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy index aefddc1a1c3..daf09cad3e4 100644 --- a/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy +++ b/dd-java-agent/agent-bootstrap/src/test/groovy/datadog/trace/bootstrap/instrumentation/decorator/HttpServerDecoratorTest.groovy @@ -51,7 +51,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest { def decorator = newDecorator() when: - decorator.onRequest(this.span, null, req, null) + decorator.onRequest(this.span, null, req, (AgentSpanContext.Extracted) null) then: if (req) { @@ -84,7 +84,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest { def decorator = newDecorator() when: - decorator.onRequest(this.span, null, req, null) + decorator.onRequest(this.span, null, req, (AgentSpanContext.Extracted) null) then: if (expectedUrl) { @@ -135,7 +135,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest { def decorator = newDecorator() when: - decorator.onRequest(this.span, null, req, null) + decorator.onRequest(this.span, null, req, (AgentSpanContext.Extracted) null) then: 1 * this.span.setTag(Tags.HTTP_URL, {it.toString() == expectedUrl}) @@ -165,7 +165,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest { def decorator = newDecorator() when: - decorator.onRequest(this.span, null, [url: new URI('http://host/p%20ath')], null) + decorator.onRequest(this.span, null, [url: new URI('http://host/p%20ath')], (AgentSpanContext.Extracted) null) then: 1 * this.span.setResourceName({ it as String == '/path' }, ResourceNamePriorities.HTTP_PATH_NORMALIZER) diff --git a/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java b/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java index 56f0e5c44a0..8dde14fcbdb 100644 --- a/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogAsyncHandlerWrapper.java @@ -4,8 +4,9 @@ import akka.http.scaladsl.model.HttpResponse; import akka.http.scaladsl.util.FastFuture$; import akka.stream.Materializer; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.akkahttp.appsec.BlockingResponseHelper; import scala.Function1; @@ -26,8 +27,9 @@ public DatadogAsyncHandlerWrapper( @Override public Future apply(final HttpRequest request) { - final AgentScope scope = DatadogWrapperHelper.createSpan(request); - AgentSpan span = scope.span(); + final ContextScope scope = DatadogWrapperHelper.createSpan(request); + Context context = scope.context(); + final AgentSpan span = AgentSpan.fromContext(context); Future futureResponse; // handle blocking in the beginning of the request diff --git a/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java b/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java index b1bbd3683b4..f0c211e86bd 100644 --- a/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java +++ b/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogServerRequestResponseFlowWrapper.java @@ -13,8 +13,8 @@ import akka.stream.stage.AbstractOutHandler; import akka.stream.stage.GraphStage; import akka.stream.stage.GraphStageLogic; +import datadog.context.ContextScope; import datadog.trace.api.gateway.RequestContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.akkahttp.appsec.BlockingResponseHelper; import java.util.Queue; @@ -56,7 +56,7 @@ public GraphStageLogic createLogic(final Attributes inheritedAttributes) throws // that this connection was created with. This means that we can safely // close the span at the front of the queue when we receive the response // from the user code, since it will match up to the request for that span. - final Queue scopes = new ArrayBlockingQueue<>(pipeliningLimit); + final Queue scopes = new ArrayBlockingQueue<>(pipeliningLimit); boolean[] skipNextPull = new boolean[] {false}; // This is where the request comes in from the server and TCP layer @@ -66,8 +66,8 @@ public GraphStageLogic createLogic(final Attributes inheritedAttributes) throws @Override public void onPush() throws Exception { final HttpRequest request = grab(requestInlet); - final AgentScope scope = DatadogWrapperHelper.createSpan(request); - AgentSpan span = scope.span(); + final ContextScope scope = DatadogWrapperHelper.createSpan(request); + final AgentSpan span = AgentSpan.fromContext(scope.context()); RequestContext requestContext = span.getRequestContext(); if (requestContext != null) { HttpResponse response = @@ -77,7 +77,7 @@ public void onPush() throws Exception { skipNextPull[0] = true; requestContext.getTraceSegment().effectivelyBlocked(); emit(responseOutlet, response); - DatadogWrapperHelper.finishSpan(scope.span(), response); + DatadogWrapperHelper.finishSpan(span, response); pull(requestInlet); scope.close(); return; @@ -131,9 +131,9 @@ public void onDownstreamFinish() throws Exception { @Override public void onPush() throws Exception { HttpResponse response = grab(responseInlet); - final AgentScope scope = scopes.poll(); + final ContextScope scope = scopes.poll(); if (scope != null) { - AgentSpan span = scope.span(); + AgentSpan span = AgentSpan.fromContext(scope.context()); HttpResponse newResponse = BlockingResponseHelper.handleFinishForWaf(span, response); if (newResponse != response) { @@ -146,7 +146,7 @@ public void onPush() throws Exception { // and close it. If it's not, then it will be cleaned up actor message // processing instrumentation that drives this state machine AgentSpan activeSpan = activeSpan(); - if (activeSpan == scope.span()) { + if (activeSpan == span) { scope.close(); } } @@ -157,9 +157,9 @@ public void onPush() throws Exception { public void onUpstreamFinish() throws Exception { // We will not receive any more responses from the user code, so clean up any // remaining spans - AgentScope scope = scopes.poll(); + ContextScope scope = scopes.poll(); while (scope != null) { - scope.span().finish(); + AgentSpan.fromContext(scope.context()).finish(); scope = scopes.poll(); } completeStage(); @@ -167,16 +167,17 @@ public void onUpstreamFinish() throws Exception { @Override public void onUpstreamFailure(final Throwable ex) throws Exception { - AgentScope scope = scopes.poll(); + ContextScope scope = scopes.poll(); + AgentSpan span = AgentSpan.fromContext(scope.context()); if (scope != null) { // Mark the span as failed - DatadogWrapperHelper.finishSpan(scope.span(), ex); + DatadogWrapperHelper.finishSpan(span, ex); } // We will not receive any more responses from the user code, so clean up any // remaining spans scope = scopes.poll(); while (scope != null) { - scope.span().finish(); + span.finish(); scope = scopes.poll(); } fail(responseOutlet, ex); diff --git a/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java b/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java index a339eff7542..85be099be8c 100644 --- a/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java +++ b/dd-java-agent/instrumentation/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java @@ -1,22 +1,21 @@ package datadog.trace.instrumentation.akkahttp; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator.DECORATE; import akka.http.scaladsl.model.HttpRequest; import akka.http.scaladsl.model.HttpResponse; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; public class DatadogWrapperHelper { - public static AgentScope createSpan(final HttpRequest request) { - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + public static ContextScope createSpan(final HttpRequest request) { + final Context extractedContext = DECORATE.extractContext(request); final AgentSpan span = DECORATE.startSpan(request, extractedContext); DECORATE.afterStart(span); DECORATE.onRequest(span, request, request, extractedContext); - return activateSpan(span); + return extractedContext.with(span).attach(); } public static void finishSpan(final AgentSpan span, final HttpResponse response) { diff --git a/dd-java-agent/instrumentation/axway-api/src/main/java/datadog/trace/instrumentation/axway/HTTPPluginAdvice.java b/dd-java-agent/instrumentation/axway-api/src/main/java/datadog/trace/instrumentation/axway/HTTPPluginAdvice.java index fc54e83d966..44fe2bce995 100644 --- a/dd-java-agent/instrumentation/axway-api/src/main/java/datadog/trace/instrumentation/axway/HTTPPluginAdvice.java +++ b/dd-java-agent/instrumentation/axway-api/src/main/java/datadog/trace/instrumentation/axway/HTTPPluginAdvice.java @@ -8,6 +8,7 @@ import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; public class HTTPPluginAdvice { @@ -17,7 +18,8 @@ public static AgentScope onEnter(@Advice.Argument(value = 2) final Object server final AgentSpan span = startSpan(DECORATE.spanName()).setMeasured(true); DECORATE.afterStart(span); // serverTransaction is like request + connection in one object: - DECORATE.onRequest(span, serverTransaction, serverTransaction, null); + DECORATE.onRequest( + span, serverTransaction, serverTransaction, (AgentSpanContext.Extracted) null); final AgentScope scope = activateSpan(span); return scope; } diff --git a/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsInstrumentation.java b/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsInstrumentation.java index 604b5d77c42..1a6f8bb301a 100644 --- a/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsInstrumentation.java +++ b/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsInstrumentation.java @@ -3,7 +3,7 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.declaresMethod; import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.isAnnotatedWith; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR; import static datadog.trace.instrumentation.azurefunctions.AzureFunctionsDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -14,11 +14,11 @@ import com.microsoft.azure.functions.ExecutionContext; import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpResponseMessage; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -64,24 +64,24 @@ public void methodAdvice(MethodTransformer transformer) { public static class AzureFunctionsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope methodEnter( + public static ContextScope methodEnter( @Advice.Argument(0) final HttpRequestMessage request, @Advice.Argument(1) final ExecutionContext context) { - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + final Context extractedContext = DECORATE.extractContext(request); final AgentSpan span = DECORATE.startSpan(request, extractedContext); DECORATE.afterStart(span, context.getFunctionName()); DECORATE.onRequest(span, request, request, extractedContext); HTTP_RESOURCE_DECORATOR.withRoute( span, request.getHttpMethod().name(), request.getUri().getPath()); - return activateSpan(span); + return extractedContext.with(span).attach(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Enter final AgentScope scope, + @Advice.Enter final ContextScope scope, @Advice.Return final HttpResponseMessage response, @Advice.Thrown final Throwable throwable) { - final AgentSpan span = scope.span(); + final AgentSpan span = spanFromContext(scope.context()); DECORATE.onError(span, throwable); DECORATE.onResponse(span, response); DECORATE.beforeFinish(span); diff --git a/dd-java-agent/instrumentation/grizzly-2/src/main/java/datadog/trace/instrumentation/grizzly/GrizzlyHttpHandlerInstrumentation.java b/dd-java-agent/instrumentation/grizzly-2/src/main/java/datadog/trace/instrumentation/grizzly/GrizzlyHttpHandlerInstrumentation.java index f556f9bf920..620d3133e4f 100644 --- a/dd-java-agent/instrumentation/grizzly-2/src/main/java/datadog/trace/instrumentation/grizzly/GrizzlyHttpHandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/grizzly-2/src/main/java/datadog/trace/instrumentation/grizzly/GrizzlyHttpHandlerInstrumentation.java @@ -1,21 +1,21 @@ package datadog.trace.instrumentation.grizzly; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.grizzly.GrizzlyDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.CorrelationIdentifier; import datadog.trace.api.GlobalTracer; import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import org.glassfish.grizzly.http.server.Request; import org.glassfish.grizzly.http.server.Response; @@ -66,19 +66,19 @@ public static class HandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class, skipOn = Advice.OnNonDefaultValue.class) public static boolean /* skip body */ methodEnter( - @Advice.Local("agentScope") AgentScope scope, + @Advice.Local("contextScope") ContextScope scope, @Advice.Argument(0) final Request request, @Advice.Argument(1) final Response response) { if (request.getAttribute(DD_SPAN_ATTRIBUTE) != null) { return false; } - final AgentSpanContext.Extracted parentContext = DECORATE.extract(request); + final Context parentContext = DECORATE.extractContext(request); final AgentSpan span = DECORATE.startSpan(request, parentContext); DECORATE.afterStart(span); DECORATE.onRequest(span, request, request, parentContext); - scope = activateSpan(span); + scope = parentContext.with(span).attach(); request.setAttribute(DD_SPAN_ATTRIBUTE, span); request.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); @@ -101,14 +101,14 @@ public static class HandleAdvice { public static void methodExit( @Advice.Enter boolean skippedBody, @Advice.Return(readOnly = false) boolean retVal, - @Advice.Local("agentScope") AgentScope scope, + @Advice.Local("contextScope") ContextScope scope, @Advice.Thrown final Throwable throwable) { if (scope == null) { return; } if (throwable != null) { - final AgentSpan span = scope.span(); + final AgentSpan span = spanFromContext(scope.context()); DECORATE.onError(span, throwable); DECORATE.beforeFinish(span); span.finish(); diff --git a/dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java b/dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java index 1f8029a0940..b757c242e31 100644 --- a/dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java +++ b/dd-java-agent/instrumentation/grizzly-http-2.3.20/src/main/java/datadog/trace/instrumentation/grizzlyhttp232/GrizzlyDecorator.java @@ -1,17 +1,15 @@ package datadog.trace.instrumentation.grizzlyhttp232; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; - import datadog.appsec.api.blocking.BlockingContentType; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.gateway.BlockResponseFunction; import datadog.trace.api.gateway.Flow; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.internal.TraceSegment; import datadog.trace.bootstrap.ActiveSubsystems; import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.URIDataAdapter; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator; @@ -114,9 +112,9 @@ public static NextAction onHttpCodecFilterExit( } HttpRequestPacket httpRequest = (HttpRequestPacket) httpHeader; HttpResponsePacket httpResponse = httpRequest.getResponse(); - AgentSpanContext.Extracted context = DECORATE.extract(httpRequest); + Context context = DECORATE.extractContext(httpRequest); AgentSpan span = DECORATE.startSpan(httpRequest, context); - AgentScope scope = activateSpan(span); + ContextScope scope = context.with(span).attach(); DECORATE.afterStart(span); ctx.getAttributes().setAttribute(DD_SPAN_ATTRIBUTE, span); ctx.getAttributes().setAttribute(DD_RESPONSE_ATTRIBUTE, httpResponse); diff --git a/dd-java-agent/instrumentation/jetty-11/src/main/java11/datadog/trace/instrumentation/jetty11/JettyServerAdvice.java b/dd-java-agent/instrumentation/jetty-11/src/main/java11/datadog/trace/instrumentation/jetty11/JettyServerAdvice.java index 61c4e9be271..3ace86c53f2 100644 --- a/dd-java-agent/instrumentation/jetty-11/src/main/java11/datadog/trace/instrumentation/jetty11/JettyServerAdvice.java +++ b/dd-java-agent/instrumentation/jetty-11/src/main/java11/datadog/trace/instrumentation/jetty11/JettyServerAdvice.java @@ -4,11 +4,11 @@ import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.jetty11.JettyDecorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.CorrelationIdentifier; import datadog.trace.api.GlobalTracer; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.Request; @@ -17,7 +17,7 @@ public class JettyServerAdvice { public static class HandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter( + public static ContextScope onEnter( @Advice.This final HttpChannel channel, @Advice.Local("agentSpan") AgentSpan span) { Request req = channel.getRequest(); @@ -26,9 +26,9 @@ public static AgentScope onEnter( return activateSpan((AgentSpan) existingSpan); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); + final Context extractedContext = DECORATE.extractContext(req); span = DECORATE.startSpan(req, extractedContext); - final AgentScope scope = activateSpan(span); + final ContextScope scope = extractedContext.with(span).attach(); span.setMeasured(true); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, extractedContext); @@ -40,7 +40,7 @@ public static AgentScope onEnter( } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) - public static void closeScope(@Advice.Enter final AgentScope scope) { + public static void closeScope(@Advice.Enter final ContextScope scope) { scope.close(); } diff --git a/dd-java-agent/instrumentation/jetty-12/src/main/java17/datadog/trace/instrumentation/jetty12/JettyServerAdvice.java b/dd-java-agent/instrumentation/jetty-12/src/main/java17/datadog/trace/instrumentation/jetty12/JettyServerAdvice.java index 11b31cdffca..5fc610ba5ea 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/main/java17/datadog/trace/instrumentation/jetty12/JettyServerAdvice.java +++ b/dd-java-agent/instrumentation/jetty-12/src/main/java17/datadog/trace/instrumentation/jetty12/JettyServerAdvice.java @@ -1,13 +1,12 @@ package datadog.trace.instrumentation.jetty12; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.CorrelationIdentifier; import datadog.trace.api.GlobalTracer; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.internal.HttpChannelState; @@ -22,15 +21,15 @@ public static void onExit( Request req = channel.getRequest(); Object existingSpan = req.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { - try (final AgentScope scope = activateSpan((AgentSpan) existingSpan)) { + try (final ContextScope scope = ((AgentSpan) existingSpan).attach()) { ret = JettyRunnableWrapper.wrapIfNeeded(ret); return; } } - final AgentSpanContext.Extracted extractedContext = JettyDecorator.DECORATE.extract(req); + final Context extractedContext = JettyDecorator.DECORATE.extractContext(req); final AgentSpan span = JettyDecorator.DECORATE.startSpan(req, extractedContext); - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = extractedContext.with(span).attach()) { span.setMeasured(true); JettyDecorator.DECORATE.afterStart(span); JettyDecorator.DECORATE.onRequest(span, req, req, extractedContext); diff --git a/dd-java-agent/instrumentation/jetty-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyServerInstrumentation.java b/dd-java-agent/instrumentation/jetty-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyServerInstrumentation.java index e8a9e449963..ed3970d174b 100644 --- a/dd-java-agent/instrumentation/jetty-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-7.0/src/main/java/datadog/trace/instrumentation/jetty70/JettyServerInstrumentation.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.jetty70; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.jetty70.JettyDecorator.DECORATE; import static java.util.Collections.singletonMap; @@ -10,6 +9,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments; import com.google.auto.service.AutoService; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.Config; @@ -17,9 +18,7 @@ import datadog.trace.api.GlobalTracer; import datadog.trace.api.ProductActivation; import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.instrumentation.jetty.ConnectionHandleRequestVisitor; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -146,19 +145,19 @@ public static void link( public static class HandleRequestAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter( + public static ContextScope onEnter( @Advice.This final HttpConnection connection, @Advice.Local("agentSpan") AgentSpan span) { Request req = connection.getRequest(); Object existingSpan = req.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { // Request already gone through initial processing, so just activate the span. - return activateSpan((AgentSpan) existingSpan); + return ((AgentSpan) existingSpan).attach(); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); + final Context extractedContext = DECORATE.extractContext(req); span = DECORATE.startSpan(req, extractedContext); - final AgentScope scope = activateSpan(span); + final ContextScope scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, extractedContext); @@ -169,7 +168,7 @@ public static AgentScope onEnter( } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) - public static void closeScope(@Advice.Enter final AgentScope scope) { + public static void closeScope(@Advice.Enter final ContextScope scope) { // Span is finished when the connection is reset, so we only need to close the scope here. scope.close(); } diff --git a/dd-java-agent/instrumentation/jetty-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyServerInstrumentation.java b/dd-java-agent/instrumentation/jetty-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyServerInstrumentation.java index 81225c7c820..03f25109d87 100644 --- a/dd-java-agent/instrumentation/jetty-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-7.6/src/main/java/datadog/trace/instrumentation/jetty76/JettyServerInstrumentation.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.jetty76; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_FIN_DISP_LIST_SPAN_ATTRIBUTE; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.jetty76.JettyDecorator.DECORATE; @@ -10,6 +9,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesNoArguments; import com.google.auto.service.AutoService; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.Config; @@ -17,9 +18,7 @@ import datadog.trace.api.GlobalTracer; import datadog.trace.api.ProductActivation; import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.instrumentation.jetty.ConnectionHandleRequestVisitor; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -146,7 +145,7 @@ public static void link( public static class HandleRequestAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter( + public static ContextScope onEnter( @Advice.This final AbstractHttpConnection connection, @Advice.Local("newSpan") AgentSpan span) { Request req = connection.getRequest(); @@ -154,12 +153,12 @@ public static AgentScope onEnter( Object existingSpan = req.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { // Request already gone through initial processing, so just activate the span. - return activateSpan((AgentSpan) existingSpan); + return ((AgentSpan) existingSpan).attach(); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); + final Context extractedContext = DECORATE.extractContext(req); span = DECORATE.startSpan(req, extractedContext); - final AgentScope scope = activateSpan(span); + final ContextScope scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, extractedContext); @@ -170,7 +169,7 @@ public static AgentScope onEnter( } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) - public static void closeScope(@Advice.Enter final AgentScope scope) { + public static void closeScope(@Advice.Enter final ContextScope scope) { // Span is finished when the connection is reset, so we only need to close the scope here. scope.close(); } diff --git a/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java b/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java index 7aaea42fc4d..31e696eb8f3 100644 --- a/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/JettyServerInstrumentation.java @@ -3,7 +3,6 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.declaresMethod; 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.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE; import static datadog.trace.instrumentation.jetty9.JettyDecorator.DECORATE; @@ -15,6 +14,8 @@ import com.google.auto.service.AutoService; import datadog.appsec.api.blocking.BlockingException; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.ExcludeFilterProvider; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; @@ -22,9 +23,7 @@ import datadog.trace.api.CorrelationIdentifier; import datadog.trace.api.GlobalTracer; import datadog.trace.api.ProductActivation; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter; import java.util.Arrays; @@ -162,18 +161,18 @@ public ClassVisitor wrap( public static class HandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter( + public static ContextScope onEnter( @Advice.This final HttpChannel channel, @Advice.Local("agentSpan") AgentSpan span) { Request req = channel.getRequest(); Object existingSpan = req.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { - return activateSpan((AgentSpan) existingSpan); + return ((AgentSpan) existingSpan).attach(); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); + final Context extractedContext = DECORATE.extractContext(req); span = DECORATE.startSpan(req, extractedContext); - final AgentScope scope = activateSpan(span); + final ContextScope scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, extractedContext); @@ -184,7 +183,7 @@ public static AgentScope onEnter( } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) - public static void closeScope(@Advice.Enter final AgentScope scope) { + public static void closeScope(@Advice.Enter final ContextScope scope) { scope.close(); } } diff --git a/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleAdvice.java b/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleAdvice.java index 25459847c0d..5c555eea68c 100644 --- a/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleAdvice.java +++ b/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleAdvice.java @@ -1,14 +1,13 @@ package datadog.trace.instrumentation.jetty10; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.jetty10.JettyDecorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.CorrelationIdentifier; import datadog.trace.api.GlobalTracer; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.HttpChannel; import org.eclipse.jetty.server.Request; @@ -16,21 +15,21 @@ public class HandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter( + public static ContextScope onEnter( @Advice.This final HttpChannel channel, @Advice.Local("agentSpan") AgentSpan span) { Request req = channel.getRequest(); Object existingSpan = req.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { - return activateSpan((AgentSpan) existingSpan); + return ((AgentSpan) existingSpan).attach(); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); + final Context extractedContext = DECORATE.extractContext(req); span = DECORATE.startSpan(req, extractedContext); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, extractedContext); - final AgentScope scope = activateSpan(span); + final ContextScope scope = extractedContext.with(span).attach(); req.setAttribute(DD_SPAN_ATTRIBUTE, span); req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); @@ -38,7 +37,7 @@ public static AgentScope onEnter( } @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) - public static void closeScope(@Advice.Enter final AgentScope scope) { + public static void closeScope(@Advice.Enter final ContextScope scope) { scope.close(); } diff --git a/dd-java-agent/instrumentation/liberty-20/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java b/dd-java-agent/instrumentation/liberty-20/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java index 1a4769710b3..8df47198b60 100644 --- a/dd-java-agent/instrumentation/liberty-20/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty-20/src/main/java/datadog/trace/instrumentation/liberty20/LibertyServerInstrumentation.java @@ -1,7 +1,7 @@ package datadog.trace.instrumentation.liberty20; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.liberty20.HttpInboundServiceContextImplInstrumentation.REQUEST_MSG_TYPE; import static datadog.trace.instrumentation.liberty20.LibertyDecorator.DD_EXTRACTED_CONTEXT_ATTRIBUTE; import static datadog.trace.instrumentation.liberty20.LibertyDecorator.DD_SPAN_ATTRIBUTE; @@ -14,6 +14,8 @@ import com.ibm.ws.webcontainer.srt.SRTServletResponse; import com.ibm.ws.webcontainer.webapp.WebApp; import com.ibm.wsspi.webcontainer.webapp.IWebAppDispatcherContext; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.ClassloaderConfigurationOverrides; @@ -24,9 +26,7 @@ import datadog.trace.bootstrap.ActiveSubsystems; 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 datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.instrumentation.servlet.ServletBlockingHelper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collections; @@ -88,7 +88,7 @@ public static class HandleRequestAdvice { @Advice.OnMethodEnter(suppress = Throwable.class, skipOn = Advice.OnNonDefaultValue.class) public static boolean /* skip */ onEnter( - @Advice.Local("agentScope") AgentScope scope, + @Advice.Local("contextScope") ContextScope scope, @Advice.Argument(0) ServletRequest req, @Advice.Argument(1) ServletResponse resp) { if (!(req instanceof SRTServletRequest)) return false; @@ -99,16 +99,16 @@ public static class HandleRequestAdvice { try { Object existingSpan = request.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { - scope = activateSpan((AgentSpan) existingSpan); + scope = ((AgentSpan) existingSpan).attach(); return false; } } catch (NullPointerException e) { } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + final Context extractedContext = DECORATE.extractContext(request); request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedContext); final AgentSpan span = DECORATE.startSpan(request, extractedContext); - scope = activateSpan(span); + scope = extractedContext.with(span).attach(); if (Config.get().isJeeSplitByDeployment()) { final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext(); if (dispatcherContext != null) { @@ -152,7 +152,7 @@ public static class HandleRequestAdvice { @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) public static void closeScope( - @Advice.Local("agentScope") final AgentScope scope, + @Advice.Local("contextScope") final ContextScope scope, @Advice.Argument(value = 0) ServletRequest req) { if (!(req instanceof SRTServletRequest)) return; SRTServletRequest request = (SRTServletRequest) req; @@ -163,7 +163,7 @@ public static void closeScope( // this has the unfortunate consequence that service name (as set via the tag interceptor) // of the top span won't match that of its child spans, because it's instead the original // one that will propagate - DECORATE.getPath(scope.span(), request); + DECORATE.getPath(spanFromContext(scope.context()), request); scope.close(); } } diff --git a/dd-java-agent/instrumentation/liberty-23/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java b/dd-java-agent/instrumentation/liberty-23/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java index 30c8d7980cc..9cc0f3e814f 100644 --- a/dd-java-agent/instrumentation/liberty-23/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty-23/src/main/java/datadog/trace/instrumentation/liberty23/LibertyServerInstrumentation.java @@ -1,7 +1,7 @@ package datadog.trace.instrumentation.liberty23; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.liberty23.HttpInboundServiceContextImplInstrumentation.REQUEST_MSG_TYPE; import static datadog.trace.instrumentation.liberty23.LibertyDecorator.DD_EXTRACTED_CONTEXT_ATTRIBUTE; import static datadog.trace.instrumentation.liberty23.LibertyDecorator.DD_SPAN_ATTRIBUTE; @@ -14,6 +14,8 @@ import com.ibm.ws.webcontainer.srt.SRTServletResponse; import com.ibm.ws.webcontainer.webapp.WebApp; import com.ibm.wsspi.webcontainer.webapp.IWebAppDispatcherContext; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.ClassloaderConfigurationOverrides; @@ -24,9 +26,7 @@ import datadog.trace.bootstrap.ActiveSubsystems; 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 datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.instrumentation.servlet5.JakartaServletBlockingHelper; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jakarta.servlet.ServletRequest; @@ -88,7 +88,7 @@ public static class HandleRequestAdvice { @Advice.OnMethodEnter(suppress = Throwable.class, skipOn = Advice.OnNonDefaultValue.class) public static boolean /* skip */ onEnter( - @Advice.Local("agentScope") AgentScope scope, + @Advice.Local("contextScope") ContextScope scope, @Advice.Argument(0) ServletRequest req, @Advice.Argument(1) ServletResponse resp) { if (!(req instanceof SRTServletRequest)) { @@ -101,16 +101,16 @@ public static class HandleRequestAdvice { try { Object existingSpan = request.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { - scope = activateSpan((AgentSpan) existingSpan); + scope = ((AgentSpan) existingSpan).attach(); return false; } } catch (NullPointerException e) { } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + final Context extractedContext = DECORATE.extractContext(request); request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedContext); final AgentSpan span = DECORATE.startSpan(request, extractedContext); - scope = activateSpan(span); + scope = extractedContext.with(span).attach(); if (Config.get().isJeeSplitByDeployment()) { final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext(); if (dispatcherContext != null) { @@ -152,7 +152,7 @@ public static class HandleRequestAdvice { @Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class) public static void closeScope( - @Advice.Local("agentScope") final AgentScope scope, + @Advice.Local("contextScope") final ContextScope scope, @Advice.Argument(value = 0) ServletRequest req) { if (!(req instanceof SRTServletRequest)) { return; @@ -165,7 +165,7 @@ public static void closeScope( // this has the unfortunate consequence that service name (as set via the tag interceptor) // of the top span won't match that of its child spans, because it's instead the original // one that will propagate - DECORATE.getPath(scope.span(), request); + DECORATE.getPath(spanFromContext(scope.context()), request); scope.close(); } } diff --git a/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/HttpServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/HttpServerRequestTracingHandler.java index 20c685a581b..cae5febef94 100644 --- a/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/HttpServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty-3.8/src/main/java/datadog/trace/instrumentation/netty38/server/HttpServerRequestTracingHandler.java @@ -1,13 +1,12 @@ package datadog.trace.instrumentation.netty38.server; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.instrumentation.netty38.server.NettyHttpServerDecorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.gateway.Flow; 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.AgentSpanContext; import datadog.trace.instrumentation.netty38.ChannelTraceContext; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelHandlerContext; @@ -35,7 +34,7 @@ public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent if (span == null) { ctx.sendUpstream(msg); // superclass does not throw } else { - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = span.attach()) { ctx.sendUpstream(msg); // superclass does not throw } } @@ -44,13 +43,13 @@ public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent final HttpRequest request = (HttpRequest) msg.getMessage(); final HttpHeaders headers = request.headers(); - final AgentSpanContext.Extracted context = DECORATE.extract(headers); + final Context context = DECORATE.extractContext(headers); final AgentSpan span = DECORATE.startSpan(headers, context); channelTraceContext.reset(); channelTraceContext.setRequestHeaders(headers); - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = context.with(span).attach()) { DECORATE.afterStart(span); DECORATE.onRequest(span, ctx.getChannel(), request, context); diff --git a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java index d5b0aabd49e..63501d855c9 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty-4.0/src/main/java/datadog/trace/instrumentation/netty40/server/HttpServerRequestTracingHandler.java @@ -1,16 +1,15 @@ package datadog.trace.instrumentation.netty40.server; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.instrumentation.netty40.AttributeKeys.ANALYZED_RESPONSE_KEY; import static datadog.trace.instrumentation.netty40.AttributeKeys.BLOCKED_RESPONSE_KEY; import static datadog.trace.instrumentation.netty40.AttributeKeys.REQUEST_HEADERS_ATTRIBUTE_KEY; import static datadog.trace.instrumentation.netty40.AttributeKeys.SPAN_ATTRIBUTE_KEY; import static datadog.trace.instrumentation.netty40.server.NettyHttpServerDecorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; @@ -31,7 +30,7 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { if (span == null) { ctx.fireChannelRead(msg); // superclass does not throw } else { - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = span.attach()) { ctx.fireChannelRead(msg); // superclass does not throw } } @@ -40,10 +39,10 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { final HttpRequest request = (HttpRequest) msg; final HttpHeaders headers = request.headers(); - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(headers); + final Context extractedContext = DECORATE.extractContext(headers); final AgentSpan span = DECORATE.startSpan(headers, extractedContext); - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = extractedContext.with(span).attach()) { DECORATE.afterStart(span); DECORATE.onRequest(span, channel, request, extractedContext); diff --git a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java index 3fd4e640d44..31236ee482e 100644 --- a/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java +++ b/dd-java-agent/instrumentation/netty-4.1/src/main/java/datadog/trace/instrumentation/netty41/server/HttpServerRequestTracingHandler.java @@ -1,16 +1,15 @@ package datadog.trace.instrumentation.netty41.server; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.instrumentation.netty41.AttributeKeys.ANALYZED_RESPONSE_KEY; import static datadog.trace.instrumentation.netty41.AttributeKeys.BLOCKED_RESPONSE_KEY; import static datadog.trace.instrumentation.netty41.AttributeKeys.REQUEST_HEADERS_ATTRIBUTE_KEY; import static datadog.trace.instrumentation.netty41.AttributeKeys.SPAN_ATTRIBUTE_KEY; import static datadog.trace.instrumentation.netty41.server.NettyHttpServerDecorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import io.netty.channel.Channel; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; @@ -30,7 +29,7 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { if (span == null) { ctx.fireChannelRead(msg); // superclass does not throw } else { - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = span.attach()) { ctx.fireChannelRead(msg); // superclass does not throw } } @@ -39,10 +38,10 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { final HttpRequest request = (HttpRequest) msg; final HttpHeaders headers = request.headers(); - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(headers); + final Context extractedContext = DECORATE.extractContext(headers); final AgentSpan span = DECORATE.startSpan(headers, extractedContext); - try (final AgentScope scope = activateSpan(span)) { + try (final ContextScope scope = extractedContext.with(span).attach()) { DECORATE.afterStart(span); DECORATE.onRequest(span, channel, request, extractedContext); diff --git a/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java b/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java index e79c2e21838..46fc8e56bd5 100644 --- a/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java +++ b/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogAsyncHandlerWrapper.java @@ -1,6 +1,7 @@ package datadog.trace.instrumentation.pekkohttp; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.ContextScope; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import org.apache.pekko.http.scaladsl.model.HttpRequest; import org.apache.pekko.http.scaladsl.model.HttpResponse; import scala.Function1; @@ -22,13 +23,14 @@ public DatadogAsyncHandlerWrapper( @Override public Future apply(final HttpRequest request) { - final AgentScope scope = DatadogWrapperHelper.createSpan(request); + final ContextScope scope = DatadogWrapperHelper.createSpan(request); + AgentSpan span = AgentSpan.fromContext(scope.context()); Future futureResponse = null; try { futureResponse = userHandler.apply(request); } catch (final Throwable t) { scope.close(); - DatadogWrapperHelper.finishSpan(scope.span(), t); + DatadogWrapperHelper.finishSpan(span, t); throw t; } final Future wrapped = @@ -36,14 +38,14 @@ public Future apply(final HttpRequest request) { new AbstractFunction1() { @Override public HttpResponse apply(final HttpResponse response) { - DatadogWrapperHelper.finishSpan(scope.span(), response); + DatadogWrapperHelper.finishSpan(span, response); return response; } }, new AbstractFunction1() { @Override public Throwable apply(final Throwable t) { - DatadogWrapperHelper.finishSpan(scope.span(), t); + DatadogWrapperHelper.finishSpan(span, t); return t; } }, diff --git a/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java b/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java index 06dc60cf723..466f6657372 100644 --- a/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java +++ b/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogServerRequestResponseFlowWrapper.java @@ -2,7 +2,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; @@ -54,7 +54,7 @@ public GraphStageLogic createLogic(final Attributes inheritedAttributes) throws // that this connection was created with. This means that we can safely // close the span at the front of the queue when we receive the response // from the user code, since it will match up to the request for that span. - final Queue scopes = new ArrayBlockingQueue<>(pipeliningLimit); + final Queue scopes = new ArrayBlockingQueue<>(pipeliningLimit); // This is where the request comes in from the server and TCP layer setHandler( @@ -63,7 +63,7 @@ public GraphStageLogic createLogic(final Attributes inheritedAttributes) throws @Override public void onPush() throws Exception { final HttpRequest request = grab(requestInlet); - final AgentScope scope = DatadogWrapperHelper.createSpan(request); + final ContextScope scope = DatadogWrapperHelper.createSpan(request); scopes.add(scope); push(requestOutlet, request); // Since we haven't instrumented the pekko stream state machine, we can't rely @@ -111,14 +111,15 @@ public void onDownstreamFinish() throws Exception { @Override public void onPush() throws Exception { final HttpResponse response = grab(responseInlet); - final AgentScope scope = scopes.poll(); + final ContextScope scope = scopes.poll(); if (scope != null) { - DatadogWrapperHelper.finishSpan(scope.span(), response); + AgentSpan span = AgentSpan.fromContext(scope.context()); + DatadogWrapperHelper.finishSpan(span, response); // Check if the active span matches the scope from when the request came in, // and close it. If it's not, then it will be cleaned up actor message // processing instrumentation that drives this state machine AgentSpan activeSpan = activeSpan(); - if (activeSpan == scope.span()) { + if (activeSpan == span) { scope.close(); } } @@ -129,9 +130,9 @@ public void onPush() throws Exception { public void onUpstreamFinish() throws Exception { // We will not receive any more responses from the user code, so clean up any // remaining spans - AgentScope scope = scopes.poll(); + ContextScope scope = scopes.poll(); while (scope != null) { - scope.span().finish(); + AgentSpan.fromContext(scope.context()).finish(); scope = scopes.poll(); } completeStage(); @@ -139,16 +140,17 @@ public void onUpstreamFinish() throws Exception { @Override public void onUpstreamFailure(final Throwable ex) throws Exception { - AgentScope scope = scopes.poll(); + ContextScope scope = scopes.poll(); + AgentSpan span = AgentSpan.fromContext(scope.context()); if (scope != null) { // Mark the span as failed - DatadogWrapperHelper.finishSpan(scope.span(), ex); + DatadogWrapperHelper.finishSpan(span, ex); } // We will not receive any more responses from the user code, so clean up any // remaining spans scope = scopes.poll(); while (scope != null) { - scope.span().finish(); + span.finish(); scope = scopes.poll(); } fail(responseOutlet, ex); diff --git a/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogWrapperHelper.java b/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogWrapperHelper.java index 5c82e9bb020..67112021c5d 100644 --- a/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogWrapperHelper.java +++ b/dd-java-agent/instrumentation/pekko-http-1.0/src/main/java/datadog/trace/instrumentation/pekkohttp/DatadogWrapperHelper.java @@ -1,22 +1,21 @@ package datadog.trace.instrumentation.pekkohttp; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.instrumentation.pekkohttp.PekkoHttpServerDecorator.DECORATE; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import org.apache.pekko.http.scaladsl.model.HttpRequest; import org.apache.pekko.http.scaladsl.model.HttpResponse; public class DatadogWrapperHelper { - public static AgentScope createSpan(final HttpRequest request) { - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + public static ContextScope createSpan(final HttpRequest request) { + final Context extractedContext = DECORATE.extractContext(request); final AgentSpan span = DECORATE.startSpan(request, extractedContext); DECORATE.afterStart(span); DECORATE.onRequest(span, request, request, extractedContext); - return activateSpan(span); + return extractedContext.with(span).attach(); } public static void finishSpan(final AgentSpan span, final HttpResponse response) { diff --git a/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/PlayAdvice.java b/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/PlayAdvice.java index f21f313ce19..2ad8ab35e27 100644 --- a/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/PlayAdvice.java +++ b/dd-java-agent/instrumentation/play-2.3/src/main/java/datadog/trace/instrumentation/play23/PlayAdvice.java @@ -1,13 +1,14 @@ package datadog.trace.instrumentation.play23; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.play23.PlayHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.play23.PlayHttpServerDecorator.PLAY_REQUEST; import static datadog.trace.instrumentation.play23.PlayHttpServerDecorator.REPORT_HTTP_STATUS; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; @@ -19,35 +20,37 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter(@Advice.Argument(0) final Request req) { + public static ContextScope onEnter(@Advice.Argument(0) final Request req) { final AgentSpan span; + final ContextScope scope; if (activeSpan() == null) { Headers headers = req.headers(); - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(headers); + final Context extractedContext = DECORATE.extractContext(headers); span = DECORATE.startSpan(headers, extractedContext); + scope = extractedContext.with(span).attach(); } else { // An upstream framework (e.g. akka-http, netty) has already started the span. // Do not extract the context. span = startSpan(PLAY_REQUEST); span.setMeasured(true); + scope = span.attach(); } - final AgentScope scope = activateSpan(span); DECORATE.afterStart(span); return scope; } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Enter final AgentScope playControllerScope, + @Advice.Enter final ContextScope playControllerScope, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, @Advice.Argument(0) final Request req, @Advice.Return(readOnly = false) final Future responseFuture) { - final AgentSpan playControllerSpan = playControllerScope.span(); + final AgentSpan playControllerSpan = spanFromContext(playControllerScope.context()); // Call onRequest on return after tags are populated. - DECORATE.onRequest(playControllerSpan, req, req, null); + DECORATE.onRequest(playControllerSpan, req, req, (AgentSpanContext.Extracted) null); if (throwable == null) { responseFuture.onComplete( @@ -67,7 +70,7 @@ public static void stopTraceOnResponse( final AgentSpan rootSpan = activeSpan(); // set the resource name on the upstream akka/netty span if there is one if (rootSpan != null) { - DECORATE.onRequest(rootSpan, req, req, null); + DECORATE.onRequest(rootSpan, req, req, (AgentSpanContext.Extracted) null); } } } diff --git a/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayAdvice.java b/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayAdvice.java index 60b55add14f..985867ba9b0 100644 --- a/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayAdvice.java +++ b/dd-java-agent/instrumentation/play-2.4/src/main/java/datadog/trace/instrumentation/play24/PlayAdvice.java @@ -1,13 +1,14 @@ package datadog.trace.instrumentation.play24; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.play24.PlayHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.play24.PlayHttpServerDecorator.PLAY_REQUEST; import static datadog.trace.instrumentation.play24.PlayHttpServerDecorator.REPORT_HTTP_STATUS; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; @@ -19,8 +20,9 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter(@Advice.Argument(value = 0, readOnly = false) Request req) { + public static ContextScope onEnter(@Advice.Argument(value = 0, readOnly = false) Request req) { final AgentSpan span; + final ContextScope scope; // If we have already added a `play.request` span, then don't do it again if (req.tags().contains("_dd_HasPlayRequestSpan")) { @@ -29,16 +31,17 @@ public static AgentScope onEnter(@Advice.Argument(value = 0, readOnly = false) R if (activeSpan() == null) { final Headers headers = req.headers(); - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(headers); + final Context extractedContext = DECORATE.extractContext(headers); span = DECORATE.startSpan(headers, extractedContext); + scope = extractedContext.with(span).attach(); } else { // An upstream framework (e.g. akka-http, netty) has already started the span. // Do not extract the context. span = startSpan(PLAY_REQUEST); span.setMeasured(true); + scope = span.attach(); } - final AgentScope scope = activateSpan(span); DECORATE.afterStart(span); req = RequestHelper.withTag(req, "_dd_HasPlayRequestSpan", "true"); @@ -48,7 +51,7 @@ public static AgentScope onEnter(@Advice.Argument(value = 0, readOnly = false) R @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Enter final AgentScope playControllerScope, + @Advice.Enter final ContextScope playControllerScope, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, @Advice.Argument(0) final Request req, @@ -58,10 +61,10 @@ public static void stopTraceOnResponse( return; } - final AgentSpan playControllerSpan = playControllerScope.span(); + final AgentSpan playControllerSpan = spanFromContext(playControllerScope.context()); // Call onRequest on return after tags are populated. - DECORATE.onRequest(playControllerSpan, req, req, null); + DECORATE.onRequest(playControllerSpan, req, req, (AgentSpanContext.Extracted) null); if (throwable == null) { responseFuture.onComplete( @@ -81,7 +84,7 @@ public static void stopTraceOnResponse( final AgentSpan rootSpan = activeSpan(); // set the resource name on the upstream akka/netty span if there is one if (rootSpan != null) { - DECORATE.onRequest(rootSpan, req, req, null); + DECORATE.onRequest(rootSpan, req, req, (AgentSpanContext.Extracted) null); } } diff --git a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayAdvice.java b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayAdvice.java index ecd5b903e19..76249a2e955 100644 --- a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayAdvice.java +++ b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayAdvice.java @@ -1,14 +1,14 @@ package datadog.trace.instrumentation.play26; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.play26.PlayHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.play26.PlayHttpServerDecorator.PLAY_REQUEST; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities; import net.bytebuddy.asm.Advice; import play.api.mvc.Action; @@ -19,10 +19,11 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onEnter( + public static ContextScope onEnter( @Advice.Argument(value = 0, readOnly = false) Request req, - @Advice.Local("extractedContext") AgentSpanContext.Extracted extractedContext) { + @Advice.Local("extractedContext") Context extractedContext) { final AgentSpan span; + final ContextScope scope; // If we have already added a `play.request` span, then don't do it again if (req.attrs().contains(HasPlayRequestSpan.KEY)) { @@ -31,14 +32,16 @@ public static AgentScope onEnter( if (activeSpan() == null) { final Headers headers = req.headers(); - extractedContext = DECORATE.extract(headers); + extractedContext = DECORATE.extractContext(headers); span = DECORATE.startSpan(headers, extractedContext); + scope = extractedContext.with(span).attach(); } else { // An upstream framework (e.g. akka-http, netty) has already started the span. // Do not extract the context. span = startSpan(PLAY_REQUEST); + scope = span.attach(); } - final AgentScope scope = activateSpan(span); + span.setMeasured(true); DECORATE.afterStart(span); @@ -49,8 +52,8 @@ public static AgentScope onEnter( @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Enter final AgentScope playControllerScope, - @Advice.Local("extractedContext") AgentSpanContext.Extracted extractedContext, + @Advice.Enter final ContextScope playControllerScope, + @Advice.Local("extractedContext") Context extractedContext, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, @Advice.Argument(0) final Request req, @@ -60,7 +63,7 @@ public static void stopTraceOnResponse( return; } - final AgentSpan playControllerSpan = playControllerScope.span(); + final AgentSpan playControllerSpan = spanFromContext(playControllerScope.context()); // Call onRequest on return after tags are populated. DECORATE.onRequest(playControllerSpan, req, req, extractedContext); diff --git a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java index 898bf6b9230..3398cdff034 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java +++ b/dd-java-agent/instrumentation/ratpack-1.5/src/main/java/datadog/trace/instrumentation/ratpack/TracingHandler.java @@ -9,6 +9,7 @@ import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import io.netty.util.Attribute; import io.netty.util.AttributeKey; import ratpack.handling.Context; @@ -37,7 +38,7 @@ public void handle(final Context ctx) { // Relying on executor instrumentation to assume the netty span is in context as the parent. final AgentSpan ratpackSpan = startSpan(DECORATE.spanName()).setMeasured(true); DECORATE.afterStart(ratpackSpan); - DECORATE.onRequest(ratpackSpan, request, request, null); + DECORATE.onRequest(ratpackSpan, request, request, (AgentSpanContext.Extracted) null); ctx.getExecution().add(ratpackSpan); boolean setFinalizer = false; diff --git a/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/RestletInstrumentation.java b/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/RestletInstrumentation.java index 68b808ab66f..6e5ca6ac19a 100644 --- a/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/RestletInstrumentation.java +++ b/dd-java-agent/instrumentation/restlet-2.2/src/main/java/datadog/trace/instrumentation/restlet/RestletInstrumentation.java @@ -1,18 +1,18 @@ package datadog.trace.instrumentation.restlet; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.restlet.RestletDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; import com.sun.net.httpserver.HttpExchange; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; @AutoService(InstrumenterModule.class) @@ -53,10 +53,10 @@ public String[] helperClassNames() { public static class RestletHandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope beginRequest(@Advice.Argument(0) final HttpExchange exchange) { - AgentSpanContext.Extracted context = DECORATE.extract(exchange); + public static ContextScope beginRequest(@Advice.Argument(0) final HttpExchange exchange) { + Context context = DECORATE.extractContext(exchange); AgentSpan span = DECORATE.startSpan(exchange, context); - AgentScope scope = activateSpan(span); + ContextScope scope = context.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, exchange, exchange, context); DECORATE.onPeerConnection(span, exchange.getRemoteAddress()); @@ -66,14 +66,14 @@ public static AgentScope beginRequest(@Advice.Argument(0) final HttpExchange exc @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void finishRequest( - @Advice.Enter final AgentScope scope, + @Advice.Enter final ContextScope scope, @Advice.Argument(0) final HttpExchange exchange, @Advice.Thrown final Throwable error) { if (null == scope) { return; } - AgentSpan span = scope.span(); + AgentSpan span = spanFromContext(scope.context()); DECORATE.onResponse(span, exchange); if (null != error) { 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 27797f8ba8f..05ab205b723 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,9 +1,11 @@ package datadog.trace.instrumentation.servlet2; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.servlet2.Servlet2Decorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.ClassloaderConfigurationOverrides; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; @@ -11,9 +13,7 @@ import datadog.trace.api.GlobalTracer; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.instrumentation.servlet.ServletBlockingHelper; import java.security.Principal; import javax.servlet.ServletRequest; @@ -30,7 +30,7 @@ public static boolean onEnter( @Advice.This final Object servlet, @Advice.Argument(value = 0, readOnly = false) ServletRequest request, @Advice.Argument(value = 1, typing = Assigner.Typing.DYNAMIC) final ServletResponse response, - @Advice.Local("agentScope") AgentScope scope) { + @Advice.Local("contextScope") ContextScope scope) { final boolean invalidRequest = !(request instanceof HttpServletRequest); if (invalidRequest) { @@ -52,9 +52,9 @@ public static boolean onEnter( InstrumentationContext.get(ServletResponse.class, Integer.class).put(response, 200); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(httpServletRequest); + final Context extractedContext = DECORATE.extractContext(httpServletRequest); final AgentSpan span = DECORATE.startSpan(httpServletRequest, extractedContext); - scope = activateSpan(span); + scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, httpServletRequest, httpServletRequest, extractedContext); @@ -82,7 +82,7 @@ public static boolean onEnter( public static void stopSpan( @Advice.Argument(0) final ServletRequest request, @Advice.Argument(1) final ServletResponse response, - @Advice.Local("agentScope") final AgentScope scope, + @Advice.Local("contextScope") final ContextScope scope, @Advice.Thrown final Throwable throwable) { // Set user.principal regardless of who created this span. final Object spanAttr = request.getAttribute(DD_SPAN_ATTRIBUTE); @@ -98,7 +98,7 @@ public static void stopSpan( if (scope == null) { return; } - final AgentSpan span = scope.span(); + final AgentSpan span = spanFromContext(scope.context()); if (response instanceof HttpServletResponse) { DECORATE.onResponse( diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java index 00e57312bce..98d42161905 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java +++ b/dd-java-agent/instrumentation/servlet/request-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java @@ -1,21 +1,21 @@ package datadog.trace.instrumentation.servlet3; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_DISPATCH_SPAN_ATTRIBUTE; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_FIN_DISP_LIST_SPAN_ATTRIBUTE; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import static datadog.trace.instrumentation.servlet3.Servlet3Decorator.DECORATE; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.api.ClassloaderConfigurationOverrides; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; import datadog.trace.api.DDTags; import datadog.trace.api.GlobalTracer; import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.instrumentation.servlet.ServletBlockingHelper; import java.security.Principal; import java.util.concurrent.atomic.AtomicBoolean; @@ -33,7 +33,7 @@ public static boolean onEnter( @Advice.Argument(value = 1) ServletResponse response, @Advice.Local("isDispatch") boolean isDispatch, @Advice.Local("finishSpan") boolean finishSpan, - @Advice.Local("agentScope") AgentScope scope) { + @Advice.Local("contextScope") ContextScope scope) { final boolean invalidRequest = !(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse); if (invalidRequest) { @@ -53,7 +53,7 @@ public static boolean onEnter( // the dispatch span was already activated in Jetty's HandleAdvice. We let it finish the span // to avoid trying to finish twice finishSpan = activeSpan() != dispatchSpan; - scope = activateSpan(castDispatchSpan); + scope = castDispatchSpan.attach(); return false; } @@ -69,9 +69,9 @@ public static boolean onEnter( return false; } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(httpServletRequest); + final Context extractedContext = DECORATE.extractContext(httpServletRequest); final AgentSpan span = DECORATE.startSpan(httpServletRequest, extractedContext); - scope = activateSpan(span); + scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, httpServletRequest, httpServletRequest, extractedContext); @@ -97,7 +97,7 @@ public static boolean onEnter( public static void stopSpan( @Advice.Argument(0) final ServletRequest request, @Advice.Argument(1) final ServletResponse response, - @Advice.Local("agentScope") final AgentScope scope, + @Advice.Local("contextScope") final ContextScope scope, @Advice.Local("isDispatch") boolean isDispatch, @Advice.Local("finishSpan") boolean finishSpan, @Advice.Thrown final Throwable throwable) { @@ -119,7 +119,7 @@ public static void stopSpan( if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) { final HttpServletResponse resp = (HttpServletResponse) response; - final AgentSpan span = scope.span(); + final AgentSpan span = spanFromContext(scope.context()); if (request.isAsyncStarted()) { AtomicBoolean activated = new AtomicBoolean(); diff --git a/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHelper.scala b/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHelper.scala index f93e0c83a82..1c9ddeb47e4 100644 --- a/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHelper.scala +++ b/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHelper.scala @@ -30,7 +30,7 @@ object SprayHelper { def wrapRoute(route: Route): Route = { ctx => { - DECORATE.onRequest(activeSpan(), ctx, ctx.request, null) + DECORATE.onRequest(activeSpan(), ctx, ctx.request, null.asInstanceOf[AgentSpanContext.Extracted]) try route(ctx) catch { case NonFatal(e) => diff --git a/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHttpServerRunSealedRouteAdvice.java b/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHttpServerRunSealedRouteAdvice.java index 53df15ffd76..4c7821f4a07 100644 --- a/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHttpServerRunSealedRouteAdvice.java +++ b/dd-java-agent/instrumentation/spray-1.3/src/main/scala/datadog/trace/instrumentation/spray/SprayHttpServerRunSealedRouteAdvice.java @@ -1,43 +1,47 @@ package datadog.trace.instrumentation.spray; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.instrumentation.spray.SprayHttpServerDecorator.DECORATE; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import spray.http.HttpRequest; import spray.routing.RequestContext; public class SprayHttpServerRunSealedRouteAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope enter(@Advice.Argument(value = 1, readOnly = false) RequestContext ctx) { + public static ContextScope enter( + @Advice.Argument(value = 1, readOnly = false) RequestContext ctx) { final AgentSpan span; - final AgentSpanContext.Extracted extractedContext; + final Context extractedContext; + final ContextScope scope; if (activeSpan() == null) { // Propagate context in case income request was going through several routes // TODO: Add test for it final HttpRequest request = ctx.request(); - extractedContext = DECORATE.extract(request); + extractedContext = DECORATE.extractContext(request); span = DECORATE.startSpan(request, extractedContext); + scope = extractedContext.with(span).attach(); } else { extractedContext = null; span = startSpan(DECORATE.spanName()); + scope = span.attach(); } - final AgentScope scope = activateSpan(span); DECORATE.afterStart(span); - ctx = SprayHelper.wrapRequestContext(ctx, span, extractedContext); + ctx = + SprayHelper.wrapRequestContext( + ctx, span, DECORATE.getExtractedSpanContext(extractedContext)); return scope; } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void exit( - @Advice.Enter final AgentScope scope, @Advice.Thrown final Throwable throwable) { + @Advice.Enter final ContextScope scope, @Advice.Thrown final Throwable throwable) { if (throwable != null) { DECORATE.onError(scope, throwable); } diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java index 60e8e4944ef..48103d52600 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerAdapterInstrumentation.java @@ -20,6 +20,7 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import javax.servlet.http.HttpServletRequest; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -74,7 +75,8 @@ public static AgentScope nameResourceAndStartSpan( // Name the parent span based on the matching pattern Object parentSpan = request.getAttribute(DD_SPAN_ATTRIBUTE); if (parentSpan instanceof AgentSpan) { - DECORATE.onRequest((AgentSpan) parentSpan, request, request, null); + DECORATE.onRequest( + (AgentSpan) parentSpan, request, request, (AgentSpanContext.Extracted) null); } if (activeSpan() == null) { diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerMappingResourceNameFilter.java b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerMappingResourceNameFilter.java index 40e2441af6b..90dff2df129 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerMappingResourceNameFilter.java +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/src/main/java/datadog/trace/instrumentation/springweb/HandlerMappingResourceNameFilter.java @@ -4,6 +4,7 @@ import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import java.io.IOException; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -40,7 +41,11 @@ protected void doFilterInternal( if (findMapping(wrappedRequest)) { // Name the parent span based on the matching pattern // Let the parent span resource name be set with the attribute set in findMapping. - DECORATE.onRequest((AgentSpan) parentSpan, wrappedRequest, wrappedRequest, null); + DECORATE.onRequest( + (AgentSpan) parentSpan, + wrappedRequest, + wrappedRequest, + (AgentSpanContext.Extracted) null); } } catch (final Exception ignored) { // mapping.getHandler() threw exception. Ignore diff --git a/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java b/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java index 4753681acd7..b85449e17ce 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java +++ b/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/ControllerAdvice.java @@ -10,6 +10,7 @@ import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import jakarta.servlet.http.HttpServletRequest; import net.bytebuddy.asm.Advice; import org.springframework.web.method.HandlerMethod; @@ -25,7 +26,8 @@ public static AgentScope nameResourceAndStartSpan( // Name the parent span based on the matching pattern Object parentSpan = request.getAttribute(DD_SPAN_ATTRIBUTE); if (parentSpan instanceof AgentSpan) { - DECORATE.onRequest((AgentSpan) parentSpan, request, request, null); + DECORATE.onRequest( + (AgentSpan) parentSpan, request, request, (AgentSpanContext.Extracted) null); } if (activeSpan() == null) { diff --git a/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandlerMappingResourceNameFilter.java b/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandlerMappingResourceNameFilter.java index e821362e432..a75bee6ff98 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandlerMappingResourceNameFilter.java +++ b/dd-java-agent/instrumentation/spring-webmvc-6.0/src/main/java17/datadog/trace/instrumentation/springweb6/HandlerMappingResourceNameFilter.java @@ -3,6 +3,7 @@ import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -40,7 +41,10 @@ protected void doFilterInternal( // Name the parent span based on the matching pattern // Let the parent span resource name be set with the attribute set in findMapping. SpringWebHttpServerDecorator.DECORATE.onRequest( - (AgentSpan) parentSpan, wrappedRequest, wrappedRequest, null); + (AgentSpan) parentSpan, + wrappedRequest, + wrappedRequest, + (AgentSpanContext.Extracted) null); } } catch (final Exception ignored) { // mapping.getHandler() threw exception. Ignore diff --git a/dd-java-agent/instrumentation/synapse-3/src/main/java/datadog/trace/instrumentation/synapse3/SynapseServerInstrumentation.java b/dd-java-agent/instrumentation/synapse-3/src/main/java/datadog/trace/instrumentation/synapse3/SynapseServerInstrumentation.java index d95d4668d1e..a627b02d1e0 100644 --- a/dd-java-agent/instrumentation/synapse-3/src/main/java/datadog/trace/instrumentation/synapse3/SynapseServerInstrumentation.java +++ b/dd-java-agent/instrumentation/synapse-3/src/main/java/datadog/trace/instrumentation/synapse3/SynapseServerInstrumentation.java @@ -2,19 +2,19 @@ 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.startSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.synapse3.SynapseServerDecorator.DECORATE; import static datadog.trace.instrumentation.synapse3.SynapseServerDecorator.SYNAPSE_SPAN_KEY; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import net.bytebuddy.asm.Advice; import org.apache.http.HttpRequest; import org.apache.http.nio.NHttpServerConnection; @@ -63,21 +63,23 @@ public void methodAdvice(final MethodTransformer transformer) { public static final class ServerRequestAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope beginRequest( + public static ContextScope beginRequest( @Advice.Argument(0) final NHttpServerConnection connection) { // check incoming request for distributed trace ids HttpRequest request = connection.getHttpRequest(); - AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + Context extractedContext = DECORATE.extractContext(request); + ContextScope scope; AgentSpan span; if (null != extractedContext) { span = DECORATE.startSpan(request, extractedContext); + scope = extractedContext.with(span).attach(); } else { span = startSpan(DECORATE.spanName()); span.setMeasured(true); + scope = span.attach(); } - AgentScope scope = activateSpan(span); DECORATE.afterStart(span); DECORATE.onRequest(span, connection, request, extractedContext); @@ -88,19 +90,19 @@ public static AgentScope beginRequest( } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void requestReceived(@Advice.Enter final AgentScope scope) { + public static void requestReceived(@Advice.Enter final ContextScope scope) { scope.close(); } } public static final class ServerResponseAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope beginResponse( + public static ContextScope beginResponse( @Advice.Argument(0) final NHttpServerConnection connection) { // check and remove span from context so it won't be finished twice AgentSpan span = (AgentSpan) connection.getContext().removeAttribute(SYNAPSE_SPAN_KEY); if (null != span) { - return activateSpan(span); + return span.attach(); } return null; } @@ -108,12 +110,12 @@ public static AgentScope beginResponse( @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void responseReady( @Advice.Argument(0) final NHttpServerConnection connection, - @Advice.Enter final AgentScope scope, + @Advice.Enter final ContextScope scope, @Advice.Thrown final Throwable error) { if (null == scope) { return; } - AgentSpan span = scope.span(); + AgentSpan span = spanFromContext(scope.context()); DECORATE.onResponse(span, connection.getHttpResponse()); if (null != error) { DECORATE.onError(span, error); diff --git a/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java b/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java index 12ec6f6a07a..7b2288b869d 100644 --- a/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java +++ b/dd-java-agent/instrumentation/tomcat-5.5/src/main/java/datadog/trace/instrumentation/tomcat/TomcatServerInstrumentation.java @@ -126,9 +126,10 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque final Context extractedContext = DECORATE.extractContext(req); // TODO: Migrate setting DD_EXTRACTED_CONTEXT_ATTRIBUTE from AgentSpanContext.Extracted to // Context - req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getSpanContext(extractedContext)); + req.setAttribute( + DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getExtractedSpanContext(extractedContext)); - final AgentSpan span = DECORATE.startSpanFromContext("http-server", req, extractedContext); + final AgentSpan span = DECORATE.startSpan(req, extractedContext); final ContextScope scope = extractedContext.with(span).attach(); // This span is finished when Request.recycle() is called by RequestInstrumentation. diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HandlerInstrumentation.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HandlerInstrumentation.java index 8192c5a9840..291cc95bec1 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HandlerInstrumentation.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.undertow; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; import static datadog.trace.instrumentation.undertow.UndertowBlockingHandler.REQUEST_BLOCKING_DATA; import static datadog.trace.instrumentation.undertow.UndertowBlockingHandler.TRACE_SEGMENT; @@ -14,12 +13,13 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.gateway.Flow.Action.RequestBlockingAction; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; @@ -71,7 +71,7 @@ public static class ExecuteRootHandlerAdvice { public static void onEnter( @Advice.Argument(value = 0, readOnly = false) HttpHandler handler, @Advice.Argument(1) final HttpServerExchange exchange, - @Advice.Local("agentScope") AgentScope scope) { + @Advice.Local("contextScope") ContextScope scope) { AgentSpan activeSpan = AgentTracer.activeSpan(); if (activeSpan != null) { AgentSpan localRootSpan = activeSpan.getLocalRootSpan(); @@ -89,13 +89,13 @@ public static void onEnter( AgentScope.Continuation continuation = exchange.getAttachment(DD_UNDERTOW_CONTINUATION); if (continuation != null) { // not yet complete, not ready to do final activation of continuation - scope = activateSpan(continuation.span()); + scope = continuation.span().attach(); return; } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(exchange); + final Context extractedContext = DECORATE.extractContext(exchange); final AgentSpan span = DECORATE.startSpan(exchange, extractedContext).setMeasured(true); - scope = activateSpan(span); + scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, exchange, exchange, extractedContext); @@ -118,7 +118,7 @@ public static void onEnter( } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void closeScope(@Advice.Local("agentScope") final AgentScope scope) { + public static void closeScope(@Advice.Local("contextScope") final ContextScope scope) { if (scope == null) { return; } diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpRequestParserInstrumentation.java b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpRequestParserInstrumentation.java index cd205d013ef..f1057d6d28c 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpRequestParserInstrumentation.java +++ b/dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/HttpRequestParserInstrumentation.java @@ -2,18 +2,17 @@ import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.extendsClass; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.instrumentation.undertow.UndertowDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import com.google.auto.service.AutoService; +import datadog.context.Context; +import datadog.context.ContextScope; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import io.undertow.server.HttpServerExchange; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -72,12 +71,12 @@ public static void afterRequestParse( // this because undertow will just write down a http 400 raw response over the net channel. // Here we try to create a span to record this AgentSpan span = activeSpan(); - AgentScope scope = null; + ContextScope scope = null; try { if (span == null) { - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(exchange); + final Context extractedContext = DECORATE.extractContext(exchange); span = DECORATE.startSpan(exchange, extractedContext).setMeasured(true); - scope = activateSpan(span); + scope = extractedContext.with(span).attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, exchange, exchange, extractedContext); }