From 54cdafc3a2799aa3bb994868b6d04f03ee248be4 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Tue, 6 May 2025 15:44:16 -0400 Subject: [PATCH 01/13] supporting baggage in weblog related instrumentations resolve merge conflicts --- .../decorator/HttpServerDecorator.java | 42 +++++++++++++++++++ .../okhttp3/TracingInterceptor.java | 4 +- .../tomcat/TomcatServerInstrumentation.java | 13 +++--- 3 files changed, 52 insertions(+), 7 deletions(-) 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 29e33a3dd8c..d6f5c2e08f2 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 @@ -4,10 +4,14 @@ import static datadog.trace.api.datastreams.DataStreamsContext.fromTags; import static datadog.trace.api.gateway.Events.EVENTS; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.extractContextAndGetSpanContext; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.traceConfig; import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR; import datadog.appsec.api.blocking.BlockingException; +import datadog.context.Context; +import datadog.context.ContextScope; +import datadog.context.propagation.Propagators; import datadog.trace.api.Config; import datadog.trace.api.DDTags; import datadog.trace.api.function.TriConsumer; @@ -24,6 +28,7 @@ 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.api.Baggage; import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities; import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities; @@ -132,6 +137,15 @@ public AgentSpanContext.Extracted extract(REQUEST_CARRIER carrier) { return extractContextAndGetSpanContext(carrier, getter); } + public Context extractContext(REQUEST_CARRIER carrier) { + AgentPropagation.ContextVisitor getter = getter(); + if (null == carrier || null == getter) { + return null; + } + Context context = Propagators.defaultPropagator().extract(Context.root(), carrier, getter); + return context; + } + /** Deprecated. Use {@link #startSpan(String, Object, AgentSpanContext.Extracted)} instead. */ @Deprecated public AgentSpan startSpan(REQUEST_CARRIER carrier, AgentSpanContext.Extracted context) { @@ -155,6 +169,34 @@ public AgentSpan startSpan( return span; } + public AgentSpan startSpan( + String instrumentationName, REQUEST_CARRIER carrier, Context context) { + AgentSpan extractedSpan = AgentSpan.fromContext(context); + AgentSpanContext.Extracted extractedContext = extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); + AgentSpan span = + tracer() + .startSpan(instrumentationName, spanName(), callIGCallbackStart(extractedContext)) + .setMeasured(true); + Flow flow = callIGCallbackRequestHeaders(span, carrier); + if (flow.getAction() instanceof Flow.Action.RequestBlockingAction) { + span.setRequestBlockingAction((Flow.Action.RequestBlockingAction) flow.getAction()); + } + AgentPropagation.ContextVisitor getter = getter(); + if (null != carrier && null != getter) { + tracer().getDataStreamsMonitoring().setCheckpoint(span, fromTags(SERVER_PATHWAY_EDGE_TAGS)); + } + return span; + } + + /* Verify whether we have only span contexts or more contexts */ + public ContextScope activateScope(Context context, AgentSpan span){ + Baggage baggage = Baggage.fromContext(context); + if (baggage == null) { + return span.attach(); + } + return context.with(span).attach(); + } + public AgentSpan onRequest( final AgentSpan span, final CONNECTION connection, diff --git a/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java b/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java index fa9b076cae8..0a6494fb854 100644 --- a/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java +++ b/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java @@ -8,6 +8,7 @@ import static datadog.trace.instrumentation.okhttp3.OkHttpClientDecorator.OKHTTP_REQUEST; import static datadog.trace.instrumentation.okhttp3.RequestBuilderInjectAdapter.SETTER; +import datadog.context.Context; import datadog.trace.api.datastreams.DataStreamsContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -31,7 +32,8 @@ public Response intercept(final Chain chain) throws IOException { final Request.Builder requestBuilder = chain.request().newBuilder(); DataStreamsContext dsmContext = DataStreamsContext.fromTags(CLIENT_PATHWAY_EDGE_TAGS); - defaultPropagator().inject(span.with(dsmContext), requestBuilder, SETTER); + Context context = Context.current(); + defaultPropagator().inject(context.with(span).with(dsmContext), requestBuilder, SETTER); final Response response; try { 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 3ae2690d000..00062586e31 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 @@ -12,6 +12,8 @@ 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.ExcludeFilterProvider; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; @@ -19,7 +21,6 @@ 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 datadog.trace.bootstrap.instrumentation.api.AgentTracer; @@ -114,7 +115,7 @@ public void methodAdvice(MethodTransformer transformer) { public static class ServiceAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope onService(@Advice.Argument(0) org.apache.coyote.Request req) { + public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Request req) { Object existingSpan = req.getAttribute(DD_SPAN_ATTRIBUTE); if (existingSpan instanceof AgentSpan) { @@ -122,11 +123,11 @@ public static AgentScope onService(@Advice.Argument(0) org.apache.coyote.Request return activateSpan((AgentSpan) existingSpan); } - final AgentSpanContext.Extracted extractedContext = DECORATE.extract(req); + final Context extractedContext = DECORATE.extractContext(req); req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedContext); - final AgentSpan span = DECORATE.startSpan(req, extractedContext); - final AgentScope scope = activateSpan(span); + final AgentSpan span = DECORATE.startSpan("http-server", req, extractedContext); + final ContextScope scope = DECORATE.activateScope(extractedContext, span); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); @@ -137,7 +138,7 @@ public static AgentScope onService(@Advice.Argument(0) org.apache.coyote.Request } @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(); } From 16094c942c77de7b155821bb17bab0a1a874dead Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Tue, 6 May 2025 16:07:46 -0400 Subject: [PATCH 02/13] simplifying startSpan --- .../decorator/HttpServerDecorator.java | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) 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 d6f5c2e08f2..3525a6f5718 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 @@ -4,7 +4,6 @@ import static datadog.trace.api.datastreams.DataStreamsContext.fromTags; import static datadog.trace.api.gateway.Events.EVENTS; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.extractContextAndGetSpanContext; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.traceConfig; import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR; @@ -169,27 +168,15 @@ public AgentSpan startSpan( return span; } - public AgentSpan startSpan( - String instrumentationName, REQUEST_CARRIER carrier, Context context) { + public AgentSpan startSpan(String instrumentationName, REQUEST_CARRIER carrier, Context context) { AgentSpan extractedSpan = AgentSpan.fromContext(context); - AgentSpanContext.Extracted extractedContext = extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); - AgentSpan span = - tracer() - .startSpan(instrumentationName, spanName(), callIGCallbackStart(extractedContext)) - .setMeasured(true); - Flow flow = callIGCallbackRequestHeaders(span, carrier); - if (flow.getAction() instanceof Flow.Action.RequestBlockingAction) { - span.setRequestBlockingAction((Flow.Action.RequestBlockingAction) flow.getAction()); - } - AgentPropagation.ContextVisitor getter = getter(); - if (null != carrier && null != getter) { - tracer().getDataStreamsMonitoring().setCheckpoint(span, fromTags(SERVER_PATHWAY_EDGE_TAGS)); - } - return span; + AgentSpanContext.Extracted extractedContext = + extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); + return startSpan(instrumentationName, carrier, extractedContext); } /* Verify whether we have only span contexts or more contexts */ - public ContextScope activateScope(Context context, AgentSpan span){ + public ContextScope activateScope(Context context, AgentSpan span) { Baggage baggage = Baggage.fromContext(context); if (baggage == null) { return span.attach(); From ed234d3d239b35d7b4cbd17242d6043cf1564f79 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Tue, 6 May 2025 16:20:28 -0400 Subject: [PATCH 03/13] adding support for AzureFunctionsInstrumentation --- .../decorator/HttpServerDecorator.java | 6 ++--- .../AzureFunctionsInstrumentation.java | 23 +++++++++++-------- .../tomcat/TomcatServerInstrumentation.java | 4 +++- 3 files changed, 18 insertions(+), 15 deletions(-) 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 3525a6f5718..e3abfe80cb1 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 @@ -168,11 +168,9 @@ public AgentSpan startSpan( return span; } - public AgentSpan startSpan(String instrumentationName, REQUEST_CARRIER carrier, Context context) { + public AgentSpanContext.Extracted getExtractedSpanContext(Context context) { AgentSpan extractedSpan = AgentSpan.fromContext(context); - AgentSpanContext.Extracted extractedContext = - extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); - return startSpan(instrumentationName, carrier, extractedContext); + return extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); } /* Verify whether we have only span contexts or more contexts */ 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..abe348ba0b8 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,6 @@ 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.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR; import static datadog.trace.instrumentation.azurefunctions.AzureFunctionsDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -14,11 +13,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 +63,28 @@ 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 AgentSpan span = DECORATE.startSpan(request, extractedContext); + final Context extractedContext = DECORATE.extractContext(request); + final AgentSpan span = + DECORATE.startSpan( + "http-server", request, DECORATE.getExtractedSpanContext(extractedContext)); DECORATE.afterStart(span, context.getFunctionName()); - DECORATE.onRequest(span, request, request, extractedContext); + DECORATE.onRequest( + span, request, request, DECORATE.getExtractedSpanContext(extractedContext)); HTTP_RESOURCE_DECORATOR.withRoute( span, request.getHttpMethod().name(), request.getUri().getPath()); - return activateSpan(span); + return DECORATE.activateScope(extractedContext, span); } @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 Context context = scope.context(); + final AgentSpan span = AgentSpan.fromContext(context); DECORATE.onError(span, throwable); DECORATE.onResponse(span, response); DECORATE.beforeFinish(span); 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 00062586e31..72676a9b79d 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,7 +126,9 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque final Context extractedContext = DECORATE.extractContext(req); req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedContext); - final AgentSpan span = DECORATE.startSpan("http-server", req, extractedContext); + final AgentSpan span = + DECORATE.startSpan( + "http-server", req, DECORATE.getExtractedSpanContext(extractedContext)); final ContextScope scope = DECORATE.activateScope(extractedContext, span); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); From a7a35a62c622549d96cedff9e0e7b9468705c134 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Tue, 6 May 2025 16:25:08 -0400 Subject: [PATCH 04/13] cleanup --- .../instrumentation/decorator/HttpServerDecorator.java | 3 +-- .../trace/instrumentation/okhttp3/TracingInterceptor.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) 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 e3abfe80cb1..0bd57313bf3 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 @@ -141,8 +141,7 @@ public Context extractContext(REQUEST_CARRIER carrier) { if (null == carrier || null == getter) { return null; } - Context context = Propagators.defaultPropagator().extract(Context.root(), carrier, getter); - return context; + return Propagators.defaultPropagator().extract(Context.root(), carrier, getter); } /** Deprecated. Use {@link #startSpan(String, Object, AgentSpanContext.Extracted)} instead. */ diff --git a/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java b/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java index 0a6494fb854..3732f695486 100644 --- a/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java +++ b/dd-java-agent/instrumentation/okhttp-3/src/main/java/datadog/trace/instrumentation/okhttp3/TracingInterceptor.java @@ -32,8 +32,8 @@ public Response intercept(final Chain chain) throws IOException { final Request.Builder requestBuilder = chain.request().newBuilder(); DataStreamsContext dsmContext = DataStreamsContext.fromTags(CLIENT_PATHWAY_EDGE_TAGS); - Context context = Context.current(); - defaultPropagator().inject(context.with(span).with(dsmContext), requestBuilder, SETTER); + defaultPropagator() + .inject(Context.current().with(span).with(dsmContext), requestBuilder, SETTER); final Response response; try { From 8a5c90f5d765dd4df5d13f056af248097339ddf1 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Tue, 6 May 2025 16:50:03 -0400 Subject: [PATCH 05/13] updateing grizzly instrumentations --- .../GrizzlyHttpHandlerInstrumentation.java | 20 +++++++++---------- .../grizzlyhttp232/GrizzlyDecorator.java | 14 ++++++------- 2 files changed, 16 insertions(+), 18 deletions(-) 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..45a3a0be8d3 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,20 @@ 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.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 +65,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 AgentSpan span = DECORATE.startSpan(request, parentContext); + final Context context = DECORATE.extractContext(request); + final AgentSpan span = DECORATE.startSpan(request, DECORATE.getExtractedSpanContext(context)); DECORATE.afterStart(span); - DECORATE.onRequest(span, request, request, parentContext); + DECORATE.onRequest(span, request, request, DECORATE.getExtractedSpanContext(context)); - scope = activateSpan(span); + scope = DECORATE.activateScope(context, span); request.setAttribute(DD_SPAN_ATTRIBUTE, span); request.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); @@ -101,14 +100,15 @@ 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 Context context = scope.context(); + final AgentSpan span = AgentSpan.fromContext(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..cbba815f080 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,13 +112,13 @@ public static NextAction onHttpCodecFilterExit( } HttpRequestPacket httpRequest = (HttpRequestPacket) httpHeader; HttpResponsePacket httpResponse = httpRequest.getResponse(); - AgentSpanContext.Extracted context = DECORATE.extract(httpRequest); - AgentSpan span = DECORATE.startSpan(httpRequest, context); - AgentScope scope = activateSpan(span); + Context context = DECORATE.extractContext(httpRequest); + AgentSpan span = DECORATE.startSpan(httpRequest, DECORATE.getExtractedSpanContext(context)); + ContextScope scope = DECORATE.activateScope(context, span); DECORATE.afterStart(span); ctx.getAttributes().setAttribute(DD_SPAN_ATTRIBUTE, span); ctx.getAttributes().setAttribute(DD_RESPONSE_ATTRIBUTE, httpResponse); - DECORATE.onRequest(span, httpRequest, httpRequest, context); + DECORATE.onRequest(span, httpRequest, httpRequest, DECORATE.getExtractedSpanContext(context)); Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null && thiz instanceof HttpServerFilter) { From aacc0a068734535bb9058529c4a314323270a925 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 7 May 2025 13:04:01 -0400 Subject: [PATCH 06/13] updating PR comments and addressing failing unit tests --- .../decorator/HttpServerDecorator.java | 18 +++++---------- .../AzureFunctionsInstrumentation.java | 23 ++++++++----------- .../GrizzlyHttpHandlerInstrumentation.java | 20 ++++++++-------- .../grizzlyhttp232/GrizzlyDecorator.java | 14 ++++++----- .../tomcat/TomcatServerInstrumentation.java | 11 +++++---- 5 files changed, 40 insertions(+), 46 deletions(-) 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 0bd57313bf3..4b77d83440e 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 @@ -9,7 +9,6 @@ import datadog.appsec.api.blocking.BlockingException; import datadog.context.Context; -import datadog.context.ContextScope; import datadog.context.propagation.Propagators; import datadog.trace.api.Config; import datadog.trace.api.DDTags; @@ -27,7 +26,6 @@ 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.api.Baggage; import datadog.trace.bootstrap.instrumentation.api.ErrorPriorities; import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities; @@ -128,6 +126,7 @@ protected AgentTracer.TracerAPI tracer() { return AgentTracer.get(); } + /** Deprecated. Use {@link #extractContext(REQUEST_CARRIER)} instead. */ public AgentSpanContext.Extracted extract(REQUEST_CARRIER carrier) { AgentPropagation.ContextVisitor getter = getter(); if (null == carrier || null == getter) { @@ -144,7 +143,7 @@ public Context extractContext(REQUEST_CARRIER carrier) { return Propagators.defaultPropagator().extract(Context.root(), carrier, getter); } - /** Deprecated. Use {@link #startSpan(String, Object, AgentSpanContext.Extracted)} instead. */ + /** Deprecated. Use {@link #startSpan(String, Object, Context)} instead. */ @Deprecated public AgentSpan startSpan(REQUEST_CARRIER carrier, AgentSpanContext.Extracted context) { return startSpan("http-server", carrier, context); @@ -167,20 +166,15 @@ public AgentSpan startSpan( return span; } + public AgentSpan startSpan(String instrumentationName, REQUEST_CARRIER carrier, Context context) { + return startSpan(instrumentationName, carrier, getExtractedSpanContext(context)); + } + public AgentSpanContext.Extracted getExtractedSpanContext(Context context) { AgentSpan extractedSpan = AgentSpan.fromContext(context); return extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); } - /* Verify whether we have only span contexts or more contexts */ - public ContextScope activateScope(Context context, AgentSpan span) { - Baggage baggage = Baggage.fromContext(context); - if (baggage == null) { - return span.attach(); - } - return context.with(span).attach(); - } - public AgentSpan onRequest( final AgentSpan span, final CONNECTION connection, 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 abe348ba0b8..604b5d77c42 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,6 +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.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR; import static datadog.trace.instrumentation.azurefunctions.AzureFunctionsDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -13,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; @@ -63,28 +64,24 @@ public void methodAdvice(MethodTransformer transformer) { public static class AzureFunctionsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static ContextScope methodEnter( + public static AgentScope methodEnter( @Advice.Argument(0) final HttpRequestMessage request, @Advice.Argument(1) final ExecutionContext context) { - final Context extractedContext = DECORATE.extractContext(request); - final AgentSpan span = - DECORATE.startSpan( - "http-server", request, DECORATE.getExtractedSpanContext(extractedContext)); + final AgentSpanContext.Extracted extractedContext = DECORATE.extract(request); + final AgentSpan span = DECORATE.startSpan(request, extractedContext); DECORATE.afterStart(span, context.getFunctionName()); - DECORATE.onRequest( - span, request, request, DECORATE.getExtractedSpanContext(extractedContext)); + DECORATE.onRequest(span, request, request, extractedContext); HTTP_RESOURCE_DECORATOR.withRoute( span, request.getHttpMethod().name(), request.getUri().getPath()); - return DECORATE.activateScope(extractedContext, span); + return activateSpan(span); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Enter final ContextScope scope, + @Advice.Enter final AgentScope scope, @Advice.Return final HttpResponseMessage response, @Advice.Thrown final Throwable throwable) { - final Context context = scope.context(); - final AgentSpan span = AgentSpan.fromContext(context); + final AgentSpan span = scope.span(); 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 45a3a0be8d3..f556f9bf920 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,20 +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.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; @@ -65,19 +66,19 @@ public static class HandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class, skipOn = Advice.OnNonDefaultValue.class) public static boolean /* skip body */ methodEnter( - @Advice.Local("contextScope") ContextScope scope, + @Advice.Local("agentScope") AgentScope scope, @Advice.Argument(0) final Request request, @Advice.Argument(1) final Response response) { if (request.getAttribute(DD_SPAN_ATTRIBUTE) != null) { return false; } - final Context context = DECORATE.extractContext(request); - final AgentSpan span = DECORATE.startSpan(request, DECORATE.getExtractedSpanContext(context)); + final AgentSpanContext.Extracted parentContext = DECORATE.extract(request); + final AgentSpan span = DECORATE.startSpan(request, parentContext); DECORATE.afterStart(span); - DECORATE.onRequest(span, request, request, DECORATE.getExtractedSpanContext(context)); + DECORATE.onRequest(span, request, request, parentContext); - scope = DECORATE.activateScope(context, span); + scope = activateSpan(span); request.setAttribute(DD_SPAN_ATTRIBUTE, span); request.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); @@ -100,15 +101,14 @@ public static class HandleAdvice { public static void methodExit( @Advice.Enter boolean skippedBody, @Advice.Return(readOnly = false) boolean retVal, - @Advice.Local("contextScope") ContextScope scope, + @Advice.Local("agentScope") AgentScope scope, @Advice.Thrown final Throwable throwable) { if (scope == null) { return; } if (throwable != null) { - final Context context = scope.context(); - final AgentSpan span = AgentSpan.fromContext(context); + final AgentSpan span = scope.span(); 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 cbba815f080..1f8029a0940 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,15 +1,17 @@ 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; @@ -112,13 +114,13 @@ public static NextAction onHttpCodecFilterExit( } HttpRequestPacket httpRequest = (HttpRequestPacket) httpHeader; HttpResponsePacket httpResponse = httpRequest.getResponse(); - Context context = DECORATE.extractContext(httpRequest); - AgentSpan span = DECORATE.startSpan(httpRequest, DECORATE.getExtractedSpanContext(context)); - ContextScope scope = DECORATE.activateScope(context, span); + AgentSpanContext.Extracted context = DECORATE.extract(httpRequest); + AgentSpan span = DECORATE.startSpan(httpRequest, context); + AgentScope scope = activateSpan(span); DECORATE.afterStart(span); ctx.getAttributes().setAttribute(DD_SPAN_ATTRIBUTE, span); ctx.getAttributes().setAttribute(DD_RESPONSE_ATTRIBUTE, httpResponse); - DECORATE.onRequest(span, httpRequest, httpRequest, DECORATE.getExtractedSpanContext(context)); + DECORATE.onRequest(span, httpRequest, httpRequest, context); Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null && thiz instanceof HttpServerFilter) { 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 72676a9b79d..f67419f81da 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 @@ -124,12 +124,13 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque } final Context extractedContext = DECORATE.extractContext(req); - req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, extractedContext); + // TODO: Migrate setting DD_EXTRACTED_CONTEXT_ATTRIBUTE from AgentSpanContext.Extracted to + // Context + req.setAttribute( + DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getExtractedSpanContext(extractedContext)); - final AgentSpan span = - DECORATE.startSpan( - "http-server", req, DECORATE.getExtractedSpanContext(extractedContext)); - final ContextScope scope = DECORATE.activateScope(extractedContext, span); + final AgentSpan span = DECORATE.startSpan("http-server", req, extractedContext); + final ContextScope scope = extractedContext.with(span).attach(); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); From 2d3aed6b6af71ac1294bd96f6eaacc5b44ad802a Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 7 May 2025 15:16:55 -0400 Subject: [PATCH 07/13] fixing ambiguous overloading tests --- .../instrumentation/decorator/HttpServerDecorator.java | 5 +++-- .../instrumentation/tomcat/TomcatServerInstrumentation.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) 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 4b77d83440e..511cb899dce 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 @@ -143,7 +143,7 @@ public Context extractContext(REQUEST_CARRIER carrier) { return Propagators.defaultPropagator().extract(Context.root(), carrier, getter); } - /** Deprecated. Use {@link #startSpan(String, Object, Context)} instead. */ + /** Deprecated. Use {@link #startSpanFromContext(String, Object, Context)} instead. */ @Deprecated public AgentSpan startSpan(REQUEST_CARRIER carrier, AgentSpanContext.Extracted context) { return startSpan("http-server", carrier, context); @@ -166,7 +166,8 @@ public AgentSpan startSpan( return span; } - public AgentSpan startSpan(String instrumentationName, REQUEST_CARRIER carrier, Context context) { + public AgentSpan startSpanFromContext( + String instrumentationName, REQUEST_CARRIER carrier, Context context) { return startSpan(instrumentationName, carrier, getExtractedSpanContext(context)); } 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 f67419f81da..f3aa751ab62 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 @@ -129,7 +129,7 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque req.setAttribute( DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getExtractedSpanContext(extractedContext)); - final AgentSpan span = DECORATE.startSpan("http-server", req, extractedContext); + final AgentSpan span = DECORATE.startSpanFromContext("http-server", req, extractedContext); final ContextScope scope = extractedContext.with(span).attach(); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); From 0968d402803851e34a8816d5902145a21ba93ca8 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 8 May 2025 09:33:13 -0400 Subject: [PATCH 08/13] logging --- .../tomcat/TomcatServerInstrumentation.java | 1 + .../agent/test/base/HttpServerTest.groovy | 3 ++- .../scopemanager/ContinuableScopeManager.java | 24 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) 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 f3aa751ab62..297b199f8a4 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 @@ -131,6 +131,7 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque final AgentSpan span = DECORATE.startSpanFromContext("http-server", req, extractedContext); final ContextScope scope = extractedContext.with(span).attach(); +// final ContextScope scope = activateSpan(span); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index 97c1ef36b83..eea22ea2f00 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -1044,7 +1044,8 @@ abstract class HttpServerTest extends WithHttpServer { if (isDataStreamsEnabled()) { TEST_DATA_STREAMS_WRITER.waitForGroups(1) } - + println(request) + println(response) expect: if (bubblesResponse()) { assert response.code() == REDIRECT.status diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index 5f75a9bd644..41d91399739 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -36,6 +36,8 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; + +import de.thetaphi.forbiddenapis.SuppressForbidden; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -122,6 +124,7 @@ private AgentScope.Continuation captureSpan(Context context, byte source, AgentS return new ScopeContinuation(this, context, source, traceCollector).register(); } + @SuppressForbidden private AgentScope activate( final AgentSpan span, final byte source, @@ -155,12 +158,20 @@ private AgentScope activate( final ContinuableScope scope = new ContinuableScope(this, context, source, asyncPropagation, createScopeState(context)); + System.out.println("Scope size prior: " + scopeStack.depth()); scopeStack.push(scope); + System.out.println("Scope size prior: " + scopeStack.depth()); healthMetrics.onActivateScope(); + if (iterationKeepAlive > 0 && currentDepth == 0) { + // For context-based scopes, only add them if they're going to be long-lived + scheduleRootIterationScopeCleanup(scopeStack, scope); + } + return scope; } + @SuppressForbidden private AgentScope activate(final Context context) { ScopeStack scopeStack = scopeStack(); @@ -185,9 +196,17 @@ private AgentScope activate(final Context context) { final ContinuableScope scope = new ContinuableScope(this, context, CONTEXT, asyncPropagation, createScopeState(context)); + System.out.println("Context: " + context); + System.out.println("Scope size prior: " + scopeStack.depth()); scopeStack.push(scope); + System.out.println("Scope size prior: " + scopeStack.depth()); healthMetrics.onActivateScope(); + if (iterationKeepAlive > 0 && currentDepth == 0) { + // For context-based scopes, only add them if they're going to be long-lived + scheduleRootIterationScopeCleanup(scopeStack, scope); + } + return scope; } @@ -304,8 +323,13 @@ public void rollbackActiveToCheckpoint() { } } + @SuppressForbidden public AgentSpan activeSpan() { final ContinuableScope active = scopeStack().active(); + + System.out.println("Scope size prior: " + scopeStack().depth()); + System.out.println("scopeStack(): " + scopeStack()); + System.out.println("active: " + active); return active == null ? null : active.span(); } From 7a956f70b8c7df4a46d17f6a93899913a17efb25 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 8 May 2025 09:33:25 -0400 Subject: [PATCH 09/13] logging 2 --- .../datadog/trace/agent/test/base/HttpServerTest.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index eea22ea2f00..a546c2d365c 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -1044,8 +1044,8 @@ abstract class HttpServerTest extends WithHttpServer { if (isDataStreamsEnabled()) { TEST_DATA_STREAMS_WRITER.waitForGroups(1) } - println(request) - println(response) +// println(request) +// println(response) expect: if (bubblesResponse()) { assert response.code() == REDIRECT.status From e2fb44cbd5e16fc4580b9ea9d17528964ccaa3c2 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 8 May 2025 10:05:29 -0400 Subject: [PATCH 10/13] spotless --- .../instrumentation/decorator/HttpServerDecorator.java | 1 + .../instrumentation/tomcat/TomcatServerInstrumentation.java | 2 +- .../datadog/trace/agent/test/base/HttpServerTest.groovy | 4 ++-- .../trace/core/scopemanager/ContinuableScopeManager.java | 3 +-- 4 files changed, 5 insertions(+), 5 deletions(-) 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 511cb899dce..28a3d1ecd7e 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 @@ -9,6 +9,7 @@ import datadog.appsec.api.blocking.BlockingException; import datadog.context.Context; +import datadog.context.InferredProxyContext; import datadog.context.propagation.Propagators; import datadog.trace.api.Config; import datadog.trace.api.DDTags; 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 297b199f8a4..27db8ea11d3 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 @@ -131,7 +131,7 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque final AgentSpan span = DECORATE.startSpanFromContext("http-server", req, extractedContext); final ContextScope scope = extractedContext.with(span).attach(); -// final ContextScope scope = activateSpan(span); + // final ContextScope scope = activateSpan(span); // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index a546c2d365c..1d061150ba2 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -1044,8 +1044,8 @@ abstract class HttpServerTest extends WithHttpServer { if (isDataStreamsEnabled()) { TEST_DATA_STREAMS_WRITER.waitForGroups(1) } -// println(request) -// println(response) + // println(request) + // println(response) expect: if (bubblesResponse()) { assert response.code() == REDIRECT.status diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index 41d91399739..ad184cdb37a 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -29,6 +29,7 @@ import datadog.trace.core.monitor.HealthMetrics; import datadog.trace.relocate.api.RatelimitedLogger; import datadog.trace.util.AgentTaskScheduler; +import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -36,8 +37,6 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.TimeUnit; - -import de.thetaphi.forbiddenapis.SuppressForbidden; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 6b9b6e1bb9e881684030eb3f0236f48805cd2d3e Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Mon, 12 May 2025 12:48:00 -0400 Subject: [PATCH 11/13] spotlesS --- .../bootstrap/instrumentation/decorator/HttpServerDecorator.java | 1 - 1 file changed, 1 deletion(-) 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 28a3d1ecd7e..511cb899dce 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 @@ -9,7 +9,6 @@ import datadog.appsec.api.blocking.BlockingException; import datadog.context.Context; -import datadog.context.InferredProxyContext; import datadog.context.propagation.Propagators; import datadog.trace.api.Config; import datadog.trace.api.DDTags; From 0bb7df6225e0a6d58f2388caf904e80c4c27a904 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Mon, 12 May 2025 15:23:00 -0400 Subject: [PATCH 12/13] updating tests --- .../tomcat/TomcatServerInstrumentation.java | 2 +- .../agent/test/base/HttpServerTest.groovy | 3 +-- .../scopemanager/ContinuableScopeManager.java | 23 ------------------- 3 files changed, 2 insertions(+), 26 deletions(-) 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 27db8ea11d3..ad9c1f98830 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 @@ -131,7 +131,7 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque final AgentSpan span = DECORATE.startSpanFromContext("http-server", req, extractedContext); final ContextScope scope = extractedContext.with(span).attach(); - // final ContextScope scope = activateSpan(span); + // This span is finished when Request.recycle() is called by RequestInstrumentation. DECORATE.afterStart(span); diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index 1d061150ba2..97c1ef36b83 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -1044,8 +1044,7 @@ abstract class HttpServerTest extends WithHttpServer { if (isDataStreamsEnabled()) { TEST_DATA_STREAMS_WRITER.waitForGroups(1) } - // println(request) - // println(response) + expect: if (bubblesResponse()) { assert response.code() == REDIRECT.status diff --git a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java index ad184cdb37a..5f75a9bd644 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/scopemanager/ContinuableScopeManager.java @@ -29,7 +29,6 @@ import datadog.trace.core.monitor.HealthMetrics; import datadog.trace.relocate.api.RatelimitedLogger; import datadog.trace.util.AgentTaskScheduler; -import de.thetaphi.forbiddenapis.SuppressForbidden; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -123,7 +122,6 @@ private AgentScope.Continuation captureSpan(Context context, byte source, AgentS return new ScopeContinuation(this, context, source, traceCollector).register(); } - @SuppressForbidden private AgentScope activate( final AgentSpan span, final byte source, @@ -157,20 +155,12 @@ private AgentScope activate( final ContinuableScope scope = new ContinuableScope(this, context, source, asyncPropagation, createScopeState(context)); - System.out.println("Scope size prior: " + scopeStack.depth()); scopeStack.push(scope); - System.out.println("Scope size prior: " + scopeStack.depth()); healthMetrics.onActivateScope(); - if (iterationKeepAlive > 0 && currentDepth == 0) { - // For context-based scopes, only add them if they're going to be long-lived - scheduleRootIterationScopeCleanup(scopeStack, scope); - } - return scope; } - @SuppressForbidden private AgentScope activate(final Context context) { ScopeStack scopeStack = scopeStack(); @@ -195,17 +185,9 @@ private AgentScope activate(final Context context) { final ContinuableScope scope = new ContinuableScope(this, context, CONTEXT, asyncPropagation, createScopeState(context)); - System.out.println("Context: " + context); - System.out.println("Scope size prior: " + scopeStack.depth()); scopeStack.push(scope); - System.out.println("Scope size prior: " + scopeStack.depth()); healthMetrics.onActivateScope(); - if (iterationKeepAlive > 0 && currentDepth == 0) { - // For context-based scopes, only add them if they're going to be long-lived - scheduleRootIterationScopeCleanup(scopeStack, scope); - } - return scope; } @@ -322,13 +304,8 @@ public void rollbackActiveToCheckpoint() { } } - @SuppressForbidden public AgentSpan activeSpan() { final ContinuableScope active = scopeStack().active(); - - System.out.println("Scope size prior: " + scopeStack().depth()); - System.out.println("scopeStack(): " + scopeStack()); - System.out.println("active: " + active); return active == null ? null : active.span(); } From 9b14d97787055a6a00fa5d24456f8dbca8984579 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 14 May 2025 13:20:16 -0400 Subject: [PATCH 13/13] PR comments --- .../decorator/HttpServerDecorator.java | 18 +++++++++++++----- .../tomcat/TomcatServerInstrumentation.java | 3 +-- 2 files changed, 14 insertions(+), 7 deletions(-) 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 511cb899dce..bed9b4d2178 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,5 +1,7 @@ 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; @@ -9,7 +11,6 @@ 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; @@ -135,12 +136,15 @@ public AgentSpanContext.Extracted extract(REQUEST_CARRIER carrier) { return extractContextAndGetSpanContext(carrier, getter); } + /** + * Will be renamed to #extract(REQUEST_CARRIER) when refactoring of instrumentation's is complete + */ public Context extractContext(REQUEST_CARRIER carrier) { AgentPropagation.ContextVisitor getter = getter(); if (null == carrier || null == getter) { - return null; + return root(); } - return Propagators.defaultPropagator().extract(Context.root(), carrier, getter); + return defaultPropagator().extract(root(), carrier, getter); } /** Deprecated. Use {@link #startSpanFromContext(String, Object, Context)} instead. */ @@ -166,12 +170,16 @@ 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, getExtractedSpanContext(context)); + return startSpan(instrumentationName, carrier, getSpanContext(context)); } - public AgentSpanContext.Extracted getExtractedSpanContext(Context context) { + public AgentSpanContext.Extracted getSpanContext(Context context) { AgentSpan extractedSpan = AgentSpan.fromContext(context); return extractedSpan == null ? null : (AgentSpanContext.Extracted) extractedSpan.context(); } 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 ad9c1f98830..12ec6f6a07a 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,8 +126,7 @@ 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.getExtractedSpanContext(extractedContext)); + req.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getSpanContext(extractedContext)); final AgentSpan span = DECORATE.startSpanFromContext("http-server", req, extractedContext); final ContextScope scope = extractedContext.with(span).attach();