From 478efecb29a9fbe9fdcd40d516f56f4aae68d40e Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 21 Jul 2025 17:37:20 +0200 Subject: [PATCH 01/23] feat(context): Refactor HttpServerDecorator to return Context instead of span on startSpan --- .../HttpServerDecoratorBenchmark.java | 4 +- .../decorator/HttpServerDecorator.java | 38 +++++++++++++++---- .../decorator/HttpServerDecoratorTest.groovy | 3 +- .../akkahttp/DatadogWrapperHelper.java | 10 +++-- .../functions/AzureFunctionsDecorator.java | 2 +- .../AzureFunctionsInstrumentation.java | 20 +++++----- .../HttpRequestMessageExtractAdapter.java | 2 +- .../GrizzlyHttpHandlerInstrumentation.java | 11 +++--- .../grizzlyhttp232/GrizzlyDecorator.java | 11 ++++-- .../jetty11/JettyServerAdvice.java | 15 ++++---- .../jetty12/JettyServerAdvice.java | 22 ++++++----- .../jetty70/JettyServerInstrumentation.java | 15 ++++---- .../jetty76/JettyServerInstrumentation.java | 15 ++++---- .../jetty9/JettyServerInstrumentation.java | 15 ++++---- .../instrumentation/jetty10/HandleAdvice.java | 15 ++++---- .../LibertyServerInstrumentation.java | 18 +++++---- .../LibertyServerInstrumentation.java | 18 +++++---- .../HttpServerRequestTracingHandler.java | 10 +++-- .../HttpServerRequestTracingHandler.java | 11 ++++-- .../HttpServerRequestTracingHandler.java | 11 ++++-- .../pekkohttp/DatadogWrapperHelper.java | 10 +++-- .../instrumentation/play23/PlayAdvice.java | 15 ++++---- .../instrumentation/play24/PlayAdvice.java | 16 ++++---- .../instrumentation/play26/PlayAdvice.java | 13 ++++--- .../restlet/RestletInstrumentation.java | 9 +++-- .../servlet2/Servlet2Advice.java | 14 +++---- .../servlet3/Servlet3Advice.java | 14 +++---- .../SprayHttpServerRunSealedRouteAdvice.java | 11 +++--- .../SynapseServerInstrumentation.java | 15 ++------ .../tomcat/TomcatServerInstrumentation.java | 15 ++++---- .../undertow/HandlerInstrumentation.java | 10 +++-- .../HttpRequestParserInstrumentation.java | 10 +++-- 32 files changed, 237 insertions(+), 181 deletions(-) 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 64ef5377364..89d08c4f7d4 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 @@ -1,5 +1,6 @@ package datadog.trace.bootstrap.instrumentation.decorator; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static java.util.concurrent.TimeUnit.MICROSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; @@ -58,7 +59,8 @@ public void setUp() { .build(); GlobalTracer.forceRegister(tracer); decorator = new BenchmarkHttpServerDecorator(); - span = decorator.startSpan(Collections.emptyMap(), (Context) null); + Context context = decorator.startSpan("benchmark", Collections.emptyMap(), Context.root()); + span = fromContext(context); } @Benchmark 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 3119ecd2fe5..cbeae71b605 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 @@ -118,6 +118,12 @@ protected AgentTracer.TracerAPI tracer() { return AgentTracer.get(); } + /** + * Extracts context from an upstream service. + * + * @param carrier The request carrier to get the context from. + * @return The extracted context, {@code Context#root()} if no valid context to extract. + */ public Context extract(REQUEST_CARRIER carrier) { AgentPropagation.ContextVisitor getter = getter(); if (null == carrier || null == getter) { @@ -126,11 +132,22 @@ public Context extract(REQUEST_CARRIER carrier) { return Propagators.defaultPropagator().extract(root(), carrier, getter); } - public AgentSpan startSpan( - String instrumentationName, REQUEST_CARRIER carrier, AgentSpanContext.Extracted context) { + /** + * Starts a span. + * + * @param instrumentationName The instrumentation creating the span. + * @param carrier The request carrier. + * @param context The parent context of the span to create. + * @return A new context bundling the span, child of the given parent context. + */ + public Context startSpan( + String instrumentationName, + REQUEST_CARRIER carrier, + Context context) { // TODO Rename "context" to "parent"? + AgentSpanContext.Extracted spanContext = getExtractedSpanContext(context); AgentSpan span = tracer() - .startSpan(instrumentationName, spanName(), callIGCallbackStart(context)) + .startSpan(instrumentationName, spanName(), callIGCallbackStart(spanContext)) .setMeasured(true); Flow flow = callIGCallbackRequestHeaders(span, carrier); if (flow.getAction() instanceof Flow.Action.RequestBlockingAction) { @@ -140,12 +157,17 @@ public AgentSpan startSpan( if (null != carrier && null != getter) { tracer().getDataStreamsMonitoring().setCheckpoint(span, forHttpServer()); } - return span; + return context.with(span); } - public AgentSpan startSpan(REQUEST_CARRIER carrier, Context context) { - return startSpan("http-server", carrier, getExtractedSpanContext(context)); - } + // /** + // * Use {@code startSpan(String instrumentationName, REQUEST_CARRIER carrier, Context context)} + // instead. + // */ + // @Deprecated + // public Context startSpan(REQUEST_CARRIER carrier, Context context) { + // return startSpan("http-server", carrier, context); + // } public AgentSpanContext.Extracted getExtractedSpanContext(Context context) { AgentSpan extractedSpan = AgentSpan.fromContext(context); @@ -387,7 +409,7 @@ public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) { // return super.onError(span, throwable); // } - private AgentSpanContext.Extracted callIGCallbackStart(AgentSpanContext.Extracted context) { + private AgentSpanContext.Extracted callIGCallbackStart(final AgentSpanContext.Extracted context) { AgentTracer.TracerAPI tracer = tracer(); Supplier> startedCbAppSec = tracer.getCallbackProvider(RequestContextSlot.APPSEC).getCallback(EVENTS.requestStarted()); 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 14261722ad1..e2fde2b638a 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 @@ -25,6 +25,7 @@ import datadog.trace.core.datastreams.DataStreamsMonitoring import java.util.function.Function import java.util.function.Supplier +import static datadog.context.Context.root import static datadog.trace.api.config.TraceInstrumentationConfig.HTTP_SERVER_DECODED_RESOURCE_PRESERVE_SPACES import static datadog.trace.api.config.TraceInstrumentationConfig.HTTP_SERVER_RAW_QUERY_STRING import static datadog.trace.api.config.TraceInstrumentationConfig.HTTP_SERVER_RAW_RESOURCE @@ -497,7 +498,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest { def decorator = newDecorator(mTracer, null) when: - decorator.startSpan("test", headers, null) + decorator.startSpan("test", headers, root()) then: 1 * mSpan.setMeasured(true) >> mSpan diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java index de08a4094fa..5a11184b034 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.akkahttp; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator.DECORATE; import akka.http.scaladsl.model.HttpRequest; @@ -10,12 +11,13 @@ public class DatadogWrapperHelper { public static ContextScope createSpan(final HttpRequest request) { - final Context context = DECORATE.extract(request); - final AgentSpan span = DECORATE.startSpan(request, context); + final Context parentContext = DECORATE.extract(request); + final Context context = DECORATE.startSpan("akka-http", request, parentContext); + final AgentSpan span = fromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, request, request, context); + DECORATE.onRequest(span, request, request, parentContext); - return context.with(span).attach(); + return context.attach(); } public static void finishSpan(final AgentSpan span, final HttpResponse response) { diff --git a/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java b/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java index a7654462b91..3a778f986b7 100644 --- a/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java +++ b/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/AzureFunctionsDecorator.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.azurefunctions; +package datadog.trace.instrumentation.azure.functions; import com.microsoft.azure.functions.HttpRequestMessage; import com.microsoft.azure.functions.HttpResponseMessage; 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 039f90cec8d..a584555796d 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 @@ -1,11 +1,12 @@ -package datadog.trace.instrumentation.azurefunctions; +package datadog.trace.instrumentation.azure.functions; 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.AgentSpan.fromContext; 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 datadog.trace.instrumentation.azure.functions.AzureFunctionsDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -65,15 +66,16 @@ public void methodAdvice(MethodTransformer transformer) { public static class AzureFunctionsAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static ContextScope methodEnter( - @Advice.Argument(0) final HttpRequestMessage request, - @Advice.Argument(1) final ExecutionContext context) { - final Context extractedContext = DECORATE.extract(request); - final AgentSpan span = DECORATE.startSpan(request, extractedContext); - DECORATE.afterStart(span, context.getFunctionName()); - DECORATE.onRequest(span, request, request, extractedContext); + @Advice.Argument(0) final HttpRequestMessage request, + @Advice.Argument(1) final ExecutionContext executionContext) { + final Context parentContext = DECORATE.extract(request); + final Context context = DECORATE.startSpan("azure-functions", request, parentContext); + final AgentSpan span = fromContext(context); + DECORATE.afterStart(span, executionContext.getFunctionName()); + DECORATE.onRequest(span, request, request, parentContext); HTTP_RESOURCE_DECORATOR.withRoute( span, request.getHttpMethod().name(), request.getUri().getPath()); - return extractedContext.with(span).attach(); + return context.attach(); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/HttpRequestMessageExtractAdapter.java b/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/HttpRequestMessageExtractAdapter.java index 60b3ad86b8f..e9c43a5c752 100644 --- a/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/HttpRequestMessageExtractAdapter.java +++ b/dd-java-agent/instrumentation/azure-functions/src/main/java/datadog/trace/instrumentation/azure/functions/HttpRequestMessageExtractAdapter.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.azurefunctions; +package datadog.trace.instrumentation.azure.functions; import com.microsoft.azure.functions.HttpRequestMessage; import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; 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 70087d86b80..817d9d6fb91 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 @@ -13,7 +13,6 @@ 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.AgentSpan; import net.bytebuddy.asm.Advice; @@ -74,15 +73,17 @@ public static class HandleAdvice { } final Context parentContext = DECORATE.extract(request); - final AgentSpan span = DECORATE.startSpan(request, parentContext); + final Context context = DECORATE.startSpan("grizzly", request, parentContext); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); DECORATE.onRequest(span, request, request, parentContext); - scope = parentContext.with(span).attach(); + scope = context.attach(); request.setAttribute(DD_SPAN_ATTRIBUTE, span); - request.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - request.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + request.setAttribute( + CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + request.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null) { 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 ac4dc89cd8c..3dcbab61f0c 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,5 +1,7 @@ package datadog.trace.instrumentation.grizzlyhttp232; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; + import datadog.appsec.api.blocking.BlockingContentType; import datadog.context.Context; import datadog.context.ContextScope; @@ -112,13 +114,14 @@ public static NextAction onHttpCodecFilterExit( } HttpRequestPacket httpRequest = (HttpRequestPacket) httpHeader; HttpResponsePacket httpResponse = httpRequest.getResponse(); - Context context = DECORATE.extract(httpRequest); - AgentSpan span = DECORATE.startSpan(httpRequest, context); - ContextScope scope = context.with(span).attach(); + Context parentContext = DECORATE.extract(httpRequest); + Context context = DECORATE.startSpan("grizzly", httpRequest, parentContext); + ContextScope scope = context.attach(); + AgentSpan span = spanFromContext(context); 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, parentContext); Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null && thiz instanceof HttpServerFilter) { 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 d0b48b884df..859ca3b08ba 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 @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jetty11; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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.jetty11.JettyDecorator.DECORATE; @@ -7,7 +8,6 @@ import datadog.context.Context; import datadog.context.ContextScope; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.HttpChannel; @@ -26,16 +26,17 @@ public static ContextScope onEnter( return activateSpan((AgentSpan) existingSpan); } - final Context context = DECORATE.extract(req); - span = DECORATE.startSpan(req, context); - final ContextScope scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(req); + final Context context = DECORATE.startSpan("jetty", req, parentContext); + final ContextScope scope = context.attach(); + span = fromContext(context); span.setMeasured(true); DECORATE.afterStart(span); - DECORATE.onRequest(span, req, req, context); + DECORATE.onRequest(span, req, req, parentContext); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); return scope; } 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 e905262b791..4693bb8f993 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,11 +1,12 @@ package datadog.trace.instrumentation.jetty12; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE; +import static datadog.trace.instrumentation.jetty12.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.AgentSpan; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.Request; @@ -27,16 +28,17 @@ public static void onExit( } } - final Context context = JettyDecorator.DECORATE.extract(req); - final AgentSpan span = JettyDecorator.DECORATE.startSpan(req, context); - try (final ContextScope scope = context.with(span).attach()) { + final Context parentContext = DECORATE.extract(req); + final Context context = DECORATE.startSpan("jetty", req, parentContext); + final AgentSpan span = fromContext(context); + try (final ContextScope scope = context.attach()) { span.setMeasured(true); - JettyDecorator.DECORATE.afterStart(span); - JettyDecorator.DECORATE.onRequest(span, req, req, context); + DECORATE.afterStart(span); + DECORATE.onRequest(span, req, req, parentContext); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); ret = JettyRunnableWrapper.wrapIfNeeded(ret); } } @@ -53,8 +55,8 @@ public static void stopSpan(@Advice.This final HttpChannelState channel) { Object spanObj = req.getAttribute(DD_SPAN_ATTRIBUTE); if (spanObj instanceof AgentSpan) { final AgentSpan span = (AgentSpan) spanObj; - JettyDecorator.DECORATE.onResponse(span, channel); - JettyDecorator.DECORATE.beforeFinish(span); + DECORATE.onResponse(span, channel); + DECORATE.beforeFinish(span); span.finish(); } } 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 36c1e6599c2..5321e025219 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,6 +1,7 @@ package datadog.trace.instrumentation.jetty70; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +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.jetty70.JettyDecorator.DECORATE; import static java.util.Collections.singletonMap; @@ -15,7 +16,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.api.ProductActivation; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -155,15 +155,16 @@ public static ContextScope onEnter( return ((AgentSpan) existingSpan).attach(); } - final Context extractedContext = DECORATE.extract(req); - span = DECORATE.startSpan(req, extractedContext); - final ContextScope scope = extractedContext.with(span).attach(); + final Context parentContext = DECORATE.extract(req); + final Context context = DECORATE.startSpan("jetty", req, parentContext); + final ContextScope scope = context.attach(); + span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, req, req, extractedContext); + DECORATE.onRequest(span, req, req, parentContext); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); return scope; } 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 a49026a983b..b35038ebbf9 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,6 +1,7 @@ package datadog.trace.instrumentation.jetty76; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; 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; @@ -15,7 +16,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.api.ProductActivation; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -156,15 +156,16 @@ public static ContextScope onEnter( return ((AgentSpan) existingSpan).attach(); } - final Context extractedContext = DECORATE.extract(req); - span = DECORATE.startSpan(req, extractedContext); - final ContextScope scope = extractedContext.with(span).attach(); + final Context parentContext = DECORATE.extract(req); + final Context context = DECORATE.startSpan("jetty", req, parentContext); + final ContextScope scope = context.attach(); + span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, req, req, extractedContext); + DECORATE.onRequest(span, req, req, parentContext); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); return scope; } 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 94fd9171e22..a984d3695d9 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,6 +3,7 @@ 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.Java8BytecodeBridge.spanFromContext; 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; @@ -21,7 +22,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.api.ProductActivation; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; @@ -170,15 +170,16 @@ public static ContextScope onEnter( return ((AgentSpan) existingSpan).attach(); } - final Context context = DECORATE.extract(req); - span = DECORATE.startSpan(req, context); - final ContextScope scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(req); + final Context context = DECORATE.startSpan("jetty", req, parentContext); + final ContextScope scope = context.attach(); + span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, req, req, context); + DECORATE.onRequest(span, req, req, parentContext); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); return scope; } 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 e8e9ffc6a6b..8bef773928f 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,12 +1,12 @@ package datadog.trace.instrumentation.jetty10; +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.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.AgentSpan; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.HttpChannel; @@ -24,15 +24,16 @@ public static ContextScope onEnter( return ((AgentSpan) existingSpan).attach(); } - final Context context = DECORATE.extract(req); - span = DECORATE.startSpan(req, context); + final Context parentContext = DECORATE.extract(req); + final Context context = DECORATE.startSpan("jetty", req, parentContext); + span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, req, req, context); + DECORATE.onRequest(span, req, req, parentContext); - final ContextScope scope = context.with(span).attach(); + final ContextScope scope = context.attach(); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); return scope; } 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 c05349a3e2d..fed57e01a6a 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,6 +1,7 @@ package datadog.trace.instrumentation.liberty20; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; @@ -21,7 +22,6 @@ import datadog.trace.api.ClassloaderConfigurationOverrides; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.ActiveSubsystems; import datadog.trace.bootstrap.ContextStore; @@ -105,10 +105,11 @@ public static class HandleRequestAdvice { } catch (NullPointerException e) { } - final Context context = DECORATE.extract(request); - request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, context); - final AgentSpan span = DECORATE.startSpan(request, context); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(request); + request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext); + final Context context = DECORATE.startSpan("liberty", request, parentContext); + scope = context.attach(); + final AgentSpan span = fromContext(context); if (Config.get().isJeeSplitByDeployment()) { final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext(); if (dispatcherContext != null) { @@ -122,10 +123,11 @@ public static class HandleRequestAdvice { } } DECORATE.afterStart(span); - DECORATE.onRequest(span, request, request, context); + DECORATE.onRequest(span, request, request, parentContext); request.setAttribute(DD_SPAN_ATTRIBUTE, span); - request.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - request.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + request.setAttribute( + CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + request.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); if (ActiveSubsystems.APPSEC_ACTIVE) { ContextStore store = 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 81cd81bd91b..8f714a7f1ad 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,6 +1,7 @@ package datadog.trace.instrumentation.liberty23; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; @@ -21,7 +22,6 @@ import datadog.trace.api.ClassloaderConfigurationOverrides; import datadog.trace.api.Config; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.ActiveSubsystems; import datadog.trace.bootstrap.ContextStore; @@ -107,10 +107,11 @@ public static class HandleRequestAdvice { } catch (NullPointerException e) { } - final Context context = DECORATE.extract(request); - request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, context); - final AgentSpan span = DECORATE.startSpan(request, context); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(request); + request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext); + final Context context = DECORATE.startSpan("liberty", request, parentContext); + scope = context.attach(); + final AgentSpan span = fromContext(context); if (Config.get().isJeeSplitByDeployment()) { final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext(); if (dispatcherContext != null) { @@ -124,10 +125,11 @@ public static class HandleRequestAdvice { } } DECORATE.afterStart(span); - DECORATE.onRequest(span, request, request, context); + DECORATE.onRequest(span, request, request, parentContext); request.setAttribute(DD_SPAN_ATTRIBUTE, span); - request.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - request.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + request.setAttribute( + CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + request.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); if (ActiveSubsystems.APPSEC_ACTIVE) { ContextStore store = InstrumentationContext.get( 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 4fbe1d16777..4e0e6bf1bd2 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,5 +1,6 @@ package datadog.trace.instrumentation.netty38.server; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.netty38.server.NettyHttpServerDecorator.DECORATE; import datadog.context.Context; @@ -43,15 +44,16 @@ public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent final HttpRequest request = (HttpRequest) msg.getMessage(); final HttpHeaders headers = request.headers(); - final Context context = DECORATE.extract(headers); - final AgentSpan span = DECORATE.startSpan(headers, context); + final Context parentContext = DECORATE.extract(headers); + final Context context = DECORATE.startSpan("netty", headers, parentContext); channelTraceContext.reset(); channelTraceContext.setRequestHeaders(headers); - try (final ContextScope scope = context.with(span).attach()) { + try (final ContextScope scope = context.attach()) { + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, ctx.getChannel(), request, context); + DECORATE.onRequest(span, ctx.getChannel(), request, parentContext); channelTraceContext.setServerSpan(span); 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 49caacd7a91..31ebe2b2250 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,5 +1,7 @@ package datadog.trace.instrumentation.netty40.server; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; 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; @@ -39,12 +41,13 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { final HttpRequest request = (HttpRequest) msg; final HttpHeaders headers = request.headers(); - final Context context = DECORATE.extract(headers); - final AgentSpan span = DECORATE.startSpan(headers, context); + final Context parentContext = DECORATE.extract(headers); + final Context context = DECORATE.startSpan("netty", headers, parentContext); - try (final ContextScope scope = context.with(span).attach()) { + try (final ContextScope scope = context.attach()) { + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, channel, request, context); + DECORATE.onRequest(span, channel, request, parentContext); channel.attr(ANALYZED_RESPONSE_KEY).set(null); channel.attr(BLOCKED_RESPONSE_KEY).set(null); 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 6d91b9ea8b6..5bbb5d2861c 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,5 +1,7 @@ package datadog.trace.instrumentation.netty41.server; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; 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; @@ -38,12 +40,13 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) { final HttpRequest request = (HttpRequest) msg; final HttpHeaders headers = request.headers(); - final Context context = DECORATE.extract(headers); - final AgentSpan span = DECORATE.startSpan(headers, context); + final Context parentContext = DECORATE.extract(headers); + final Context context = DECORATE.startSpan("netty", headers, parentContext); - try (final ContextScope scope = context.with(span).attach()) { + try (final ContextScope scope = context.attach()) { + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, channel, request, context); + DECORATE.onRequest(span, channel, request, parentContext); channel.attr(ANALYZED_RESPONSE_KEY).set(null); channel.attr(BLOCKED_RESPONSE_KEY).set(null); 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 af83f9b8809..2fc2920487b 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,5 +1,6 @@ package datadog.trace.instrumentation.pekkohttp; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.instrumentation.pekkohttp.PekkoHttpServerDecorator.DECORATE; import datadog.context.Context; @@ -10,12 +11,13 @@ public class DatadogWrapperHelper { public static ContextScope createSpan(final HttpRequest request) { - final Context context = DECORATE.extract(request); - final AgentSpan span = DECORATE.startSpan(request, context); + final Context parentContext = DECORATE.extract(request); + final Context context = DECORATE.startSpan("pekko", request, parentContext); + final AgentSpan span = fromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, request, request, context); + DECORATE.onRequest(span, request, request, parentContext); - return context.with(span).attach(); + return context.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 f9db932bff3..c6e67e18093 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 @@ -20,18 +20,19 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static ContextScope 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 Context context = DECORATE.extract(headers); - span = DECORATE.startSpan(headers, context); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(headers); + final Context context = DECORATE.startSpan("play", headers, parentContext); + span = spanFromContext(context); + scope = context.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 = startSpan("play", PLAY_REQUEST); span.setMeasured(true); scope = span.attach(); } @@ -45,7 +46,7 @@ public static void stopTraceOnResponse( @Advice.Enter final ContextScope playControllerScope, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, - @Advice.Argument(0) final Request req, + @Advice.Argument(0) final Request req, @Advice.Return(readOnly = false) final Future responseFuture) { final AgentSpan playControllerSpan = spanFromContext(playControllerScope.context()); @@ -55,7 +56,7 @@ public static void stopTraceOnResponse( if (throwable == null) { responseFuture.onComplete( new RequestCompleteCallback(playControllerSpan), - ((Action) thisAction).executionContext()); + ((Action) thisAction).executionContext()); } else { DECORATE.onError(playControllerSpan, throwable); if (REPORT_HTTP_STATUS) { 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 1193ebedf7c..08e7da8956d 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,5 +1,6 @@ package datadog.trace.instrumentation.play24; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; @@ -20,7 +21,7 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static ContextScope 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; @@ -31,13 +32,14 @@ public static ContextScope onEnter(@Advice.Argument(value = 0, readOnly = false) if (activeSpan() == null) { final Headers headers = req.headers(); - final Context context = DECORATE.extract(headers); - span = DECORATE.startSpan(headers, context); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(headers); + final Context context = DECORATE.startSpan("play", headers, parentContext); + span = spanFromContext(context); + scope = context.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 = startSpan("play", PLAY_REQUEST); span.setMeasured(true); scope = span.attach(); } @@ -58,7 +60,7 @@ public static void stopTraceOnResponse( @Advice.Enter final ContextScope playControllerScope, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, - @Advice.Argument(0) final Request req, + @Advice.Argument(0) final Request req, @Advice.Return(readOnly = false) final Future responseFuture) { if (playControllerScope == null) { @@ -70,7 +72,7 @@ public static void stopTraceOnResponse( if (throwable == null) { responseFuture.onComplete( new RequestCompleteCallback(playControllerSpan), - ((Action) thisAction).executionContext()); + ((Action) thisAction).executionContext()); } else { DECORATE.onError(playControllerSpan, throwable); if (REPORT_HTTP_STATUS) { 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 1e222ae2848..e944793308b 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 @@ -20,7 +20,7 @@ public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static ContextScope onEnter( - @Advice.Argument(value = 0, readOnly = false) Request req, + @Advice.Argument(value = 0, readOnly = false) Request req, @Advice.Local("extractedContext") Context extractedContext) { final AgentSpan span; final ContextScope scope; @@ -33,12 +33,13 @@ public static ContextScope onEnter( if (activeSpan() == null) { final Headers headers = req.headers(); extractedContext = DECORATE.extract(headers); - span = DECORATE.startSpan(headers, extractedContext); - scope = extractedContext.with(span).attach(); + final Context context = DECORATE.startSpan("play", headers, extractedContext); + span = spanFromContext(context); + scope = context.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 = startSpan("play", PLAY_REQUEST); scope = span.attach(); } @@ -60,7 +61,7 @@ public static void stopTraceOnResponse( @Advice.Local("extractedContext") Context extractedContext, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, - @Advice.Argument(0) final Request req, + @Advice.Argument(0) final Request req, @Advice.Return(readOnly = false) final Future responseFuture) { if (playControllerScope == null) { @@ -72,7 +73,7 @@ public static void stopTraceOnResponse( if (throwable == null) { responseFuture.onComplete( new RequestCompleteCallback(playControllerSpan), - ((Action) thisAction).executionContext()); + ((Action) thisAction).executionContext()); } else { DECORATE.onError(playControllerSpan, throwable); DECORATE.beforeFinish(playControllerSpan); 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 1ce2aee65aa..081963d3f72 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 @@ -54,11 +54,12 @@ public String[] helperClassNames() { public static class RestletHandleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static ContextScope beginRequest(@Advice.Argument(0) final HttpExchange exchange) { - Context context = DECORATE.extract(exchange); - AgentSpan span = DECORATE.startSpan(exchange, context); - ContextScope scope = context.with(span).attach(); + Context parentContext = DECORATE.extract(exchange); + Context context = DECORATE.startSpan("restlet", exchange, parentContext); + AgentSpan span = spanFromContext(context); + ContextScope scope = context.attach(); DECORATE.afterStart(span); - DECORATE.onRequest(span, exchange, exchange, context); + DECORATE.onRequest(span, exchange, exchange, parentContext); DECORATE.onPeerConnection(span, exchange.getRemoteAddress()); return scope; 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 5cb76142b87..6cacae2b25b 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 @@ -10,7 +10,6 @@ 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.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -52,17 +51,18 @@ public static boolean onEnter( InstrumentationContext.get(ServletResponse.class, Integer.class).put(response, 200); } - final Context context = DECORATE.extract(httpServletRequest); - final AgentSpan span = DECORATE.startSpan(httpServletRequest, context); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(httpServletRequest); + final Context context = DECORATE.startSpan("servlet", httpServletRequest, parentContext); + scope = context.attach(); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, httpServletRequest, httpServletRequest, context); + DECORATE.onRequest(span, httpServletRequest, httpServletRequest, parentContext); httpServletRequest.setAttribute(DD_SPAN_ATTRIBUTE, span); httpServletRequest.setAttribute( - CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); + CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); httpServletRequest.setAttribute( - CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null) { 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 96755749047..cb5508b0202 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 @@ -14,7 +14,6 @@ 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.api.rum.RumInjector; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -84,18 +83,19 @@ public static boolean onEnter( return false; } - final Context context = DECORATE.extract(httpServletRequest); - final AgentSpan span = DECORATE.startSpan(httpServletRequest, context); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(httpServletRequest); + final Context context = DECORATE.startSpan("request", httpServletRequest, parentContext); + scope = context.attach(); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, httpServletRequest, httpServletRequest, context); + DECORATE.onRequest(span, httpServletRequest, httpServletRequest, parentContext); httpServletRequest.setAttribute(DD_SPAN_ATTRIBUTE, span); httpServletRequest.setAttribute( - CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); + CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); httpServletRequest.setAttribute( - CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); if (rba != null) { 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 20aa80a5fe5..06ce6ea07e7 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 @@ -2,6 +2,7 @@ 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.spray.SprayHttpServerDecorator.DECORATE; import datadog.context.Context; @@ -23,13 +24,13 @@ public static ContextScope enter( // Propagate context in case income request was going through several routes // TODO: Add test for it final HttpRequest request = ctx.request(); - Context extractedContext = DECORATE.extract(request); - extractedSpanContext = DECORATE.getExtractedSpanContext(extractedContext); - span = DECORATE.startSpan(request, extractedContext); - context = extractedContext.with(span); + Context parentContext = DECORATE.extract(request); + extractedSpanContext = DECORATE.getExtractedSpanContext(parentContext); + context = DECORATE.startSpan("spray", request, parentContext); + span = spanFromContext(context); } else { extractedSpanContext = null; - span = startSpan(DECORATE.spanName()); + span = startSpan("spray", DECORATE.spanName()); context = span; } 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 8325230b889..52246f6b360 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,7 +2,6 @@ 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.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; @@ -68,18 +67,10 @@ public static ContextScope beginRequest( // check incoming request for distributed trace ids HttpRequest request = connection.getHttpRequest(); - Context context = DECORATE.extract(request); - - AgentSpan span; - if (null != context) { - span = DECORATE.startSpan(request, context); - context = context.with(span); - } else { - span = startSpan(DECORATE.spanName()); - span.setMeasured(true); - context = span; - } + Context parentContext = DECORATE.extract(request); + Context context = DECORATE.startSpan("synapse", request, parentContext); ContextScope scope = context.attach(); + AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); DECORATE.onRequest(span, connection, request, 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 f1d91a5fb61..4467c346ad5 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 @@ -4,6 +4,7 @@ import static datadog.trace.agent.tooling.muzzle.Reference.EXPECTS_NON_STATIC; import static datadog.trace.agent.tooling.muzzle.Reference.EXPECTS_PUBLIC; 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.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE; import static datadog.trace.instrumentation.tomcat.TomcatDecorator.DD_EXTRACTED_CONTEXT_ATTRIBUTE; @@ -19,7 +20,6 @@ import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.agent.tooling.muzzle.Reference; import datadog.trace.api.CorrelationIdentifier; -import datadog.trace.api.GlobalTracer; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; @@ -123,21 +123,22 @@ public static ContextScope onService(@Advice.Argument(0) org.apache.coyote.Reque return activateSpan((AgentSpan) existingSpan); } - final Context extractedContext = DECORATE.extract(req); + final Context parentContext = DECORATE.extract(req); // TODO: Migrate setting DD_EXTRACTED_CONTEXT_ATTRIBUTE from AgentSpanContext.Extracted to // Context req.setAttribute( - DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getExtractedSpanContext(extractedContext)); + DD_EXTRACTED_CONTEXT_ATTRIBUTE, DECORATE.getExtractedSpanContext(parentContext)); - final AgentSpan span = DECORATE.startSpan(req, extractedContext); - final ContextScope scope = extractedContext.with(span).attach(); + final Context context = DECORATE.startSpan("tomcat", req, parentContext); + final ContextScope scope = context.attach(); // This span is finished when Request.recycle() is called by RequestInstrumentation. + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); req.setAttribute(DD_SPAN_ATTRIBUTE, span); - req.setAttribute(CorrelationIdentifier.getTraceIdKey(), GlobalTracer.get().getTraceId()); - req.setAttribute(CorrelationIdentifier.getSpanIdKey(), GlobalTracer.get().getSpanId()); + req.setAttribute(CorrelationIdentifier.getTraceIdKey(), CorrelationIdentifier.getTraceId()); + req.setAttribute(CorrelationIdentifier.getSpanIdKey(), CorrelationIdentifier.getSpanId()); return scope; } 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 52021dc16ca..78121481565 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,6 +1,7 @@ package datadog.trace.instrumentation.undertow; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; @@ -93,11 +94,12 @@ public static void onEnter( return; } - final Context extractedContext = DECORATE.extract(exchange); - final AgentSpan span = DECORATE.startSpan(exchange, extractedContext).setMeasured(true); - scope = extractedContext.with(span).attach(); + final Context parentContext = DECORATE.extract(exchange); + final Context context = DECORATE.startSpan("undertow", exchange, parentContext); + scope = context.attach(); + final AgentSpan span = fromContext(context); DECORATE.afterStart(span); - DECORATE.onRequest(span, exchange, exchange, extractedContext); + DECORATE.onRequest(span, exchange, exchange, parentContext); exchange.putAttachment(DD_UNDERTOW_CONTINUATION, captureSpan(span)); 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 1df726e3790..76ffc6ba975 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,6 +2,7 @@ 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.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.instrumentation.undertow.UndertowDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -74,11 +75,12 @@ public static void afterRequestParse( ContextScope scope = null; try { if (span == null) { - final Context context = DECORATE.extract(exchange); - span = DECORATE.startSpan(exchange, context).setMeasured(true); - scope = context.with(span).attach(); + final Context parentContext = DECORATE.extract(exchange); + final Context context = DECORATE.startSpan("undertow", exchange, parentContext); + span = fromContext(context); + scope = context.attach(); DECORATE.afterStart(span); - DECORATE.onRequest(span, exchange, exchange, context); + DECORATE.onRequest(span, exchange, exchange, parentContext); } DECORATE.onError(span, throwable); // because we know that a http 400 will be thrown From 3936f3f3749776615a6a21a113cdab564fcf476f Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Wed, 23 Jul 2025 13:01:46 +0200 Subject: [PATCH 02/23] feat(context): Refactor HttpServerDecorator to return Context instead of span on startSpan --- .../trace/instrumentation/akkahttp/DatadogWrapperHelper.java | 4 ++-- .../azure/functions/AzureFunctionsInstrumentation.java | 3 +-- .../trace/instrumentation/jetty11/JettyServerAdvice.java | 4 ++-- .../trace/instrumentation/jetty12/JettyServerAdvice.java | 4 ++-- .../liberty20/LibertyServerInstrumentation.java | 3 +-- .../liberty23/LibertyServerInstrumentation.java | 3 +-- .../netty40/server/HttpServerRequestTracingHandler.java | 1 - .../netty41/server/HttpServerRequestTracingHandler.java | 1 - .../trace/instrumentation/pekkohttp/DatadogWrapperHelper.java | 4 ++-- .../java/datadog/trace/instrumentation/play24/PlayAdvice.java | 1 - .../instrumentation/undertow/HandlerInstrumentation.java | 4 ++-- .../undertow/HttpRequestParserInstrumentation.java | 4 ++-- 12 files changed, 15 insertions(+), 21 deletions(-) diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java index 5a11184b034..31a2f15aaf9 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java @@ -1,6 +1,6 @@ package datadog.trace.instrumentation.akkahttp; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator.DECORATE; import akka.http.scaladsl.model.HttpRequest; @@ -13,7 +13,7 @@ public class DatadogWrapperHelper { public static ContextScope createSpan(final HttpRequest request) { final Context parentContext = DECORATE.extract(request); final Context context = DECORATE.startSpan("akka-http", request, parentContext); - final AgentSpan span = fromContext(context); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); DECORATE.onRequest(span, request, request, parentContext); 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 a584555796d..233b6461a9e 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.AgentSpan.fromContext; 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.azure.functions.AzureFunctionsDecorator.DECORATE; @@ -70,7 +69,7 @@ public static ContextScope methodEnter( @Advice.Argument(1) final ExecutionContext executionContext) { final Context parentContext = DECORATE.extract(request); final Context context = DECORATE.startSpan("azure-functions", request, parentContext); - final AgentSpan span = fromContext(context); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span, executionContext.getFunctionName()); DECORATE.onRequest(span, request, request, parentContext); HTTP_RESOURCE_DECORATOR.withRoute( 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 859ca3b08ba..91d3ca7ad67 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 @@ -1,7 +1,7 @@ package datadog.trace.instrumentation.jetty11; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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.jetty11.JettyDecorator.DECORATE; @@ -29,7 +29,7 @@ public static ContextScope onEnter( final Context parentContext = DECORATE.extract(req); final Context context = DECORATE.startSpan("jetty", req, parentContext); final ContextScope scope = context.attach(); - span = fromContext(context); + span = spanFromContext(context); span.setMeasured(true); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, parentContext); 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 4693bb8f993..173e0c9c7fb 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,6 +1,6 @@ package datadog.trace.instrumentation.jetty12; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; +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.jetty12.JettyDecorator.DECORATE; @@ -30,8 +30,8 @@ public static void onExit( final Context parentContext = DECORATE.extract(req); final Context context = DECORATE.startSpan("jetty", req, parentContext); - final AgentSpan span = fromContext(context); try (final ContextScope scope = context.attach()) { + final AgentSpan span = spanFromContext(context); span.setMeasured(true); DECORATE.afterStart(span); DECORATE.onRequest(span, req, req, parentContext); 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 fed57e01a6a..c6ee4716184 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,6 @@ package datadog.trace.instrumentation.liberty20; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; @@ -109,7 +108,7 @@ public static class HandleRequestAdvice { request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext); final Context context = DECORATE.startSpan("liberty", request, parentContext); scope = context.attach(); - final AgentSpan span = fromContext(context); + final AgentSpan span = spanFromContext(context); if (Config.get().isJeeSplitByDeployment()) { final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext(); if (dispatcherContext != null) { 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 8f714a7f1ad..f87ee3a637c 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,6 @@ package datadog.trace.instrumentation.liberty23; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; @@ -111,7 +110,7 @@ public static class HandleRequestAdvice { request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext); final Context context = DECORATE.startSpan("liberty", request, parentContext); scope = context.attach(); - final AgentSpan span = fromContext(context); + final AgentSpan span = spanFromContext(context); if (Config.get().isJeeSplitByDeployment()) { final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext(); if (dispatcherContext != null) { 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 31ebe2b2250..936e3762ee6 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,6 +1,5 @@ package datadog.trace.instrumentation.netty40.server; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.netty40.AttributeKeys.ANALYZED_RESPONSE_KEY; import static datadog.trace.instrumentation.netty40.AttributeKeys.BLOCKED_RESPONSE_KEY; 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 5bbb5d2861c..09756fec727 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,6 +1,5 @@ package datadog.trace.instrumentation.netty41.server; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.netty41.AttributeKeys.ANALYZED_RESPONSE_KEY; import static datadog.trace.instrumentation.netty41.AttributeKeys.BLOCKED_RESPONSE_KEY; 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 2fc2920487b..71edb000b54 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,6 +1,6 @@ package datadog.trace.instrumentation.pekkohttp; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.pekkohttp.PekkoHttpServerDecorator.DECORATE; import datadog.context.Context; @@ -13,7 +13,7 @@ public class DatadogWrapperHelper { public static ContextScope createSpan(final HttpRequest request) { final Context parentContext = DECORATE.extract(request); final Context context = DECORATE.startSpan("pekko", request, parentContext); - final AgentSpan span = fromContext(context); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); DECORATE.onRequest(span, request, request, parentContext); 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 08e7da8956d..efae890a598 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,6 +1,5 @@ package datadog.trace.instrumentation.play24; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; 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; 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 78121481565..bd78c68ce21 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,8 +1,8 @@ package datadog.trace.instrumentation.undertow; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.undertow.UndertowBlockingHandler.REQUEST_BLOCKING_DATA; import static datadog.trace.instrumentation.undertow.UndertowBlockingHandler.TRACE_SEGMENT; import static datadog.trace.instrumentation.undertow.UndertowDecorator.DD_UNDERTOW_CONTINUATION; @@ -97,7 +97,7 @@ public static void onEnter( final Context parentContext = DECORATE.extract(exchange); final Context context = DECORATE.startSpan("undertow", exchange, parentContext); scope = context.attach(); - final AgentSpan span = fromContext(context); + final AgentSpan span = spanFromContext(context); DECORATE.afterStart(span); DECORATE.onRequest(span, exchange, exchange, parentContext); 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 76ffc6ba975..9a77c060a39 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,8 +2,8 @@ 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.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext; import static datadog.trace.instrumentation.undertow.UndertowDecorator.DECORATE; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; @@ -77,7 +77,7 @@ public static void afterRequestParse( if (span == null) { final Context parentContext = DECORATE.extract(exchange); final Context context = DECORATE.startSpan("undertow", exchange, parentContext); - span = fromContext(context); + span = spanFromContext(context); scope = context.attach(); DECORATE.afterStart(span); DECORATE.onRequest(span, exchange, exchange, parentContext); From 86a5795ff72ee024ee1b4f92f0e2e5dee0e7464b Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 5 Aug 2025 16:52:05 +0200 Subject: [PATCH 03/23] WIP Reusing instrumentation name from instrumentation --- .../decorator/HttpServerDecorator.java | 17 +++-------------- 1 file changed, 3 insertions(+), 14 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 cbeae71b605..73c2d9e6a8c 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 @@ -135,15 +135,16 @@ public Context extract(REQUEST_CARRIER carrier) { /** * Starts a span. * - * @param instrumentationName The instrumentation creating the span. * @param carrier The request carrier. * @param context The parent context of the span to create. * @return A new context bundling the span, child of the given parent context. */ public Context startSpan( - String instrumentationName, + String unused, // TODO Remove REQUEST_CARRIER carrier, Context context) { // TODO Rename "context" to "parent"? + String instrumentationName = + instrumentationNames().length == 0 ? "http-server" : instrumentationNames()[0]; AgentSpanContext.Extracted spanContext = getExtractedSpanContext(context); AgentSpan span = tracer() @@ -397,18 +398,6 @@ public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) { return span; } - // @Override - // public Span onError(final Span span, final Throwable throwable) { - // assert span != null; - // // FIXME - // final Object status = span.getTag("http.status"); - // if (status == null || status.equals(200)) { - // // Ensure status set correctly - // span.setTag("http.status", 500); - // } - // return super.onError(span, throwable); - // } - private AgentSpanContext.Extracted callIGCallbackStart(final AgentSpanContext.Extracted context) { AgentTracer.TracerAPI tracer = tracer(); Supplier> startedCbAppSec = From e91cef566bc34d682fa1b19ae449358cdd5c3220 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Tue, 5 Aug 2025 16:52:41 +0200 Subject: [PATCH 04/23] WIP Context.with optimization for AgentSpan --- .../trace/bootstrap/instrumentation/api/AgentSpan.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java index 19876207b81..45f0c7b91c4 100644 --- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java +++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java @@ -216,4 +216,12 @@ default T get(@Nonnull ContextKey key) { default Context with(@Nonnull ContextKey key, @Nullable T value) { return SPAN_KEY == key ? (Context) value : Context.root().with(SPAN_KEY, this, key, value); } + + @Override + default Context with(@Nullable ImplicitContextKeyed value) { + if (value instanceof AgentSpan) { + return (AgentSpan) value; + } + return Context.super.with(value); + } } From 2ee919fcbef12e5298fd98f034de689bf888d96f Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Mon, 4 Aug 2025 14:33:58 +0200 Subject: [PATCH 05/23] wip(asm): Fix startSpan hook --- .../jetty/HandleRequestVisitor.java | 52 ++++--------------- .../jetty/JettyBlockingHelper.java | 11 ++++ .../instrumentation/jetty9/HandleVisitor.java | 51 +++++------------- 3 files changed, 33 insertions(+), 81 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java index a1924d4a4b5..b6b9275c836 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.jetty; -import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.context.Context; import java.util.List; import net.bytebuddy.jar.asm.Label; import net.bytebuddy.jar.asm.MethodVisitor; @@ -15,23 +14,20 @@ * and replaces it with: * *
- * if (span != null && span.getRequestBlockingAction() &&
- *     JettyBlockingHelper.block(
- *         this.getRequest(), this.getResponse(),
- *         span.getRequestBlockingAction(), span) {
+ * if (JettyBlockingHelper.block(this.getRequest(), this.getResponse(), context) {
  *   // nothing
  * } else {
  *   server.handle(this);
  * }
  * 
* - *

It needs first to get the index of the span variable that's set when a new span is created. + *

It needs first to get the index of the context variable that's set when a new span is created. */ public class HandleRequestVisitor extends MethodVisitor { private static final Logger log = LoggerFactory.getLogger(HandleRequestVisitor.class); private boolean lookForStore; - private int agentSpanVar = -1; + private int contextVar = -1; private final int classVersion; private final String connClassInternalName; private boolean success; @@ -53,12 +49,12 @@ DelayLoadsMethodVisitor delayVisitorDelegate() { @Override public void visitMethodInsn( int opcode, String owner, String name, String descriptor, boolean isInterface) { - if (agentSpanVar == -1) { + if (contextVar == -1) { lookForStore = !lookForStore && opcode == Opcodes.INVOKEVIRTUAL && name.equals("startSpan") - && descriptor.endsWith("Ldatadog/trace/bootstrap/instrumentation/api/AgentSpan;"); + && descriptor.endsWith("Ldatadog.context.Context;"); } else if (opcode == Opcodes.INVOKEVIRTUAL && owner.equals("org/eclipse/jetty/server/Server") && name.equals("handle") @@ -71,26 +67,8 @@ public void visitMethodInsn( return; } - Label doBlockLabel = new Label(); - Label beforeHandle = new Label(); Label afterHandle = new Label(); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); - super.visitJumpInsn(Opcodes.IFNULL, beforeHandle); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); - super.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - "datadog/trace/bootstrap/instrumentation/api/AgentSpan", - "getRequestBlockingAction", - "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), - true); - super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel); - super.visitJumpInsn(Opcodes.GOTO, beforeHandle); - - super.visitLabel(doBlockLabel); - if (needsStackFrames()) { - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - } super.visitVarInsn(Opcodes.ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, @@ -105,29 +83,17 @@ public void visitMethodInsn( "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); - super.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - "datadog/trace/bootstrap/instrumentation/api/AgentSpan", - "getRequestBlockingAction", - "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), - true); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); + super.visitVarInsn(Opcodes.ALOAD, contextVar); super.visitMethodInsn( Opcodes.INVOKESTATIC, Type.getInternalName(JettyBlockingHelper.class), "block", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;" - + Type.getDescriptor(Flow.Action.RequestBlockingAction.class) - + Type.getDescriptor(AgentSpan.class) + + Type.getDescriptor(Context.class) + ")Z", false); super.visitJumpInsn(Opcodes.IFNE, afterHandle); - super.visitLabel(beforeHandle); - if (needsStackFrames()) { - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); - } mv.commitLoads(savedLoads); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); super.visitLabel(afterHandle); @@ -144,7 +110,7 @@ public void visitMethodInsn( @Override public void visitVarInsn(int opcode, int varIndex) { if (lookForStore && opcode == Opcodes.ASTORE) { - agentSpanVar = varIndex; + contextVar = varIndex; lookForStore = false; } diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java index 983b53ec9a4..9f54253b810 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java @@ -6,10 +6,12 @@ import datadog.appsec.api.blocking.BlockingContentType; import datadog.appsec.api.blocking.BlockingException; +import datadog.context.Context; import datadog.trace.api.gateway.Flow; import datadog.trace.api.internal.TraceSegment; import datadog.trace.bootstrap.blocking.BlockingActionHelper; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge; import datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator; import java.io.OutputStream; import java.io.PrintWriter; @@ -225,6 +227,15 @@ public static boolean block( return true; } + public static boolean block(Request request, Response response, Context context) { + AgentSpan span = Java8BytecodeBridge.spanFromContext(context); + Flow.Action.RequestBlockingAction rba; + if (span == null || (rba = span.getRequestBlockingAction()) == null) { + return false; + } + return block(request, response, rba, span); + } + public static boolean block( Request request, Response response, Flow.Action.RequestBlockingAction rba, AgentSpan span) { return block( diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index 66e8d9e4dfc..760b1244d60 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jetty9; +import datadog.context.Context; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.jetty.JettyBlockingHelper; @@ -25,8 +26,7 @@ * is replaced with: * case REQUEST_DISPATCH: * // ... - * if (span != null && span.getBlockingAction() != null && - * JettyBlockingHelper.block(this.getRequest(), this.getResponse())) { + * if (JettyBlockingHelper.block(this.getRequest(), this.getResponse(), context)) { * // nothing * } else { * getServer().handle(this); @@ -82,7 +82,7 @@ public class HandleVisitor extends MethodVisitor { private static final Logger log = LoggerFactory.getLogger(HandleVisitor.class); private boolean lookForStore; - private int agentSpanVar = -1; + private int contextVar = -1; private boolean success; private final String methodName; @@ -98,12 +98,13 @@ DelayCertainInsMethodVisitor delayVisitorDelegate() { @Override public void visitMethodInsn( int opcode, String owner, String name, String descriptor, boolean isInterface) { - if (agentSpanVar == -1) { + if (contextVar == -1) { lookForStore = !lookForStore && opcode == Opcodes.INVOKEVIRTUAL && name.equals("startSpan") - && descriptor.endsWith("Ldatadog/trace/bootstrap/instrumentation/api/AgentSpan;"); + && descriptor.endsWith("Ldatadog.context.Context;"); + && descriptor.endsWith("Ldatadog/context/Context;"); } else if (!success && opcode == Opcodes.INVOKEVIRTUAL && owner.equals("org/eclipse/jetty/server/Server") @@ -124,24 +125,8 @@ public void visitMethodInsn( return; } - Label doBlockLabel = new Label(); - Label beforeHandle = new Label(); Label afterHandle = new Label(); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); - super.visitJumpInsn(Opcodes.IFNULL, beforeHandle); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); - super.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - "datadog/trace/bootstrap/instrumentation/api/AgentSpan", - "getRequestBlockingAction", - "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), - true); - super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel); - super.visitJumpInsn(Opcodes.GOTO, beforeHandle); - - super.visitLabel(doBlockLabel); - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); super.visitVarInsn(Opcodes.ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, @@ -156,27 +141,17 @@ public void visitMethodInsn( "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); - super.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - "datadog/trace/bootstrap/instrumentation/api/AgentSpan", - "getRequestBlockingAction", - "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), - true); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); + super.visitVarInsn(Opcodes.ALOAD, contextVar); super.visitMethodInsn( Opcodes.INVOKESTATIC, Type.getInternalName(JettyBlockingHelper.class), "block", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;" - + Type.getDescriptor(Flow.Action.RequestBlockingAction.class) - + Type.getDescriptor(AgentSpan.class) + + Type.getDescriptor(Context.class) + ")Z", false); super.visitJumpInsn(Opcodes.IFNE, afterHandle); - super.visitLabel(beforeHandle); - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); mv.commitVisitations(savedVisitations); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); super.visitLabel(afterHandle); @@ -214,9 +189,9 @@ public void visitMethodInsn( Label beforeRegularDispatch = new Label(); Label afterRegularDispatch = new Label(); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); + super.visitVarInsn(Opcodes.ALOAD, contextVar); super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); + super.visitVarInsn(Opcodes.ALOAD, contextVar); super.visitMethodInsn( Opcodes.INVOKEINTERFACE, "datadog/trace/bootstrap/instrumentation/api/AgentSpan", @@ -248,14 +223,14 @@ public void visitMethodInsn( "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); + super.visitVarInsn(Opcodes.ALOAD, contextVar); super.visitMethodInsn( Opcodes.INVOKEINTERFACE, "datadog/trace/bootstrap/instrumentation/api/AgentSpan", "getRequestBlockingAction", "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), true); - super.visitVarInsn(Opcodes.ALOAD, agentSpanVar); + super.visitVarInsn(Opcodes.ALOAD, contextVar); // create the lambda super.visitInvokeDynamicInsn( @@ -337,7 +312,7 @@ private boolean checkDispatchMethodState(final List savedVisitations) @Override public void visitVarInsn(int opcode, int varIndex) { if (lookForStore && opcode == Opcodes.ASTORE) { - agentSpanVar = varIndex; + contextVar = varIndex; lookForStore = false; } From dad95ddfc43bddf55da1f497bbca788d038de565 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 7 Aug 2025 09:01:48 +0200 Subject: [PATCH 06/23] MIP debug log --- .../instrumentation/jetty9/HandleVisitor.java | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index 760b1244d60..82736802014 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -4,6 +4,10 @@ import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.instrumentation.jetty.JettyBlockingHelper; +import java.io.BufferedWriter; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; import java.util.function.Function; @@ -86,9 +90,28 @@ public class HandleVisitor extends MethodVisitor { private boolean success; private final String methodName; + private BufferedWriter debugWriter; + + private void debug(String msg) { + if (debugWriter == null) { + return; + } + try { + debugWriter.write(msg); + debugWriter.newLine(); + } catch (IOException ignored) { + } + } + public HandleVisitor(int api, DelayCertainInsMethodVisitor methodVisitor, String methodName) { super(api, methodVisitor); this.methodName = methodName; + try { + String path = "/Users/bruce.bujon/go/src/github.com/DataDog/dd-trace-java/bbujon/debug/HandleVisitor-" + System.nanoTime() + ".txt"; + this.debugWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path))); + debug("Initializing"); + } catch (IOException ignored) { + } } DelayCertainInsMethodVisitor delayVisitorDelegate() { @@ -98,18 +121,25 @@ DelayCertainInsMethodVisitor delayVisitorDelegate() { @Override public void visitMethodInsn( int opcode, String owner, String name, String descriptor, boolean isInterface) { + debug("visitMethodInsn"); + debug(">> contextVar: " + contextVar); + debug(">> success: " + success); + debug(">> opcode: " + opcode + ", owner: " + owner + ", name: " + name + ", descriptor: " + descriptor); if (contextVar == -1) { lookForStore = !lookForStore && opcode == Opcodes.INVOKEVIRTUAL && name.equals("startSpan") - && descriptor.endsWith("Ldatadog.context.Context;"); && descriptor.endsWith("Ldatadog/context/Context;"); + if (lookForStore) { + debug("Found store"); + } } else if (!success && opcode == Opcodes.INVOKEVIRTUAL && owner.equals("org/eclipse/jetty/server/Server") && name.equals("handle") && descriptor.equals("(Lorg/eclipse/jetty/server/HttpChannel;)V")) { + debug("handle bytecode found"); DelayCertainInsMethodVisitor mv = delayVisitorDelegate(); List savedVisitations = mv.transferVisitations(); /* @@ -119,6 +149,7 @@ public void visitMethodInsn( * invokevirtual #78 // Method getServer:()Lorg/eclipse/jetty/server/Server; * aload_0 */ + debug("Saved visitation size: "+savedVisitations.size()); if (savedVisitations.size() != 3) { mv.commitVisitations(savedVisitations); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); @@ -156,6 +187,7 @@ public void visitMethodInsn( super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); super.visitLabel(afterHandle); super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + debug("handle bytecode injected"); this.success = true; return; } else if (!success @@ -312,6 +344,7 @@ private boolean checkDispatchMethodState(final List savedVisitations) @Override public void visitVarInsn(int opcode, int varIndex) { if (lookForStore && opcode == Opcodes.ASTORE) { + debug("Found context"); contextVar = varIndex; lookForStore = false; } @@ -325,6 +358,12 @@ public void visitEnd() { log.warn( "Transformation of Jetty's connection class was not successful. Blocking will likely not work"); } + if (this.debugWriter != null) { + try { + this.debugWriter.close(); + } catch (IOException ignored) { + } + } super.visitEnd(); } } From 3142fec0dde7e4a40140196b6705ae9d5afba8bd Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 7 Aug 2025 10:22:50 +0200 Subject: [PATCH 07/23] feat(asm): Clean up DelayCertainInsMethodVisitor --- .../jetty9/DelayCertainInsMethodVisitor.java | 49 ++++++++++--------- .../instrumentation/jetty9/HandleVisitor.java | 17 ++++--- 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java index 46e32fcaecf..d6a31da5681 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.function.Function; import net.bytebuddy.jar.asm.AnnotationVisitor; import net.bytebuddy.jar.asm.Handle; import net.bytebuddy.jar.asm.Label; @@ -10,22 +9,33 @@ import net.bytebuddy.jar.asm.Opcodes; import net.bytebuddy.jar.asm.TypePath; +/** + * This method visitor delays the following instructions: + * + *

    + *
  • Local variable instruction: {@code ALOAD},
  • + *
  • field instructions: {@code GETSTATIC}, {@code GETFIELD}
  • + *
  • method instructions: {@code INVOKEVIRTUAL}
  • + *
+ * + * They can be queried using {@link #transferVisitations()} and manually commited using {@link #commitVisitations(List)}. + */ public class DelayCertainInsMethodVisitor extends MethodVisitor { - private final List heldVisitations = new ArrayList(); + private final List heldVisitations = new ArrayList<>(); public DelayCertainInsMethodVisitor(int api, MethodVisitor methodVisitor) { super(api, methodVisitor); } - public void commitVisitations(List heldVisitations) { - for (Function fun : heldVisitations) { - fun.apply(null); + public void commitVisitations(List heldVisitations) { + for (Runnable r : heldVisitations) { + r.run(); } heldVisitations.clear(); } - public List transferVisitations() { - ArrayList copy = new ArrayList<>(this.heldVisitations); + public List transferVisitations() { + ArrayList copy = new ArrayList<>(this.heldVisitations); this.heldVisitations.clear(); return copy; } @@ -207,7 +217,7 @@ public void visitEnd() { super.visitEnd(); } - public class InvokeDynamicInsn implements Function { + public class InvokeDynamicInsn implements Runnable { public final String name; public final String descriptor; public final Handle bootstrapMethodHandle; @@ -225,13 +235,12 @@ public InvokeDynamicInsn( } @Override - public Object apply(Object input) { + public void run() { mv.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); - return null; } } - public class VirtualMethodInsn implements Function { + public class VirtualMethodInsn implements Runnable { public final int opcode; public final String owner; public final String name; @@ -248,13 +257,12 @@ public VirtualMethodInsn( } @Override - public Object apply(Object input) { + public void run() { mv.visitMethodInsn(opcode, owner, name, descriptor, isInterface); - return null; } } - public class GetStaticFieldInsn implements Function { + public class GetStaticFieldInsn implements Runnable { public final int opcode; public final String owner; public final String name; @@ -268,13 +276,12 @@ public GetStaticFieldInsn(int opcode, String owner, String name, String descript } @Override - public Object apply(Object input) { + public void run() { mv.visitFieldInsn(opcode, owner, name, descriptor); - return null; } } - public class GetFieldInsn implements Function { + public class GetFieldInsn implements Runnable { public final int opcode; public final String owner; public final String name; @@ -288,13 +295,12 @@ public GetFieldInsn(int opcode, String owner, String name, String descriptor) { } @Override - public Object apply(Object input) { + public void run() { mv.visitFieldInsn(opcode, owner, name, descriptor); - return null; } } - public class ALoadVarInsn implements Function { + public class ALoadVarInsn implements Runnable { public final int opcode; public final int varIndex; @@ -304,9 +310,8 @@ public ALoadVarInsn(int opcode, int varIndex) { } @Override - public Object apply(Object input) { + public void run() { mv.visitVarInsn(opcode, varIndex); - return null; } } } diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index 82736802014..06346541cdd 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -141,7 +141,7 @@ public void visitMethodInsn( && descriptor.equals("(Lorg/eclipse/jetty/server/HttpChannel;)V")) { debug("handle bytecode found"); DelayCertainInsMethodVisitor mv = delayVisitorDelegate(); - List savedVisitations = mv.transferVisitations(); + List savedVisitations = mv.transferVisitations(); /* * Saved visitations should be for: * @@ -156,8 +156,9 @@ public void visitMethodInsn( return; } + // Declare label to insert after Server.handle() call Label afterHandle = new Label(); - + // Inject blocking helper call super.visitVarInsn(Opcodes.ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, @@ -181,10 +182,12 @@ public void visitMethodInsn( + Type.getDescriptor(Context.class) + ")Z", false); + // Inject jump to after Server.handle() call if blocked super.visitJumpInsn(Opcodes.IFNE, afterHandle); - + // Inject getServer() and Server.handle() calls mv.commitVisitations(savedVisitations); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); + // Inject label after Server.handle() call to jump here when blocked super.visitLabel(afterHandle); super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); debug("handle bytecode injected"); @@ -200,7 +203,7 @@ public void visitMethodInsn( "(Ljakarta/servlet/DispatcherType;Lorg/eclipse/jetty/server/HttpChannel$Dispatchable;)V"))) { DelayCertainInsMethodVisitor mv = delayVisitorDelegate(); - List savedVisitations = mv.transferVisitations(); + List savedVisitations = mv.transferVisitations(); // check that we've queued up what we're supposed to if (!checkDispatchMethodState(savedVisitations)) { @@ -237,7 +240,7 @@ public void visitMethodInsn( super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); // dispatch with a Dispatchable created from JettyBlockingHelper::block // first set up the first two arguments to dispatch (this and DispatcherType.REQUEST) - List loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2)); + List loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2)); mv.commitVisitations(loadThisAndEnum); // set up the arguments to the method underlying the lambda (Request, Response, // RequestBlockingAction, AgentSpan) @@ -309,7 +312,7 @@ public void visitMethodInsn( super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } - private boolean checkDispatchMethodState(final List savedVisitations) { + private boolean checkDispatchMethodState(final List savedVisitations) { if (savedVisitations.size() != 4) { return false; } @@ -329,7 +332,7 @@ private boolean checkDispatchMethodState(final List savedVisitations) return false; } - final Function last = savedVisitations.get(3); + final Runnable last = savedVisitations.get(3); // jetty < 11.16.0 // this.dispatch(DispatcherType.REQUEST, () -> { ... }); if (last instanceof DelayCertainInsMethodVisitor.InvokeDynamicInsn) { From fa3f320fc884891f70e49e673d19cb09ed5085ee Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 7 Aug 2025 11:16:36 +0200 Subject: [PATCH 08/23] WIP --- .../instrumentation/jetty9/HandleVisitor.java | 75 +++++++++++++------ 1 file changed, 51 insertions(+), 24 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index 06346541cdd..db14d96b5b2 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -1,5 +1,13 @@ package datadog.trace.instrumentation.jetty9; +import static java.lang.Math.max; +import static net.bytebuddy.jar.asm.Opcodes.ALOAD; +import static net.bytebuddy.jar.asm.Opcodes.ASTORE; +import static net.bytebuddy.jar.asm.Opcodes.DUP; +import static net.bytebuddy.jar.asm.Opcodes.F_SAME; +import static net.bytebuddy.jar.asm.Opcodes.GOTO; +import static net.bytebuddy.jar.asm.Opcodes.H_INVOKESTATIC; + import datadog.context.Context; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; @@ -10,7 +18,6 @@ import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; -import java.util.function.Function; import net.bytebuddy.jar.asm.Handle; import net.bytebuddy.jar.asm.Label; import net.bytebuddy.jar.asm.MethodVisitor; @@ -84,9 +91,13 @@ */ public class HandleVisitor extends MethodVisitor { private static final Logger log = LoggerFactory.getLogger(HandleVisitor.class); + private static final int CONTEXT_VAR = 100; + /** Whether the next store is supposed to store the Context variable. */ private boolean lookForStore; - private int contextVar = -1; + /** Whether the Context variable was stored to local index {@link #CONTEXT_VAR}. */ + private boolean contextStored; + /** Whether the handle() method injection was successful .*/ private boolean success; private final String methodName; @@ -118,14 +129,22 @@ DelayCertainInsMethodVisitor delayVisitorDelegate() { return (DelayCertainInsMethodVisitor) this.mv; } + @Override + public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index) { + if (contextStored && index == CONTEXT_VAR) { + super.visitLocalVariable("context", Type.getDescriptor(Context.class), null, start, end, CONTEXT_VAR); + } + super.visitLocalVariable(name, descriptor, signature, start, end, index); + } + @Override public void visitMethodInsn( int opcode, String owner, String name, String descriptor, boolean isInterface) { debug("visitMethodInsn"); - debug(">> contextVar: " + contextVar); + debug(">> contextStored: " + contextStored); debug(">> success: " + success); debug(">> opcode: " + opcode + ", owner: " + owner + ", name: " + name + ", descriptor: " + descriptor); - if (contextVar == -1) { + if (!contextStored) { lookForStore = !lookForStore && opcode == Opcodes.INVOKEVIRTUAL @@ -159,21 +178,21 @@ public void visitMethodInsn( // Declare label to insert after Server.handle() call Label afterHandle = new Label(); // Inject blocking helper call - super.visitVarInsn(Opcodes.ALOAD, 0); + super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getRequest", "()Lorg/eclipse/jetty/server/Request;", false); - super.visitVarInsn(Opcodes.ALOAD, 0); + super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(Opcodes.ALOAD, contextVar); + super.visitVarInsn(ALOAD, CONTEXT_VAR); super.visitMethodInsn( Opcodes.INVOKESTATIC, Type.getInternalName(JettyBlockingHelper.class), @@ -189,7 +208,7 @@ public void visitMethodInsn( super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); // Inject label after Server.handle() call to jump here when blocked super.visitLabel(afterHandle); - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + super.visitFrame(F_SAME, 0, null, 0, null); debug("handle bytecode injected"); this.success = true; return; @@ -224,9 +243,9 @@ public void visitMethodInsn( Label beforeRegularDispatch = new Label(); Label afterRegularDispatch = new Label(); - super.visitVarInsn(Opcodes.ALOAD, contextVar); + super.visitVarInsn(ALOAD, CONTEXT_VAR); super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch); - super.visitVarInsn(Opcodes.ALOAD, contextVar); + super.visitVarInsn(ALOAD, CONTEXT_VAR); super.visitMethodInsn( Opcodes.INVOKEINTERFACE, "datadog/trace/bootstrap/instrumentation/api/AgentSpan", @@ -234,38 +253,38 @@ public void visitMethodInsn( "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), true); super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel); - super.visitJumpInsn(Opcodes.GOTO, beforeRegularDispatch); + super.visitJumpInsn(GOTO, beforeRegularDispatch); super.visitLabel(doBlockLabel); - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + super.visitFrame(F_SAME, 0, null, 0, null); // dispatch with a Dispatchable created from JettyBlockingHelper::block // first set up the first two arguments to dispatch (this and DispatcherType.REQUEST) List loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2)); mv.commitVisitations(loadThisAndEnum); // set up the arguments to the method underlying the lambda (Request, Response, // RequestBlockingAction, AgentSpan) - super.visitVarInsn(Opcodes.ALOAD, 0); + super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getRequest", "()Lorg/eclipse/jetty/server/Request;", false); - super.visitVarInsn(Opcodes.ALOAD, 0); + super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( Opcodes.INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(Opcodes.ALOAD, contextVar); + super.visitVarInsn(ALOAD, CONTEXT_VAR); super.visitMethodInsn( Opcodes.INVOKEINTERFACE, "datadog/trace/bootstrap/instrumentation/api/AgentSpan", "getRequestBlockingAction", "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), true); - super.visitVarInsn(Opcodes.ALOAD, contextVar); + super.visitVarInsn(ALOAD, CONTEXT_VAR); // create the lambda super.visitInvokeDynamicInsn( @@ -275,7 +294,7 @@ public void visitMethodInsn( + Type.getDescriptor(AgentSpan.class) + ")Lorg/eclipse/jetty/server/HttpChannel$Dispatchable;", new Handle( - Opcodes.H_INVOKESTATIC, + H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;", @@ -283,7 +302,7 @@ public void visitMethodInsn( new Object[] { Type.getType("()V"), new Handle( - Opcodes.H_INVOKESTATIC, + H_INVOKESTATIC, Type.getInternalName(JettyBlockingHelper.class), "blockAndThrowOnFailure", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;" @@ -297,14 +316,14 @@ public void visitMethodInsn( // invoke the dispatch method super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); - super.visitJumpInsn(Opcodes.GOTO, afterRegularDispatch); + super.visitJumpInsn(GOTO, afterRegularDispatch); super.visitLabel(beforeRegularDispatch); - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + super.visitFrame(F_SAME, 0, null, 0, null); mv.commitVisitations(savedVisitations); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); super.visitLabel(afterRegularDispatch); - super.visitFrame(Opcodes.F_SAME, 0, null, 0, null); + super.visitFrame(F_SAME, 0, null, 0, null); this.success = true; return; } @@ -346,15 +365,23 @@ private boolean checkDispatchMethodState(final List savedVisitations) @Override public void visitVarInsn(int opcode, int varIndex) { - if (lookForStore && opcode == Opcodes.ASTORE) { + if (lookForStore && opcode == ASTORE) { debug("Found context"); - contextVar = varIndex; + contextStored = true; lookForStore = false; + // Duplicate on stack and store to its own local var + super.visitInsn(DUP); + super.visitVarInsn(ASTORE, CONTEXT_VAR); } - super.visitVarInsn(opcode, varIndex); } + @Override + public void visitMaxs(int maxStack, int maxLocals) { + debug("VisitMaxs stack: " + maxStack + ", locals: " + maxLocals); + super.visitMaxs(maxStack, max(maxLocals, CONTEXT_VAR + 1)); + } + @Override public void visitEnd() { if (!success && !"run".equals(methodName)) { From 54a68e91bef1fcfeeb369a70db72d83ee19b0647 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 7 Aug 2025 12:02:37 +0200 Subject: [PATCH 09/23] WIP working Jetty 9 --- .../instrumentation/jetty9/HandleVisitor.java | 97 ++++++++++++------- 1 file changed, 61 insertions(+), 36 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index db14d96b5b2..929abfefcc6 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -1,16 +1,18 @@ package datadog.trace.instrumentation.jetty9; -import static java.lang.Math.max; import static net.bytebuddy.jar.asm.Opcodes.ALOAD; import static net.bytebuddy.jar.asm.Opcodes.ASTORE; -import static net.bytebuddy.jar.asm.Opcodes.DUP; import static net.bytebuddy.jar.asm.Opcodes.F_SAME; import static net.bytebuddy.jar.asm.Opcodes.GOTO; import static net.bytebuddy.jar.asm.Opcodes.H_INVOKESTATIC; +import static net.bytebuddy.jar.asm.Opcodes.IFNE; +import static net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC; +import static net.bytebuddy.jar.asm.Opcodes.INVOKEVIRTUAL; import datadog.context.Context; import datadog.trace.api.gateway.Flow; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge; import datadog.trace.instrumentation.jetty.JettyBlockingHelper; import java.io.BufferedWriter; import java.io.FileOutputStream; @@ -30,19 +32,24 @@ * Instruments the handle (or run) method to put the calls to getServer().handle(this) * under a condition, for the {@link org.eclipse.jetty.server.HttpChannel} class. * - *

In particular, for earlier versions of jetty: + *

In particular, for earlier versions of jetty: + *

  *   case REQUEST_DISPATCH:
  *   // ...
  *   getServer().handle(this);
- *  is replaced with: 
+ * 
+ * is replaced with: + *
  *   case REQUEST_DISPATCH:
  *   // ...
- *   if (JettyBlockingHelper.block(this.getRequest(), this.getResponse(), context)) {
+ *   if (JettyBlockingHelper.block(this.getRequest(), this.getResponse(), Java8BytecodeBridge.getCurrentContext())) {
  *     // nothing
  *   } else {
  *     getServer().handle(this);
  *   }
- *  And for later versions of Jetty before 11.16.0, 
+ * 
+ * And for later versions of Jetty before 11.16.0, + *
  *   case DISPATCH:
  *   {
  *     // ...
@@ -51,7 +58,9 @@
  *         // ...
  *         getServer().handle(HttpChannel.this);
  *       });
- *  is replaced with: 
+ * 
+ * is replaced with: + *
  *   case DISPATCH:
  *   {
  *     // ...
@@ -68,12 +77,16 @@
  *         getServer().handle(HttpChannel.this);
  *       });
  *   }
- *  And for later versions of Jetty, 
+ * 
+ * And for later versions of Jetty, + *
  *   case DISPATCH:
  *   {
  *     // ...
  *     dispatch(DispatcherType.REQUEST, _requestDispatcher);
- *  is replaced with: 
+ * 
+ * is replaced with: + *
  *   case DISPATCH:
  *   {
  *     // ...
@@ -87,16 +100,17 @@
  *     } else {
  *       dispatch(DispatcherType.REQUEST, _requestDispatcher);
  *   }
- * 
+ * 
*/ public class HandleVisitor extends MethodVisitor { private static final Logger log = LoggerFactory.getLogger(HandleVisitor.class); - private static final int CONTEXT_VAR = 100; + private static final int CONTEXT_VAR = 1000; /** Whether the next store is supposed to store the Context variable. */ private boolean lookForStore; /** Whether the Context variable was stored to local index {@link #CONTEXT_VAR}. */ private boolean contextStored; +// private int contextVarIndex = -1; /** Whether the handle() method injection was successful .*/ private boolean success; private final String methodName; @@ -129,13 +143,13 @@ DelayCertainInsMethodVisitor delayVisitorDelegate() { return (DelayCertainInsMethodVisitor) this.mv; } - @Override - public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index) { - if (contextStored && index == CONTEXT_VAR) { - super.visitLocalVariable("context", Type.getDescriptor(Context.class), null, start, end, CONTEXT_VAR); - } - super.visitLocalVariable(name, descriptor, signature, start, end, index); - } +// @Override +// public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index) { +// if (contextStored && index == CONTEXT_VAR) { +// super.visitLocalVariable("context", Type.getDescriptor(Context.class), null, start, end, CONTEXT_VAR); +// } +// super.visitLocalVariable(name, descriptor, signature, start, end, index); +// } @Override public void visitMethodInsn( @@ -147,14 +161,14 @@ public void visitMethodInsn( if (!contextStored) { lookForStore = !lookForStore - && opcode == Opcodes.INVOKEVIRTUAL + && opcode == INVOKEVIRTUAL && name.equals("startSpan") && descriptor.endsWith("Ldatadog/context/Context;"); if (lookForStore) { debug("Found store"); } } else if (!success - && opcode == Opcodes.INVOKEVIRTUAL + && opcode == INVOKEVIRTUAL && owner.equals("org/eclipse/jetty/server/Server") && name.equals("handle") && descriptor.equals("(Lorg/eclipse/jetty/server/HttpChannel;)V")) { @@ -177,24 +191,34 @@ public void visitMethodInsn( // Declare label to insert after Server.handle() call Label afterHandle = new Label(); - // Inject blocking helper call + // Inject blocking helper call and get its three parameters onto the stack: + // - Request + // - Response + // - Context -- retrieved from current as attached just earlier from tracing instrumentation super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( - Opcodes.INVOKEVIRTUAL, + INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getRequest", "()Lorg/eclipse/jetty/server/Request;", false); super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( - Opcodes.INVOKEVIRTUAL, + INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(ALOAD, CONTEXT_VAR); super.visitMethodInsn( - Opcodes.INVOKESTATIC, + INVOKESTATIC, + Type.getInternalName(Java8BytecodeBridge.class), + "getCurrentContext", + "()Ldatadog/context/Context;", + false + ); +// super.visitVarInsn(ALOAD, CONTEXT_VAR); + super.visitMethodInsn( + INVOKESTATIC, Type.getInternalName(JettyBlockingHelper.class), "block", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;" @@ -202,7 +226,7 @@ public void visitMethodInsn( + ")Z", false); // Inject jump to after Server.handle() call if blocked - super.visitJumpInsn(Opcodes.IFNE, afterHandle); + super.visitJumpInsn(IFNE, afterHandle); // Inject getServer() and Server.handle() calls mv.commitVisitations(savedVisitations); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); @@ -213,7 +237,7 @@ public void visitMethodInsn( this.success = true; return; } else if (!success - && (opcode == Opcodes.INVOKESPECIAL || opcode == Opcodes.INVOKEVIRTUAL) + && (opcode == Opcodes.INVOKESPECIAL || opcode == INVOKEVIRTUAL) && owner.equals("org/eclipse/jetty/server/HttpChannel") && name.equals("dispatch") && (descriptor.equals( @@ -265,14 +289,14 @@ public void visitMethodInsn( // RequestBlockingAction, AgentSpan) super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( - Opcodes.INVOKEVIRTUAL, + INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getRequest", "()Lorg/eclipse/jetty/server/Request;", false); super.visitVarInsn(ALOAD, 0); super.visitMethodInsn( - Opcodes.INVOKEVIRTUAL, + INVOKEVIRTUAL, "org/eclipse/jetty/server/HttpChannel", "getResponse", "()Lorg/eclipse/jetty/server/Response;", @@ -369,18 +393,19 @@ public void visitVarInsn(int opcode, int varIndex) { debug("Found context"); contextStored = true; lookForStore = false; +// contextVarIndex = varIndex; // Duplicate on stack and store to its own local var - super.visitInsn(DUP); - super.visitVarInsn(ASTORE, CONTEXT_VAR); +// super.visitInsn(DUP); +// super.visitVarInsn(ASTORE, CONTEXT_VAR); } super.visitVarInsn(opcode, varIndex); } - @Override - public void visitMaxs(int maxStack, int maxLocals) { - debug("VisitMaxs stack: " + maxStack + ", locals: " + maxLocals); - super.visitMaxs(maxStack, max(maxLocals, CONTEXT_VAR + 1)); - } +// @Override +// public void visitMaxs(int maxStack, int maxLocals) { +// debug("VisitMaxs stack: " + maxStack + ", locals: " + maxLocals); +// super.visitMaxs(maxStack, max(maxLocals, CONTEXT_VAR + 1)); +// } @Override public void visitEnd() { From a9e59d6a214e702e31324889832dd611311d59cf Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 7 Aug 2025 13:03:20 +0200 Subject: [PATCH 10/23] feat(asm): Clean up blocker helper --- .../jetty10/DispatchableAdvice.java | 18 +++--------------- .../jetty/JettyBlockingHelper.java | 10 ++-------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java b/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java index b0f0b53f037..5ea02dccb66 100644 --- a/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java +++ b/dd-java-agent/instrumentation/jetty-9/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java @@ -1,8 +1,6 @@ package datadog.trace.instrumentation.jetty10; -import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; +import datadog.context.Context; import datadog.trace.instrumentation.jetty.JettyBlockingHelper; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.server.HttpChannel; @@ -10,17 +8,7 @@ public class DispatchableAdvice { @Advice.OnMethodEnter(suppress = Throwable.class, skipOn = Advice.OnNonDefaultValue.class) public static boolean /* skip */ before(@Advice.FieldValue("this$0") HttpChannel channel) { - AgentSpan span = AgentTracer.activeSpan(); - if (span == null) { - return false; - } - Flow.Action.RequestBlockingAction rba = span.getRequestBlockingAction(); - if (rba == null) { - return false; - } - - boolean blocked = - JettyBlockingHelper.block(channel.getRequest(), channel.getResponse(), rba, span); - return blocked; + return JettyBlockingHelper.block( + channel.getRequest(), channel.getResponse(), Context.current()); } } diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java index 9f54253b810..eb2e83c748c 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java @@ -233,11 +233,6 @@ public static boolean block(Request request, Response response, Context context) if (span == null || (rba = span.getRequestBlockingAction()) == null) { return false; } - return block(request, response, rba, span); - } - - public static boolean block( - Request request, Response response, Flow.Action.RequestBlockingAction rba, AgentSpan span) { return block( span.getRequestContext().getTraceSegment(), request, @@ -247,9 +242,8 @@ public static boolean block( rba.getExtraHeaders()); } - public static void blockAndThrowOnFailure( - Request request, Response response, Flow.Action.RequestBlockingAction rba, AgentSpan span) { - if (!block(request, response, rba, span)) { + public static void blockAndThrowOnFailure(Request request, Response response, Context context) { + if (!block(request, response, context)) { throw new BlockingException("Throwing after being unable to commit blocking response"); } } From 3505e86ce34f2bac36603766cc6625de1512d9ea Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Thu, 7 Aug 2025 13:18:16 +0200 Subject: [PATCH 11/23] feat(asm): Improve block check injection Clean up local var hook and use Context.current() instead Refactor helper to use Context instead of AgentSpan and RequestBlockingAction --- .../instrumentation/jetty9/HandleVisitor.java | 109 ++++++++++-------- 1 file changed, 58 insertions(+), 51 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index 929abfefcc6..f405e64783d 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -1,7 +1,6 @@ package datadog.trace.instrumentation.jetty9; import static net.bytebuddy.jar.asm.Opcodes.ALOAD; -import static net.bytebuddy.jar.asm.Opcodes.ASTORE; import static net.bytebuddy.jar.asm.Opcodes.F_SAME; import static net.bytebuddy.jar.asm.Opcodes.GOTO; import static net.bytebuddy.jar.asm.Opcodes.H_INVOKESTATIC; @@ -10,8 +9,6 @@ import static net.bytebuddy.jar.asm.Opcodes.INVOKEVIRTUAL; import datadog.context.Context; -import datadog.trace.api.gateway.Flow; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge; import datadog.trace.instrumentation.jetty.JettyBlockingHelper; import java.io.BufferedWriter; @@ -107,9 +104,9 @@ public class HandleVisitor extends MethodVisitor { private static final int CONTEXT_VAR = 1000; /** Whether the next store is supposed to store the Context variable. */ - private boolean lookForStore; +// private boolean lookForStore; /** Whether the Context variable was stored to local index {@link #CONTEXT_VAR}. */ - private boolean contextStored; +// private boolean contextStored; // private int contextVarIndex = -1; /** Whether the handle() method injection was successful .*/ private boolean success; @@ -155,19 +152,20 @@ DelayCertainInsMethodVisitor delayVisitorDelegate() { public void visitMethodInsn( int opcode, String owner, String name, String descriptor, boolean isInterface) { debug("visitMethodInsn"); - debug(">> contextStored: " + contextStored); +// debug(">> contextStored: " + contextStored); debug(">> success: " + success); debug(">> opcode: " + opcode + ", owner: " + owner + ", name: " + name + ", descriptor: " + descriptor); - if (!contextStored) { - lookForStore = - !lookForStore - && opcode == INVOKEVIRTUAL - && name.equals("startSpan") - && descriptor.endsWith("Ldatadog/context/Context;"); - if (lookForStore) { - debug("Found store"); - } - } else if (!success +// if (!contextStored) { +// lookForStore = +// !lookForStore +// && opcode == INVOKEVIRTUAL +// && name.equals("startSpan") +// && descriptor.endsWith("Ldatadog/context/Context;"); +// if (lookForStore) { +// debug("Found store"); +// } +// } else + if (!success && opcode == INVOKEVIRTUAL && owner.equals("org/eclipse/jetty/server/Server") && name.equals("handle") @@ -267,17 +265,17 @@ public void visitMethodInsn( Label beforeRegularDispatch = new Label(); Label afterRegularDispatch = new Label(); - super.visitVarInsn(ALOAD, CONTEXT_VAR); - super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch); - super.visitVarInsn(ALOAD, CONTEXT_VAR); - super.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - "datadog/trace/bootstrap/instrumentation/api/AgentSpan", - "getRequestBlockingAction", - "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), - true); - super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel); - super.visitJumpInsn(GOTO, beforeRegularDispatch); +// super.visitVarInsn(ALOAD, CONTEXT_VAR); +// super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch); +// super.visitVarInsn(ALOAD, CONTEXT_VAR); +// super.visitMethodInsn( +// Opcodes.INVOKEINTERFACE, +// "datadog/trace/bootstrap/instrumentation/api/AgentSpan", +// "getRequestBlockingAction", +// "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), +// true); +// super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel); +// super.visitJumpInsn(GOTO, beforeRegularDispatch); super.visitLabel(doBlockLabel); super.visitFrame(F_SAME, 0, null, 0, null); @@ -301,21 +299,29 @@ public void visitMethodInsn( "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(ALOAD, CONTEXT_VAR); +// super.visitVarInsn(ALOAD, CONTEXT_VAR); +// super.visitMethodInsn( +// Opcodes.INVOKEINTERFACE, +// "datadog/trace/bootstrap/instrumentation/api/AgentSpan", +// "getRequestBlockingAction", +// "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), +// true); super.visitMethodInsn( - Opcodes.INVOKEINTERFACE, - "datadog/trace/bootstrap/instrumentation/api/AgentSpan", - "getRequestBlockingAction", - "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class), - true); - super.visitVarInsn(ALOAD, CONTEXT_VAR); + INVOKESTATIC, + Type.getInternalName(Java8BytecodeBridge.class), + "getCurrentContext", + "()Ldatadog/context/Context;", + false + ); +// super.visitVarInsn(ALOAD, CONTEXT_VAR); // create the lambda super.visitInvokeDynamicInsn( "dispatch", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;" - + Type.getDescriptor(Flow.Action.RequestBlockingAction.class) - + Type.getDescriptor(AgentSpan.class) + // + Type.getDescriptor(Flow.Action.RequestBlockingAction.class) + // + Type.getDescriptor(AgentSpan.class) + + Type.getDescriptor(Context.class) + ")Lorg/eclipse/jetty/server/HttpChannel$Dispatchable;", new Handle( H_INVOKESTATIC, @@ -330,8 +336,9 @@ public void visitMethodInsn( Type.getInternalName(JettyBlockingHelper.class), "blockAndThrowOnFailure", "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;" - + Type.getDescriptor(Flow.Action.RequestBlockingAction.class) - + Type.getDescriptor(AgentSpan.class) + // + Type.getDescriptor(Flow.Action.RequestBlockingAction.class) + // + Type.getDescriptor(AgentSpan.class) + + Type.getDescriptor(Context.class) + ")V", false), Type.getType("()V") @@ -387,19 +394,19 @@ private boolean checkDispatchMethodState(final List savedVisitations) return last instanceof DelayCertainInsMethodVisitor.GetFieldInsn; } - @Override - public void visitVarInsn(int opcode, int varIndex) { - if (lookForStore && opcode == ASTORE) { - debug("Found context"); - contextStored = true; - lookForStore = false; -// contextVarIndex = varIndex; - // Duplicate on stack and store to its own local var -// super.visitInsn(DUP); -// super.visitVarInsn(ASTORE, CONTEXT_VAR); - } - super.visitVarInsn(opcode, varIndex); - } +// @Override +// public void visitVarInsn(int opcode, int varIndex) { +// if (lookForStore && opcode == ASTORE) { +// debug("Found context"); +// contextStored = true; +// lookForStore = false; +//// contextVarIndex = varIndex; +// // Duplicate on stack and store to its own local var +//// super.visitInsn(DUP); +//// super.visitVarInsn(ASTORE, CONTEXT_VAR); +// } +// super.visitVarInsn(opcode, varIndex); +// } // @Override // public void visitMaxs(int maxStack, int maxLocals) { From f40741abecc4c1556e2f34ffcaa445a38c166df4 Mon Sep 17 00:00:00 2001 From: Bruce Bujon Date: Fri, 8 Aug 2025 13:18:16 +0200 Subject: [PATCH 12/23] feat(asm): Improve block check injection Clean up local var hook and use Context.current() instead Refactor helper to use Context instead of AgentSpan and RequestBlockingAction --- .../jetty/HandleRequestVisitor.java | 96 ++++++++-- .../jetty9/DelayCertainInsMethodVisitor.java | 9 +- .../instrumentation/jetty9/HandleVisitor.java | 172 ++++++++++-------- .../JettyBlockingHelperSpecification.groovy | 21 ++- 4 files changed, 195 insertions(+), 103 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java index b6b9275c836..6c032a8f5d4 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java @@ -1,6 +1,11 @@ package datadog.trace.instrumentation.jetty; +import static net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC; + import datadog.context.Context; +import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge; +import java.io.BufferedWriter; +import java.io.IOException; import java.util.List; import net.bytebuddy.jar.asm.Label; import net.bytebuddy.jar.asm.MethodVisitor; @@ -26,12 +31,25 @@ public class HandleRequestVisitor extends MethodVisitor { private static final Logger log = LoggerFactory.getLogger(HandleRequestVisitor.class); - private boolean lookForStore; - private int contextVar = -1; + // private boolean lookForStore; + // private int contextVar = -1; private final int classVersion; private final String connClassInternalName; private boolean success; + private BufferedWriter debugWriter; + + private void debug(String msg) { + if (debugWriter == null) { + return; + } + try { + debugWriter.write(msg); + debugWriter.newLine(); + } catch (IOException ignored) { + } + } + public HandleRequestVisitor( int api, int classVersion, @@ -40,6 +58,18 @@ public HandleRequestVisitor( super(api, methodVisitor); this.classVersion = classVersion; this.connClassInternalName = connClassInternalName; + + // try { + // String path = + // + // "/Users/bruce.bujon/go/src/github.com/DataDog/dd-trace-java/bbujon/debug/HandleRequestVisitor-" + // + System.nanoTime() + // + ".txt"; + // this.debugWriter = new BufferedWriter(new OutputStreamWriter(new + // FileOutputStream(path))); + // debug("Initializing"); + // } catch (IOException ignored) { + // } } DelayLoadsMethodVisitor delayVisitorDelegate() { @@ -49,18 +79,30 @@ DelayLoadsMethodVisitor delayVisitorDelegate() { @Override public void visitMethodInsn( int opcode, String owner, String name, String descriptor, boolean isInterface) { - if (contextVar == -1) { - lookForStore = - !lookForStore - && opcode == Opcodes.INVOKEVIRTUAL - && name.equals("startSpan") - && descriptor.endsWith("Ldatadog.context.Context;"); - } else if (opcode == Opcodes.INVOKEVIRTUAL + // if (contextVar == -1) { + // lookForStore = + // !lookForStore + // && opcode == Opcodes.INVOKEVIRTUAL + // && name.equals("startSpan") + // && descriptor.endsWith("Ldatadog.context.Context;"); + // } else + if (opcode == Opcodes.INVOKEVIRTUAL && owner.equals("org/eclipse/jetty/server/Server") && name.equals("handle") && descriptor.equals("(L" + this.connClassInternalName + ";)V")) { DelayLoadsMethodVisitor mv = delayVisitorDelegate(); List savedLoads = mv.transferLoads(); + debug("visitMethodInsn"); + debug( + "opcode: " + + opcode + + " owner: " + + owner + + " name: " + + name + + " descriptor: " + + descriptor); + debug("savedLoads size: " + savedLoads.size()); if (savedLoads.size() != 2) { mv.commitLoads(savedLoads); super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); @@ -83,7 +125,15 @@ public void visitMethodInsn( "getResponse", "()Lorg/eclipse/jetty/server/Response;", false); - super.visitVarInsn(Opcodes.ALOAD, contextVar); + + super.visitMethodInsn( + INVOKESTATIC, + Type.getInternalName(Java8BytecodeBridge.class), + "getCurrentContext", + "()Ldatadog/context/Context;", + false); + // super.visitVarInsn(Opcodes.ALOAD, contextVar); + super.visitMethodInsn( Opcodes.INVOKESTATIC, Type.getInternalName(JettyBlockingHelper.class), @@ -106,16 +156,16 @@ public void visitMethodInsn( super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); } - - @Override - public void visitVarInsn(int opcode, int varIndex) { - if (lookForStore && opcode == Opcodes.ASTORE) { - contextVar = varIndex; - lookForStore = false; - } - - super.visitVarInsn(opcode, varIndex); - } + // + // @Override + // public void visitVarInsn(int opcode, int varIndex) { + // if (lookForStore && opcode == Opcodes.ASTORE) { + // contextVar = varIndex; + // lookForStore = false; + // } + // + // super.visitVarInsn(opcode, varIndex); + // } @Override public void visitEnd() { @@ -123,6 +173,12 @@ public void visitEnd() { log.warn( "Transformation of Jetty's connection class was not successful. Blocking will likely not work"); } + if (this.debugWriter != null) { + try { + this.debugWriter.close(); + } catch (IOException ignored) { + } + } super.visitEnd(); } diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java index d6a31da5681..3efe79f571a 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/DelayCertainInsMethodVisitor.java @@ -13,12 +13,13 @@ * This method visitor delays the following instructions: * *
    - *
  • Local variable instruction: {@code ALOAD},
  • - *
  • field instructions: {@code GETSTATIC}, {@code GETFIELD}
  • - *
  • method instructions: {@code INVOKEVIRTUAL}
  • + *
  • Local variable instruction: {@code ALOAD}, + *
  • field instructions: {@code GETSTATIC}, {@code GETFIELD} + *
  • method instructions: {@code INVOKEVIRTUAL} *
* - * They can be queried using {@link #transferVisitations()} and manually commited using {@link #commitVisitations(List)}. + * They can be queried using {@link #transferVisitations()} and manually commited using {@link + * #commitVisitations(List)}. */ public class DelayCertainInsMethodVisitor extends MethodVisitor { private final List heldVisitations = new ArrayList<>(); diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java index f405e64783d..2fffb3f628f 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java +++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java @@ -12,9 +12,7 @@ import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge; import datadog.trace.instrumentation.jetty.JettyBlockingHelper; import java.io.BufferedWriter; -import java.io.FileOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.List; import net.bytebuddy.jar.asm.Handle; @@ -30,12 +28,15 @@ * under a condition, for the {@link org.eclipse.jetty.server.HttpChannel} class. * *

In particular, for earlier versions of jetty: + * *

  *   case REQUEST_DISPATCH:
  *   // ...
  *   getServer().handle(this);
  * 
+ * * is replaced with: + * *
  *   case REQUEST_DISPATCH:
  *   // ...
@@ -45,7 +46,9 @@
  *     getServer().handle(this);
  *   }
  * 
+ * * And for later versions of Jetty before 11.16.0, + * *
  *   case DISPATCH:
  *   {
@@ -56,7 +59,9 @@
  *         getServer().handle(HttpChannel.this);
  *       });
  * 
+ * * is replaced with: + * *
  *   case DISPATCH:
  *   {
@@ -75,14 +80,18 @@
  *       });
  *   }
  * 
+ * * And for later versions of Jetty, + * *
  *   case DISPATCH:
  *   {
  *     // ...
  *     dispatch(DispatcherType.REQUEST, _requestDispatcher);
  * 
+ * * is replaced with: + * *
  *   case DISPATCH:
  *   {
@@ -104,12 +113,13 @@ public class HandleVisitor extends MethodVisitor {
   private static final int CONTEXT_VAR = 1000;
 
   /** Whether the next store is supposed to store the Context variable. */
-//  private boolean lookForStore;
+  //  private boolean lookForStore;
   /** Whether the Context variable was stored to local index {@link #CONTEXT_VAR}. */
-//  private boolean contextStored;
-//  private int contextVarIndex = -1;
-  /** Whether the handle() method injection was successful .*/
+  //  private boolean contextStored;
+  //  private int contextVarIndex = -1;
+  /** Whether the handle() method injection was successful . */
   private boolean success;
+
   private final String methodName;
 
   private BufferedWriter debugWriter;
@@ -128,44 +138,58 @@ private void debug(String msg) {
   public HandleVisitor(int api, DelayCertainInsMethodVisitor methodVisitor, String methodName) {
     super(api, methodVisitor);
     this.methodName = methodName;
-    try {
-      String path = "/Users/bruce.bujon/go/src/github.com/DataDog/dd-trace-java/bbujon/debug/HandleVisitor-" + System.nanoTime() + ".txt";
-      this.debugWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path)));
-      debug("Initializing");
-    } catch (IOException ignored) {
-    }
+    // try {
+    //   String path =
+    //
+    // "/Users/bruce.bujon/go/src/github.com/DataDog/dd-trace-java/bbujon/debug/HandleVisitor-"
+    //           + System.nanoTime()
+    //           + ".txt";
+    //   this.debugWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path)));
+    //   debug("Initializing");
+    // } catch (IOException ignored) {
+    // }
   }
 
   DelayCertainInsMethodVisitor delayVisitorDelegate() {
     return (DelayCertainInsMethodVisitor) this.mv;
   }
 
-//  @Override
-//  public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index) {
-//    if (contextStored && index == CONTEXT_VAR) {
-//      super.visitLocalVariable("context", Type.getDescriptor(Context.class), null, start, end, CONTEXT_VAR);
-//    }
-//    super.visitLocalVariable(name, descriptor, signature, start, end, index);
-//  }
+  //  @Override
+  //  public void visitLocalVariable(String name, String descriptor, String signature, Label start,
+  // Label end, int index) {
+  //    if (contextStored && index == CONTEXT_VAR) {
+  //      super.visitLocalVariable("context", Type.getDescriptor(Context.class), null, start, end,
+  // CONTEXT_VAR);
+  //    }
+  //    super.visitLocalVariable(name, descriptor, signature, start, end, index);
+  //  }
 
   @Override
   public void visitMethodInsn(
       int opcode, String owner, String name, String descriptor, boolean isInterface) {
     debug("visitMethodInsn");
-//    debug(">> contextStored: " + contextStored);
+    //    debug(">> contextStored: " + contextStored);
     debug(">> success: " + success);
-    debug(">> opcode: " + opcode + ", owner: " + owner + ", name: " + name + ", descriptor: " + descriptor);
-//    if (!contextStored) {
-//      lookForStore =
-//          !lookForStore
-//              && opcode == INVOKEVIRTUAL
-//              && name.equals("startSpan")
-//              && descriptor.endsWith("Ldatadog/context/Context;");
-//      if (lookForStore) {
-//        debug("Found store");
-//      }
-//    } else
-      if (!success
+    debug(
+        ">> opcode: "
+            + opcode
+            + ", owner: "
+            + owner
+            + ", name: "
+            + name
+            + ", descriptor: "
+            + descriptor);
+    //    if (!contextStored) {
+    //      lookForStore =
+    //          !lookForStore
+    //              && opcode == INVOKEVIRTUAL
+    //              && name.equals("startSpan")
+    //              && descriptor.endsWith("Ldatadog/context/Context;");
+    //      if (lookForStore) {
+    //        debug("Found store");
+    //      }
+    //    } else
+    if (!success
         && opcode == INVOKEVIRTUAL
         && owner.equals("org/eclipse/jetty/server/Server")
         && name.equals("handle")
@@ -180,7 +204,7 @@ public void visitMethodInsn(
        * invokevirtual #78                 // Method getServer:()Lorg/eclipse/jetty/server/Server;
        * aload_0
        */
-      debug("Saved visitation size: "+savedVisitations.size());
+      debug("Saved visitation size: " + savedVisitations.size());
       if (savedVisitations.size() != 3) {
         mv.commitVisitations(savedVisitations);
         super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
@@ -212,9 +236,8 @@ public void visitMethodInsn(
           Type.getInternalName(Java8BytecodeBridge.class),
           "getCurrentContext",
           "()Ldatadog/context/Context;",
-          false
-      );
-//      super.visitVarInsn(ALOAD, CONTEXT_VAR);
+          false);
+      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
       super.visitMethodInsn(
           INVOKESTATIC,
           Type.getInternalName(JettyBlockingHelper.class),
@@ -265,17 +288,17 @@ public void visitMethodInsn(
       Label beforeRegularDispatch = new Label();
       Label afterRegularDispatch = new Label();
 
-//      super.visitVarInsn(ALOAD, CONTEXT_VAR);
-//      super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch);
-//      super.visitVarInsn(ALOAD, CONTEXT_VAR);
-//      super.visitMethodInsn(
-//          Opcodes.INVOKEINTERFACE,
-//          "datadog/trace/bootstrap/instrumentation/api/AgentSpan",
-//          "getRequestBlockingAction",
-//          "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class),
-//          true);
-//      super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel);
-//      super.visitJumpInsn(GOTO, beforeRegularDispatch);
+      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
+      //      super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch);
+      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
+      //      super.visitMethodInsn(
+      //          Opcodes.INVOKEINTERFACE,
+      //          "datadog/trace/bootstrap/instrumentation/api/AgentSpan",
+      //          "getRequestBlockingAction",
+      //          "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class),
+      //          true);
+      //      super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel);
+      //      super.visitJumpInsn(GOTO, beforeRegularDispatch);
 
       super.visitLabel(doBlockLabel);
       super.visitFrame(F_SAME, 0, null, 0, null);
@@ -299,21 +322,20 @@ public void visitMethodInsn(
           "getResponse",
           "()Lorg/eclipse/jetty/server/Response;",
           false);
-//      super.visitVarInsn(ALOAD, CONTEXT_VAR);
-//      super.visitMethodInsn(
-//          Opcodes.INVOKEINTERFACE,
-//          "datadog/trace/bootstrap/instrumentation/api/AgentSpan",
-//          "getRequestBlockingAction",
-//          "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class),
-//          true);
+      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
+      //      super.visitMethodInsn(
+      //          Opcodes.INVOKEINTERFACE,
+      //          "datadog/trace/bootstrap/instrumentation/api/AgentSpan",
+      //          "getRequestBlockingAction",
+      //          "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class),
+      //          true);
       super.visitMethodInsn(
           INVOKESTATIC,
           Type.getInternalName(Java8BytecodeBridge.class),
           "getCurrentContext",
           "()Ldatadog/context/Context;",
-          false
-      );
-//      super.visitVarInsn(ALOAD, CONTEXT_VAR);
+          false);
+      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
 
       // create the lambda
       super.visitInvokeDynamicInsn(
@@ -394,25 +416,25 @@ private boolean checkDispatchMethodState(final List savedVisitations)
     return last instanceof DelayCertainInsMethodVisitor.GetFieldInsn;
   }
 
-//  @Override
-//  public void visitVarInsn(int opcode, int varIndex) {
-//    if (lookForStore && opcode == ASTORE) {
-//      debug("Found context");
-//      contextStored = true;
-//      lookForStore = false;
-////      contextVarIndex = varIndex;
-//      // Duplicate on stack and store to its own local var
-////      super.visitInsn(DUP);
-////      super.visitVarInsn(ASTORE, CONTEXT_VAR);
-//    }
-//    super.visitVarInsn(opcode, varIndex);
-//  }
+  //  @Override
+  //  public void visitVarInsn(int opcode, int varIndex) {
+  //    if (lookForStore && opcode == ASTORE) {
+  //      debug("Found context");
+  //      contextStored = true;
+  //      lookForStore = false;
+  ////      contextVarIndex = varIndex;
+  //      // Duplicate on stack and store to its own local var
+  ////      super.visitInsn(DUP);
+  ////      super.visitVarInsn(ASTORE, CONTEXT_VAR);
+  //    }
+  //    super.visitVarInsn(opcode, varIndex);
+  //  }
 
-//  @Override
-//  public void visitMaxs(int maxStack, int maxLocals) {
-//    debug("VisitMaxs stack: " + maxStack + ", locals: " + maxLocals);
-//    super.visitMaxs(maxStack, max(maxLocals, CONTEXT_VAR + 1));
-//  }
+  //  @Override
+  //  public void visitMaxs(int maxStack, int maxLocals) {
+  //    debug("VisitMaxs stack: " + maxStack + ", locals: " + maxLocals);
+  //    super.visitMaxs(maxStack, max(maxLocals, CONTEXT_VAR + 1));
+  //  }
 
   @Override
   public void visitEnd() {
diff --git a/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy b/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy
index 7f8f29129e4..f1b5173cfd2 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy
+++ b/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy
@@ -1,27 +1,40 @@
 package datadog.trace.instrumentation.jetty
 
 import datadog.trace.api.gateway.Flow
+import datadog.trace.api.gateway.RequestContext
 import datadog.trace.api.internal.TraceSegment
-import datadog.trace.test.util.DDSpecification
+import datadog.trace.bootstrap.instrumentation.api.AgentSpan
 import org.eclipse.jetty.server.Request
 import org.eclipse.jetty.server.Response
+import spock.lang.Specification
 
 import javax.servlet.ServletOutputStream
 
 import static datadog.appsec.api.blocking.BlockingContentType.AUTO
 
-class JettyBlockingHelperSpecification extends DDSpecification {
-  void 'block completes successfully'() {
+// WARNING: Test is never found nor run
+class JettyBlockingHelperSpecification extends Specification {
+  def 'block completes successfully'() {
     setup:
     Request req = Mock()
     Response resp = Mock()
     ServletOutputStream os = Mock()
     TraceSegment seg = Mock()
+    def rba = new Flow.Action.RequestBlockingAction(402, AUTO)
+    RequestContext requestContext = Stub(RequestContext) {
+      getTraceSegment() >> seg
+      getBlockResponseFunction() >> rba
+    }
+    AgentSpan span = Stub(AgentSpan) {
+      getRequestContext() >> requestContext
+      getRequestBlockingAction() >> rba
+    }
 
     when:
-    JettyBlockingHelper.block(seg, req, resp, new Flow.Action.RequestBlockingAction(402, AUTO))
+    JettyBlockingHelper.block(req, resp, span)
 
     then:
+    false == true // Proof test is never run
     1 * resp.isCommitted() >> false
     1 * resp.setStatus(402)
     1 * req.getHeader('Accept') >> 'text/html'

From 89292f800dd5dd3410256570ed0002422fad7afd Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 10:09:17 +0200
Subject: [PATCH 13/23] feat(asm): Improve block check injection

Clean up local var hook and use Context.current() instead
Refactor helper to use Context instead of AgentSpan and RequestBlockingAction
---
 .../jetty/JettyBlockingHelper.java            |  5 +++
 .../instrumentation/jetty9/HandleVisitor.java | 37 ++++++++++++++-----
 2 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java
index eb2e83c748c..72a3af4989f 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java
@@ -242,6 +242,11 @@ public static boolean block(Request request, Response response, Context context)
         rba.getExtraHeaders());
   }
 
+  public static boolean hasRequestBlockingAction(Context context) {
+    AgentSpan span = Java8BytecodeBridge.spanFromContext(context);
+    return span != null && span.getRequestBlockingAction() != null;
+  }
+
   public static void blockAndThrowOnFailure(Request request, Response response, Context context) {
     if (!block(request, response, context)) {
       throw new BlockingException("Throwing after being unable to commit blocking response");
diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
index 2fffb3f628f..22df1e8b5f0 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
@@ -2,8 +2,8 @@
 
 import static net.bytebuddy.jar.asm.Opcodes.ALOAD;
 import static net.bytebuddy.jar.asm.Opcodes.F_SAME;
-import static net.bytebuddy.jar.asm.Opcodes.GOTO;
 import static net.bytebuddy.jar.asm.Opcodes.H_INVOKESTATIC;
+import static net.bytebuddy.jar.asm.Opcodes.IFEQ;
 import static net.bytebuddy.jar.asm.Opcodes.IFNE;
 import static net.bytebuddy.jar.asm.Opcodes.INVOKESTATIC;
 import static net.bytebuddy.jar.asm.Opcodes.INVOKEVIRTUAL;
@@ -275,6 +275,7 @@ public void visitMethodInsn(
         return;
       }
 
+      // TODO Could be moved to #checkDispatchMethodState
       DelayCertainInsMethodVisitor.GetStaticFieldInsn getStaticFieldInsn =
           (DelayCertainInsMethodVisitor.GetStaticFieldInsn) savedVisitations.get(1);
       if ((!getStaticFieldInsn.owner.equals("javax/servlet/DispatcherType")
@@ -284,9 +285,26 @@ public void visitMethodInsn(
         return;
       }
 
-      Label doBlockLabel = new Label();
+      // Label doBlockLabel = new Label();
       Label beforeRegularDispatch = new Label();
-      Label afterRegularDispatch = new Label();
+      // Label afterRegularDispatch = new Label();
+
+      // Add current context to the stack
+      super.visitMethodInsn(
+          INVOKESTATIC,
+          Type.getInternalName(Java8BytecodeBridge.class),
+          "getCurrentContext",
+          "()Ldatadog/context/Context;",
+          false);
+      // Call JettyBlockingHelper.hasRequestBlockingAction(context)
+      super.visitMethodInsn(
+          INVOKESTATIC,
+          Type.getInternalName(JettyBlockingHelper.class),
+          "hasRequestBlockingAction",
+          "(" + Type.getDescriptor(Context.class) + ")Z",
+          false);
+      // If no request blocking action, jump befor the regular dispatch
+      super.visitJumpInsn(IFEQ, beforeRegularDispatch);
 
       //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
       //      super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch);
@@ -300,14 +318,13 @@ public void visitMethodInsn(
       //      super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel);
       //      super.visitJumpInsn(GOTO, beforeRegularDispatch);
 
-      super.visitLabel(doBlockLabel);
-      super.visitFrame(F_SAME, 0, null, 0, null);
+      //      super.visitLabel(doBlockLabel);
+      //      super.visitFrame(F_SAME, 0, null, 0, null);
       // dispatch with a Dispatchable created from JettyBlockingHelper::block
       // first set up the first two arguments to dispatch (this and DispatcherType.REQUEST)
       List loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2));
       mv.commitVisitations(loadThisAndEnum);
-      // set up the arguments to the method underlying the lambda (Request, Response,
-      // RequestBlockingAction, AgentSpan)
+      // set up the arguments to the method underlying the lambda (Request, Response, Context)
       super.visitVarInsn(ALOAD, 0);
       super.visitMethodInsn(
           INVOKEVIRTUAL,
@@ -369,14 +386,14 @@ public void visitMethodInsn(
       // invoke the dispatch method
       super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
 
-      super.visitJumpInsn(GOTO, afterRegularDispatch);
+      // super.visitJumpInsn(GOTO, afterRegularDispatch);
 
       super.visitLabel(beforeRegularDispatch);
       super.visitFrame(F_SAME, 0, null, 0, null);
       mv.commitVisitations(savedVisitations);
       super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
-      super.visitLabel(afterRegularDispatch);
-      super.visitFrame(F_SAME, 0, null, 0, null);
+      // super.visitLabel(afterRegularDispatch);
+      // super.visitFrame(F_SAME, 0, null, 0, null);
       this.success = true;
       return;
     }

From 8c79cba4ff6778576755f12c50c5a40e60cc5f09 Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 12:27:02 +0200
Subject: [PATCH 14/23] feat(asm): Fix injection check test

---
 .../jetty-11/src/test/groovy/HttpChannelAppSecTest.groovy       | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dd-java-agent/instrumentation/jetty-11/src/test/groovy/HttpChannelAppSecTest.groovy b/dd-java-agent/instrumentation/jetty-11/src/test/groovy/HttpChannelAppSecTest.groovy
index 37bc5c8c5bd..4cff73246b2 100644
--- a/dd-java-agent/instrumentation/jetty-11/src/test/groovy/HttpChannelAppSecTest.groovy
+++ b/dd-java-agent/instrumentation/jetty-11/src/test/groovy/HttpChannelAppSecTest.groovy
@@ -73,7 +73,7 @@ class HttpChannelAppSecTest extends AgentTestRunner {
 
     @Override
     void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) {
-      if ('datadog/trace/bootstrap/instrumentation/api/AgentSpan' == owner && 'getRequestBlockingAction' == name) {
+      if ('datadog/trace/instrumentation/jetty/JettyBlockingHelper' == owner && 'hasRequestBlockingAction' == name) {
         blockApplied = true
       }
       super.visitMethodInsn(opcode, owner, name, descriptor, isInterface)

From 365bc7fa631812942280523e44bb3c995302fc6f Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 12:52:48 +0200
Subject: [PATCH 15/23] feat(asm): Restoring GOTO to avoid duplicate dispatch
 call when blocked

---
 .../trace/instrumentation/jetty9/HandleVisitor.java   | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
index 22df1e8b5f0..882223e05c7 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
@@ -2,6 +2,7 @@
 
 import static net.bytebuddy.jar.asm.Opcodes.ALOAD;
 import static net.bytebuddy.jar.asm.Opcodes.F_SAME;
+import static net.bytebuddy.jar.asm.Opcodes.GOTO;
 import static net.bytebuddy.jar.asm.Opcodes.H_INVOKESTATIC;
 import static net.bytebuddy.jar.asm.Opcodes.IFEQ;
 import static net.bytebuddy.jar.asm.Opcodes.IFNE;
@@ -287,7 +288,7 @@ public void visitMethodInsn(
 
       // Label doBlockLabel = new Label();
       Label beforeRegularDispatch = new Label();
-      // Label afterRegularDispatch = new Label();
+      Label afterRegularDispatch = new Label();
 
       // Add current context to the stack
       super.visitMethodInsn(
@@ -303,7 +304,7 @@ public void visitMethodInsn(
           "hasRequestBlockingAction",
           "(" + Type.getDescriptor(Context.class) + ")Z",
           false);
-      // If no request blocking action, jump befor the regular dispatch
+      // If no request blocking action, jump before the regular dispatch
       super.visitJumpInsn(IFEQ, beforeRegularDispatch);
 
       //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
@@ -386,14 +387,14 @@ public void visitMethodInsn(
       // invoke the dispatch method
       super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
 
-      // super.visitJumpInsn(GOTO, afterRegularDispatch);
+      super.visitJumpInsn(GOTO, afterRegularDispatch);
 
       super.visitLabel(beforeRegularDispatch);
       super.visitFrame(F_SAME, 0, null, 0, null);
       mv.commitVisitations(savedVisitations);
       super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
-      // super.visitLabel(afterRegularDispatch);
-      // super.visitFrame(F_SAME, 0, null, 0, null);
+      super.visitLabel(afterRegularDispatch);
+      super.visitFrame(F_SAME, 0, null, 0, null);
       this.success = true;
       return;
     }

From be57c2696f8c08e3f267e0c32594350a5e9f6089 Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 14:28:03 +0200
Subject: [PATCH 16/23] feat(asm): Clean up visitors

---
 .../jetty/HandleRequestVisitor.java           |  72 +--------
 .../instrumentation/jetty9/HandleVisitor.java | 145 ++----------------
 2 files changed, 19 insertions(+), 198 deletions(-)

diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java
index 6c032a8f5d4..e8081846844 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/HandleRequestVisitor.java
@@ -4,8 +4,6 @@
 
 import datadog.context.Context;
 import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge;
-import java.io.BufferedWriter;
-import java.io.IOException;
 import java.util.List;
 import net.bytebuddy.jar.asm.Label;
 import net.bytebuddy.jar.asm.MethodVisitor;
@@ -19,7 +17,7 @@
  * and replaces it with:
  *
  * 
- * if (JettyBlockingHelper.block(this.getRequest(), this.getResponse(), context) {
+ * if (JettyBlockingHelper.block(this.getRequest(), this.getResponse(), Java8BytecodeBridge.getCurrentContext()) {
  *   // nothing
  * } else {
  *   server.handle(this);
@@ -31,25 +29,10 @@
 public class HandleRequestVisitor extends MethodVisitor {
   private static final Logger log = LoggerFactory.getLogger(HandleRequestVisitor.class);
 
-  //  private boolean lookForStore;
-  //  private int contextVar = -1;
   private final int classVersion;
   private final String connClassInternalName;
   private boolean success;
 
-  private BufferedWriter debugWriter;
-
-  private void debug(String msg) {
-    if (debugWriter == null) {
-      return;
-    }
-    try {
-      debugWriter.write(msg);
-      debugWriter.newLine();
-    } catch (IOException ignored) {
-    }
-  }
-
   public HandleRequestVisitor(
       int api,
       int classVersion,
@@ -58,18 +41,6 @@ public HandleRequestVisitor(
     super(api, methodVisitor);
     this.classVersion = classVersion;
     this.connClassInternalName = connClassInternalName;
-
-    //    try {
-    //      String path =
-    //
-    // "/Users/bruce.bujon/go/src/github.com/DataDog/dd-trace-java/bbujon/debug/HandleRequestVisitor-"
-    //              + System.nanoTime()
-    //              + ".txt";
-    //      this.debugWriter = new BufferedWriter(new OutputStreamWriter(new
-    // FileOutputStream(path)));
-    //      debug("Initializing");
-    //    } catch (IOException ignored) {
-    //    }
   }
 
   DelayLoadsMethodVisitor delayVisitorDelegate() {
@@ -79,30 +50,12 @@ DelayLoadsMethodVisitor delayVisitorDelegate() {
   @Override
   public void visitMethodInsn(
       int opcode, String owner, String name, String descriptor, boolean isInterface) {
-    //    if (contextVar == -1) {
-    //      lookForStore =
-    //          !lookForStore
-    //              && opcode == Opcodes.INVOKEVIRTUAL
-    //              && name.equals("startSpan")
-    //              && descriptor.endsWith("Ldatadog.context.Context;");
-    //    } else
     if (opcode == Opcodes.INVOKEVIRTUAL
         && owner.equals("org/eclipse/jetty/server/Server")
         && name.equals("handle")
         && descriptor.equals("(L" + this.connClassInternalName + ";)V")) {
       DelayLoadsMethodVisitor mv = delayVisitorDelegate();
       List savedLoads = mv.transferLoads();
-      debug("visitMethodInsn");
-      debug(
-          "opcode: "
-              + opcode
-              + " owner: "
-              + owner
-              + " name: "
-              + name
-              + " descriptor: "
-              + descriptor);
-      debug("savedLoads size: " + savedLoads.size());
       if (savedLoads.size() != 2) {
         mv.commitLoads(savedLoads);
         super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
@@ -111,6 +64,7 @@ public void visitMethodInsn(
 
       Label afterHandle = new Label();
 
+      // Add Request, Response and Context onto the stack
       super.visitVarInsn(Opcodes.ALOAD, 0);
       super.visitMethodInsn(
           Opcodes.INVOKEVIRTUAL,
@@ -132,8 +86,7 @@ public void visitMethodInsn(
           "getCurrentContext",
           "()Ldatadog/context/Context;",
           false);
-      //      super.visitVarInsn(Opcodes.ALOAD, contextVar);
-
+      // Call JettyBlockingHelper.block(request, response, context)
       super.visitMethodInsn(
           Opcodes.INVOKESTATIC,
           Type.getInternalName(JettyBlockingHelper.class),
@@ -142,10 +95,13 @@ public void visitMethodInsn(
               + Type.getDescriptor(Context.class)
               + ")Z",
           false);
+      // Jump after handle if blocked
       super.visitJumpInsn(Opcodes.IFNE, afterHandle);
 
+      // Inject default handle instructions
       mv.commitLoads(savedLoads);
       super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+      // Add after handle label
       super.visitLabel(afterHandle);
       if (needsStackFrames()) {
         super.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
@@ -156,16 +112,6 @@ public void visitMethodInsn(
 
     super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
   }
-  //
-  //  @Override
-  //  public void visitVarInsn(int opcode, int varIndex) {
-  //    if (lookForStore && opcode == Opcodes.ASTORE) {
-  //      contextVar = varIndex;
-  //      lookForStore = false;
-  //    }
-  //
-  //    super.visitVarInsn(opcode, varIndex);
-  //  }
 
   @Override
   public void visitEnd() {
@@ -173,12 +119,6 @@ public void visitEnd() {
       log.warn(
           "Transformation of Jetty's connection class was not successful. Blocking will likely not work");
     }
-    if (this.debugWriter != null) {
-      try {
-        this.debugWriter.close();
-      } catch (IOException ignored) {
-      }
-    }
     super.visitEnd();
   }
 
diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
index 882223e05c7..567517de5e9 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
@@ -12,8 +12,6 @@
 import datadog.context.Context;
 import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge;
 import datadog.trace.instrumentation.jetty.JettyBlockingHelper;
-import java.io.BufferedWriter;
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import net.bytebuddy.jar.asm.Handle;
@@ -67,12 +65,12 @@
  *   case DISPATCH:
  *   {
  *     // ...
- *     if (span != null && span.getBlockingAction() != null) {
+ *     if (JettyBlockingHelper.hasBlockingRequest(Java8BytecodeBridge.getCurrentContext()) {
  *       Request req = getRequest(); // actually on the stack only
  *       Response resp = getResponse(); // idem
+ *       Context context = Java8BytecodeBridge.getCurrentContext() // idem
  *       dispatch(DispatcherType.REQUEST, () -> {
- *         JettyBlockingHelper.blockAndThrowOnFailure(
- *             request, response, span.getBlockingAction(), span);
+ *         JettyBlockingHelper.blockAndThrowOnFailure(request, response, context);
  *       });
  *     } else {
  *       dispatch(DispatcherType.REQUEST, () -> {
@@ -97,12 +95,12 @@
  *   case DISPATCH:
  *   {
  *     // ...
- *     if (span != null && span.getBlockingAction() != null) {
+ *     if (JettyBlockingHelper.hasBlockingRequest(Java8BytecodeBridge.getCurrentContext()) {
  *       Request req = getRequest(); // actually on the stack only
  *       Response resp = getResponse(); // idem
+ *       Context context = Java8BytecodeBridge.getCurrentContext() // idem
  *       dispatch(DispatcherType.REQUEST, () -> {
- *         JettyBlockingHelper.blockAndThrowOnFailure(
- *             request, response, span.getBlockingAction(), span);
+ *         JettyBlockingHelper.blockAndThrowOnFailure(request, response, context);
  *       });
  *     } else {
  *       dispatch(DispatcherType.REQUEST, _requestDispatcher);
@@ -111,91 +109,28 @@
  */
 public class HandleVisitor extends MethodVisitor {
   private static final Logger log = LoggerFactory.getLogger(HandleVisitor.class);
-  private static final int CONTEXT_VAR = 1000;
-
-  /** Whether the next store is supposed to store the Context variable. */
-  //  private boolean lookForStore;
-  /** Whether the Context variable was stored to local index {@link #CONTEXT_VAR}. */
-  //  private boolean contextStored;
-  //  private int contextVarIndex = -1;
   /** Whether the handle() method injection was successful . */
   private boolean success;
 
   private final String methodName;
 
-  private BufferedWriter debugWriter;
-
-  private void debug(String msg) {
-    if (debugWriter == null) {
-      return;
-    }
-    try {
-      debugWriter.write(msg);
-      debugWriter.newLine();
-    } catch (IOException ignored) {
-    }
-  }
-
   public HandleVisitor(int api, DelayCertainInsMethodVisitor methodVisitor, String methodName) {
     super(api, methodVisitor);
     this.methodName = methodName;
-    // try {
-    //   String path =
-    //
-    // "/Users/bruce.bujon/go/src/github.com/DataDog/dd-trace-java/bbujon/debug/HandleVisitor-"
-    //           + System.nanoTime()
-    //           + ".txt";
-    //   this.debugWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(path)));
-    //   debug("Initializing");
-    // } catch (IOException ignored) {
-    // }
   }
 
   DelayCertainInsMethodVisitor delayVisitorDelegate() {
     return (DelayCertainInsMethodVisitor) this.mv;
   }
 
-  //  @Override
-  //  public void visitLocalVariable(String name, String descriptor, String signature, Label start,
-  // Label end, int index) {
-  //    if (contextStored && index == CONTEXT_VAR) {
-  //      super.visitLocalVariable("context", Type.getDescriptor(Context.class), null, start, end,
-  // CONTEXT_VAR);
-  //    }
-  //    super.visitLocalVariable(name, descriptor, signature, start, end, index);
-  //  }
-
   @Override
   public void visitMethodInsn(
       int opcode, String owner, String name, String descriptor, boolean isInterface) {
-    debug("visitMethodInsn");
-    //    debug(">> contextStored: " + contextStored);
-    debug(">> success: " + success);
-    debug(
-        ">> opcode: "
-            + opcode
-            + ", owner: "
-            + owner
-            + ", name: "
-            + name
-            + ", descriptor: "
-            + descriptor);
-    //    if (!contextStored) {
-    //      lookForStore =
-    //          !lookForStore
-    //              && opcode == INVOKEVIRTUAL
-    //              && name.equals("startSpan")
-    //              && descriptor.endsWith("Ldatadog/context/Context;");
-    //      if (lookForStore) {
-    //        debug("Found store");
-    //      }
-    //    } else
     if (!success
         && opcode == INVOKEVIRTUAL
         && owner.equals("org/eclipse/jetty/server/Server")
         && name.equals("handle")
         && descriptor.equals("(Lorg/eclipse/jetty/server/HttpChannel;)V")) {
-      debug("handle bytecode found");
       DelayCertainInsMethodVisitor mv = delayVisitorDelegate();
       List savedVisitations = mv.transferVisitations();
       /*
@@ -205,7 +140,6 @@ public void visitMethodInsn(
        * invokevirtual #78                 // Method getServer:()Lorg/eclipse/jetty/server/Server;
        * aload_0
        */
-      debug("Saved visitation size: " + savedVisitations.size());
       if (savedVisitations.size() != 3) {
         mv.commitVisitations(savedVisitations);
         super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
@@ -255,7 +189,6 @@ public void visitMethodInsn(
       // Inject label after Server.handle() call to jump here when blocked
       super.visitLabel(afterHandle);
       super.visitFrame(F_SAME, 0, null, 0, null);
-      debug("handle bytecode injected");
       this.success = true;
       return;
     } else if (!success
@@ -276,17 +209,6 @@ public void visitMethodInsn(
         return;
       }
 
-      // TODO Could be moved to #checkDispatchMethodState
-      DelayCertainInsMethodVisitor.GetStaticFieldInsn getStaticFieldInsn =
-          (DelayCertainInsMethodVisitor.GetStaticFieldInsn) savedVisitations.get(1);
-      if ((!getStaticFieldInsn.owner.equals("javax/servlet/DispatcherType")
-              && !getStaticFieldInsn.owner.equals("jakarta/servlet/DispatcherType"))
-          || !getStaticFieldInsn.name.equals("REQUEST")) {
-        super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
-        return;
-      }
-
-      // Label doBlockLabel = new Label();
       Label beforeRegularDispatch = new Label();
       Label afterRegularDispatch = new Label();
 
@@ -307,20 +229,6 @@ public void visitMethodInsn(
       // If no request blocking action, jump before the regular dispatch
       super.visitJumpInsn(IFEQ, beforeRegularDispatch);
 
-      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
-      //      super.visitJumpInsn(Opcodes.IFNULL, beforeRegularDispatch);
-      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
-      //      super.visitMethodInsn(
-      //          Opcodes.INVOKEINTERFACE,
-      //          "datadog/trace/bootstrap/instrumentation/api/AgentSpan",
-      //          "getRequestBlockingAction",
-      //          "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class),
-      //          true);
-      //      super.visitJumpInsn(Opcodes.IFNONNULL, doBlockLabel);
-      //      super.visitJumpInsn(GOTO, beforeRegularDispatch);
-
-      //      super.visitLabel(doBlockLabel);
-      //      super.visitFrame(F_SAME, 0, null, 0, null);
       // dispatch with a Dispatchable created from JettyBlockingHelper::block
       // first set up the first two arguments to dispatch (this and DispatcherType.REQUEST)
       List loadThisAndEnum = new ArrayList<>(savedVisitations.subList(0, 2));
@@ -340,20 +248,12 @@ public void visitMethodInsn(
           "getResponse",
           "()Lorg/eclipse/jetty/server/Response;",
           false);
-      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
-      //      super.visitMethodInsn(
-      //          Opcodes.INVOKEINTERFACE,
-      //          "datadog/trace/bootstrap/instrumentation/api/AgentSpan",
-      //          "getRequestBlockingAction",
-      //          "()" + Type.getDescriptor(Flow.Action.RequestBlockingAction.class),
-      //          true);
       super.visitMethodInsn(
           INVOKESTATIC,
           Type.getInternalName(Java8BytecodeBridge.class),
           "getCurrentContext",
           "()Ldatadog/context/Context;",
           false);
-      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
 
       // create the lambda
       super.visitInvokeDynamicInsn(
@@ -415,6 +315,13 @@ private boolean checkDispatchMethodState(final List savedVisitations)
     if (!(savedVisitations.get(1) instanceof DelayCertainInsMethodVisitor.GetStaticFieldInsn)) {
       return false;
     }
+    DelayCertainInsMethodVisitor.GetStaticFieldInsn getStaticFieldInsn =
+        (DelayCertainInsMethodVisitor.GetStaticFieldInsn) savedVisitations.get(1);
+    if ((!getStaticFieldInsn.owner.equals("javax/servlet/DispatcherType")
+            && !getStaticFieldInsn.owner.equals("jakarta/servlet/DispatcherType"))
+        || !getStaticFieldInsn.name.equals("REQUEST")) {
+      return false;
+    }
 
     // push this to the stack (to create the lambda or access the instance field, which depends on
     // this)
@@ -434,38 +341,12 @@ private boolean checkDispatchMethodState(final List savedVisitations)
     return last instanceof DelayCertainInsMethodVisitor.GetFieldInsn;
   }
 
-  //  @Override
-  //  public void visitVarInsn(int opcode, int varIndex) {
-  //    if (lookForStore && opcode == ASTORE) {
-  //      debug("Found context");
-  //      contextStored = true;
-  //      lookForStore = false;
-  ////      contextVarIndex = varIndex;
-  //      // Duplicate on stack and store to its own local var
-  ////      super.visitInsn(DUP);
-  ////      super.visitVarInsn(ASTORE, CONTEXT_VAR);
-  //    }
-  //    super.visitVarInsn(opcode, varIndex);
-  //  }
-
-  //  @Override
-  //  public void visitMaxs(int maxStack, int maxLocals) {
-  //    debug("VisitMaxs stack: " + maxStack + ", locals: " + maxLocals);
-  //    super.visitMaxs(maxStack, max(maxLocals, CONTEXT_VAR + 1));
-  //  }
-
   @Override
   public void visitEnd() {
     if (!success && !"run".equals(methodName)) {
       log.warn(
           "Transformation of Jetty's connection class was not successful. Blocking will likely not work");
     }
-    if (this.debugWriter != null) {
-      try {
-        this.debugWriter.close();
-      } catch (IOException ignored) {
-      }
-    }
     super.visitEnd();
   }
 }

From 1416a774f44e4b7c9129f56b07854cfda955be47 Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 14:39:04 +0200
Subject: [PATCH 17/23] feat(core): Remove instrumentation name

---
 .../decorator/HttpServerDecoratorBenchmark.java              | 4 ++--
 .../instrumentation/decorator/HttpServerDecorator.java       | 5 +----
 .../instrumentation/decorator/HttpServerDecoratorTest.groovy | 2 +-
 .../trace/instrumentation/akkahttp/DatadogWrapperHelper.java | 2 +-
 .../azure/functions/AzureFunctionsInstrumentation.java       | 2 +-
 .../grizzly/GrizzlyHttpHandlerInstrumentation.java           | 2 +-
 .../instrumentation/grizzlyhttp232/GrizzlyDecorator.java     | 2 +-
 .../trace/instrumentation/jetty11/JettyServerAdvice.java     | 2 +-
 .../trace/instrumentation/jetty12/JettyServerAdvice.java     | 4 ++--
 .../instrumentation/jetty70/JettyServerInstrumentation.java  | 2 +-
 .../instrumentation/jetty76/JettyServerInstrumentation.java  | 2 +-
 .../instrumentation/jetty9/JettyServerInstrumentation.java   | 2 +-
 .../datadog/trace/instrumentation/jetty10/HandleAdvice.java  | 2 +-
 .../liberty20/LibertyServerInstrumentation.java              | 2 +-
 .../liberty23/LibertyServerInstrumentation.java              | 2 +-
 .../netty38/server/HttpServerRequestTracingHandler.java      | 2 +-
 .../netty40/server/HttpServerRequestTracingHandler.java      | 4 ++--
 .../netty41/server/HttpServerRequestTracingHandler.java      | 4 ++--
 .../instrumentation/pekkohttp/DatadogWrapperHelper.java      | 2 +-
 .../datadog/trace/instrumentation/play23/PlayAdvice.java     | 2 +-
 .../datadog/trace/instrumentation/play24/PlayAdvice.java     | 2 +-
 .../datadog/trace/instrumentation/play26/PlayAdvice.java     | 2 +-
 .../instrumentation/restlet/RestletInstrumentation.java      | 2 +-
 .../trace/instrumentation/servlet2/Servlet2Advice.java       | 2 +-
 .../trace/instrumentation/servlet3/Servlet3Advice.java       | 2 +-
 .../spray/SprayHttpServerRunSealedRouteAdvice.java           | 2 +-
 .../synapse3/SynapseServerInstrumentation.java               | 2 +-
 .../instrumentation/tomcat/TomcatServerInstrumentation.java  | 2 +-
 .../instrumentation/undertow/HandlerInstrumentation.java     | 2 +-
 .../undertow/HttpRequestParserInstrumentation.java           | 2 +-
 30 files changed, 34 insertions(+), 37 deletions(-)

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 89d08c4f7d4..42361d7c85f 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
@@ -59,7 +59,7 @@ public void setUp() {
             .build();
     GlobalTracer.forceRegister(tracer);
     decorator = new BenchmarkHttpServerDecorator();
-    Context context = decorator.startSpan("benchmark", Collections.emptyMap(), Context.root());
+    Context context = decorator.startSpan(Collections.emptyMap(), Context.root());
     span = fromContext(context);
   }
 
@@ -101,7 +101,7 @@ public BenchmarkHttpServerDecorator() {
 
     @Override
     protected String[] instrumentationNames() {
-      return new String[0];
+      return new String[] {"benchmark"};
     }
 
     @Override
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 73c2d9e6a8c..774d80d3030 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
@@ -139,10 +139,7 @@ public Context extract(REQUEST_CARRIER carrier) {
    * @param context The parent context of the span to create.
    * @return A new context bundling the span, child of the given parent context.
    */
-  public Context startSpan(
-      String unused, // TODO Remove
-      REQUEST_CARRIER carrier,
-      Context context) { // TODO Rename "context" to "parent"?
+  public Context startSpan(REQUEST_CARRIER carrier, Context context) {
     String instrumentationName =
         instrumentationNames().length == 0 ? "http-server" : instrumentationNames()[0];
     AgentSpanContext.Extracted spanContext = getExtractedSpanContext(context);
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 e2fde2b638a..d038fbdac26 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
@@ -498,7 +498,7 @@ class HttpServerDecoratorTest extends ServerDecoratorTest {
     def decorator = newDecorator(mTracer, null)
 
     when:
-    decorator.startSpan("test", headers, root())
+    decorator.startSpan(headers, root())
 
     then:
     1 * mSpan.setMeasured(true) >> mSpan
diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java
index 31a2f15aaf9..3b8fde49930 100644
--- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java
+++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java
@@ -12,7 +12,7 @@
 public class DatadogWrapperHelper {
   public static ContextScope createSpan(final HttpRequest request) {
     final Context parentContext = DECORATE.extract(request);
-    final Context context = DECORATE.startSpan("akka-http", request, parentContext);
+    final Context context = DECORATE.startSpan(request, parentContext);
     final AgentSpan span = spanFromContext(context);
     DECORATE.afterStart(span);
     DECORATE.onRequest(span, request, request, parentContext);
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 233b6461a9e..e0c06f4c842 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
@@ -68,7 +68,7 @@ public static ContextScope methodEnter(
         @Advice.Argument(0) final HttpRequestMessage request,
         @Advice.Argument(1) final ExecutionContext executionContext) {
       final Context parentContext = DECORATE.extract(request);
-      final Context context = DECORATE.startSpan("azure-functions", request, parentContext);
+      final Context context = DECORATE.startSpan(request, parentContext);
       final AgentSpan span = spanFromContext(context);
       DECORATE.afterStart(span, executionContext.getFunctionName());
       DECORATE.onRequest(span, request, request, parentContext);
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 817d9d6fb91..cc12314e046 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
@@ -73,7 +73,7 @@ public static class HandleAdvice {
       }
 
       final Context parentContext = DECORATE.extract(request);
-      final Context context = DECORATE.startSpan("grizzly", request, parentContext);
+      final Context context = DECORATE.startSpan(request, parentContext);
       final AgentSpan span = spanFromContext(context);
       DECORATE.afterStart(span);
       DECORATE.onRequest(span, request, request, parentContext);
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 3dcbab61f0c..978a0d65824 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
@@ -115,7 +115,7 @@ public static NextAction onHttpCodecFilterExit(
     HttpRequestPacket httpRequest = (HttpRequestPacket) httpHeader;
     HttpResponsePacket httpResponse = httpRequest.getResponse();
     Context parentContext = DECORATE.extract(httpRequest);
-    Context context = DECORATE.startSpan("grizzly", httpRequest, parentContext);
+    Context context = DECORATE.startSpan(httpRequest, parentContext);
     ContextScope scope = context.attach();
     AgentSpan span = spanFromContext(context);
     DECORATE.afterStart(span);
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 91d3ca7ad67..19003df1284 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
@@ -27,7 +27,7 @@ public static ContextScope onEnter(
       }
 
       final Context parentContext = DECORATE.extract(req);
-      final Context context = DECORATE.startSpan("jetty", req, parentContext);
+      final Context context = DECORATE.startSpan(req, parentContext);
       final ContextScope scope = context.attach();
       span = spanFromContext(context);
       span.setMeasured(true);
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 173e0c9c7fb..32c44541566 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
@@ -29,8 +29,8 @@ public static void onExit(
       }
 
       final Context parentContext = DECORATE.extract(req);
-      final Context context = DECORATE.startSpan("jetty", req, parentContext);
-      try (final ContextScope scope = context.attach()) {
+      final Context context = DECORATE.startSpan(req, parentContext);
+      try (final ContextScope ignored = context.attach()) {
         final AgentSpan span = spanFromContext(context);
         span.setMeasured(true);
         DECORATE.afterStart(span);
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 5321e025219..af7f8a4c7d6 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
@@ -156,7 +156,7 @@ public static ContextScope onEnter(
       }
 
       final Context parentContext = DECORATE.extract(req);
-      final Context context = DECORATE.startSpan("jetty", req, parentContext);
+      final Context context = DECORATE.startSpan(req, parentContext);
       final ContextScope scope = context.attach();
       span = spanFromContext(context);
       DECORATE.afterStart(span);
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 b35038ebbf9..ec9ef262fb1 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
@@ -157,7 +157,7 @@ public static ContextScope onEnter(
       }
 
       final Context parentContext = DECORATE.extract(req);
-      final Context context = DECORATE.startSpan("jetty", req, parentContext);
+      final Context context = DECORATE.startSpan(req, parentContext);
       final ContextScope scope = context.attach();
       span = spanFromContext(context);
       DECORATE.afterStart(span);
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 a984d3695d9..b85a639fb2b 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
@@ -171,7 +171,7 @@ public static ContextScope onEnter(
       }
 
       final Context parentContext = DECORATE.extract(req);
-      final Context context = DECORATE.startSpan("jetty", req, parentContext);
+      final Context context = DECORATE.startSpan(req, parentContext);
       final ContextScope scope = context.attach();
       span = spanFromContext(context);
       DECORATE.afterStart(span);
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 8bef773928f..ece1c7720d2 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
@@ -25,7 +25,7 @@ public static ContextScope onEnter(
     }
 
     final Context parentContext = DECORATE.extract(req);
-    final Context context = DECORATE.startSpan("jetty", req, parentContext);
+    final Context context = DECORATE.startSpan(req, parentContext);
     span = spanFromContext(context);
     DECORATE.afterStart(span);
     DECORATE.onRequest(span, req, req, parentContext);
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 c6ee4716184..12b993030b7 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
@@ -106,7 +106,7 @@ public static class HandleRequestAdvice {
 
       final Context parentContext = DECORATE.extract(request);
       request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext);
-      final Context context = DECORATE.startSpan("liberty", request, parentContext);
+      final Context context = DECORATE.startSpan(request, parentContext);
       scope = context.attach();
       final AgentSpan span = spanFromContext(context);
       if (Config.get().isJeeSplitByDeployment()) {
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 f87ee3a637c..cfb8425f1ce 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
@@ -108,7 +108,7 @@ public static class HandleRequestAdvice {
 
       final Context parentContext = DECORATE.extract(request);
       request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext);
-      final Context context = DECORATE.startSpan("liberty", request, parentContext);
+      final Context context = DECORATE.startSpan(request, parentContext);
       scope = context.attach();
       final AgentSpan span = spanFromContext(context);
       if (Config.get().isJeeSplitByDeployment()) {
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 4e0e6bf1bd2..862dc01cb2d 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
@@ -45,7 +45,7 @@ public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent
     final HttpRequest request = (HttpRequest) msg.getMessage();
     final HttpHeaders headers = request.headers();
     final Context parentContext = DECORATE.extract(headers);
-    final Context context = DECORATE.startSpan("netty", headers, parentContext);
+    final Context context = DECORATE.startSpan(headers, parentContext);
 
     channelTraceContext.reset();
     channelTraceContext.setRequestHeaders(headers);
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 936e3762ee6..58bb49cb647 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
@@ -41,9 +41,9 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) {
     final HttpRequest request = (HttpRequest) msg;
     final HttpHeaders headers = request.headers();
     final Context parentContext = DECORATE.extract(headers);
-    final Context context = DECORATE.startSpan("netty", headers, parentContext);
+    final Context context = DECORATE.startSpan(headers, parentContext);
 
-    try (final ContextScope scope = context.attach()) {
+    try (final ContextScope ignored = context.attach()) {
       final AgentSpan span = spanFromContext(context);
       DECORATE.afterStart(span);
       DECORATE.onRequest(span, channel, request, parentContext);
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 09756fec727..30197668254 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
@@ -40,9 +40,9 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) {
     final HttpRequest request = (HttpRequest) msg;
     final HttpHeaders headers = request.headers();
     final Context parentContext = DECORATE.extract(headers);
-    final Context context = DECORATE.startSpan("netty", headers, parentContext);
+    final Context context = DECORATE.startSpan(headers, parentContext);
 
-    try (final ContextScope scope = context.attach()) {
+    try (final ContextScope ignored = context.attach()) {
       final AgentSpan span = spanFromContext(context);
       DECORATE.afterStart(span);
       DECORATE.onRequest(span, channel, request, parentContext);
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 71edb000b54..4a5c6187584 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
@@ -12,7 +12,7 @@
 public class DatadogWrapperHelper {
   public static ContextScope createSpan(final HttpRequest request) {
     final Context parentContext = DECORATE.extract(request);
-    final Context context = DECORATE.startSpan("pekko", request, parentContext);
+    final Context context = DECORATE.startSpan(request, parentContext);
     final AgentSpan span = spanFromContext(context);
     DECORATE.afterStart(span);
     DECORATE.onRequest(span, request, request, parentContext);
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 c6e67e18093..07145401713 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
@@ -26,7 +26,7 @@ public static ContextScope onEnter(@Advice.Argument(0) final Request req) {
     if (activeSpan() == null) {
       Headers headers = req.headers();
       final Context parentContext = DECORATE.extract(headers);
-      final Context context = DECORATE.startSpan("play", headers, parentContext);
+      final Context context = DECORATE.startSpan(headers, parentContext);
       span = spanFromContext(context);
       scope = context.attach();
     } else {
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 efae890a598..f40924bb90f 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
@@ -32,7 +32,7 @@ public static ContextScope onEnter(@Advice.Argument(value = 0, readOnly = false)
     if (activeSpan() == null) {
       final Headers headers = req.headers();
       final Context parentContext = DECORATE.extract(headers);
-      final Context context = DECORATE.startSpan("play", headers, parentContext);
+      final Context context = DECORATE.startSpan(headers, parentContext);
       span = spanFromContext(context);
       scope = context.attach();
     } else {
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 e944793308b..b7854fc55d1 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
@@ -33,7 +33,7 @@ public static ContextScope onEnter(
     if (activeSpan() == null) {
       final Headers headers = req.headers();
       extractedContext = DECORATE.extract(headers);
-      final Context context = DECORATE.startSpan("play", headers, extractedContext);
+      final Context context = DECORATE.startSpan(headers, extractedContext);
       span = spanFromContext(context);
       scope = context.attach();
     } else {
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 081963d3f72..6c6b16a938c 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
@@ -55,7 +55,7 @@ public static class RestletHandleAdvice {
     @Advice.OnMethodEnter(suppress = Throwable.class)
     public static ContextScope beginRequest(@Advice.Argument(0) final HttpExchange exchange) {
       Context parentContext = DECORATE.extract(exchange);
-      Context context = DECORATE.startSpan("restlet", exchange, parentContext);
+      Context context = DECORATE.startSpan(exchange, parentContext);
       AgentSpan span = spanFromContext(context);
       ContextScope scope = context.attach();
       DECORATE.afterStart(span);
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 6cacae2b25b..120fbb039a0 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
@@ -52,7 +52,7 @@ public static boolean onEnter(
     }
 
     final Context parentContext = DECORATE.extract(httpServletRequest);
-    final Context context = DECORATE.startSpan("servlet", httpServletRequest, parentContext);
+    final Context context = DECORATE.startSpan(httpServletRequest, parentContext);
     scope = context.attach();
     final AgentSpan span = spanFromContext(context);
     DECORATE.afterStart(span);
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 cb5508b0202..a06cbda8c59 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
@@ -84,7 +84,7 @@ public static boolean onEnter(
     }
 
     final Context parentContext = DECORATE.extract(httpServletRequest);
-    final Context context = DECORATE.startSpan("request", httpServletRequest, parentContext);
+    final Context context = DECORATE.startSpan(httpServletRequest, parentContext);
     scope = context.attach();
 
     final AgentSpan span = spanFromContext(context);
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 06ce6ea07e7..f2aa29be00e 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
@@ -26,7 +26,7 @@ public static ContextScope enter(
       final HttpRequest request = ctx.request();
       Context parentContext = DECORATE.extract(request);
       extractedSpanContext = DECORATE.getExtractedSpanContext(parentContext);
-      context = DECORATE.startSpan("spray", request, parentContext);
+      context = DECORATE.startSpan(request, parentContext);
       span = spanFromContext(context);
     } else {
       extractedSpanContext = null;
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 52246f6b360..6a01290b458 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
@@ -68,7 +68,7 @@ public static ContextScope beginRequest(
       // check incoming request for distributed trace ids
       HttpRequest request = connection.getHttpRequest();
       Context parentContext = DECORATE.extract(request);
-      Context context = DECORATE.startSpan("synapse", request, parentContext);
+      Context context = DECORATE.startSpan(request, parentContext);
       ContextScope scope = context.attach();
       AgentSpan span = spanFromContext(context);
       DECORATE.afterStart(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 4467c346ad5..5a3ed4dee6f 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(parentContext));
 
-      final Context context = DECORATE.startSpan("tomcat", req, parentContext);
+      final Context context = DECORATE.startSpan(req, parentContext);
       final ContextScope scope = context.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 bd78c68ce21..81ba04a99d1 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
@@ -95,7 +95,7 @@ public static void onEnter(
       }
 
       final Context parentContext = DECORATE.extract(exchange);
-      final Context context = DECORATE.startSpan("undertow", exchange, parentContext);
+      final Context context = DECORATE.startSpan(exchange, parentContext);
       scope = context.attach();
       final AgentSpan span = spanFromContext(context);
       DECORATE.afterStart(span);
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 9a77c060a39..5977c2af5b4 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
@@ -76,7 +76,7 @@ public static void afterRequestParse(
       try {
         if (span == null) {
           final Context parentContext = DECORATE.extract(exchange);
-          final Context context = DECORATE.startSpan("undertow", exchange, parentContext);
+          final Context context = DECORATE.startSpan(exchange, parentContext);
           span = spanFromContext(context);
           scope = context.attach();
           DECORATE.afterStart(span);

From 8c825eff54764636230db95908f8fb3a61eb3223 Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 14:49:59 +0200
Subject: [PATCH 18/23] feat(core): Clean up HttpServerDecorator

---
 .../decorator/HttpServerDecorator.java        | 38 +++++++------------
 1 file changed, 14 insertions(+), 24 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 774d80d3030..af6327ae8e7 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
@@ -142,11 +142,9 @@ public Context extract(REQUEST_CARRIER carrier) {
   public Context startSpan(REQUEST_CARRIER carrier, Context context) {
     String instrumentationName =
         instrumentationNames().length == 0 ? "http-server" : instrumentationNames()[0];
-    AgentSpanContext.Extracted spanContext = getExtractedSpanContext(context);
+    AgentSpanContext.Extracted extracted = callIGCallbackStart(context);
     AgentSpan span =
-        tracer()
-            .startSpan(instrumentationName, spanName(), callIGCallbackStart(spanContext))
-            .setMeasured(true);
+        tracer().startSpan(instrumentationName, spanName(), extracted).setMeasured(true);
     Flow flow = callIGCallbackRequestHeaders(span, carrier);
     if (flow.getAction() instanceof Flow.Action.RequestBlockingAction) {
       span.setRequestBlockingAction((Flow.Action.RequestBlockingAction) flow.getAction());
@@ -158,20 +156,6 @@ public Context startSpan(REQUEST_CARRIER carrier, Context context) {
     return context.with(span);
   }
 
-  //  /**
-  //   * Use {@code startSpan(String instrumentationName, REQUEST_CARRIER carrier, Context context)}
-  // instead.
-  //   */
-  //  @Deprecated
-  //  public Context startSpan(REQUEST_CARRIER carrier, Context context) {
-  //    return startSpan("http-server", carrier, 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,
@@ -180,6 +164,11 @@ public AgentSpan onRequest(
     return onRequest(span, connection, request, getExtractedSpanContext(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,
@@ -395,7 +384,8 @@ public AgentSpan onResponse(final AgentSpan span, final RESPONSE response) {
     return span;
   }
 
-  private AgentSpanContext.Extracted callIGCallbackStart(final AgentSpanContext.Extracted context) {
+  private AgentSpanContext.Extracted callIGCallbackStart(final Context context) {
+    AgentSpanContext.Extracted extracted = getExtractedSpanContext(context);
     AgentTracer.TracerAPI tracer = tracer();
     Supplier> startedCbAppSec =
         tracer.getCallbackProvider(RequestContextSlot.APPSEC).getCallback(EVENTS.requestStarted());
@@ -403,14 +393,14 @@ private AgentSpanContext.Extracted callIGCallbackStart(final AgentSpanContext.Ex
         tracer.getCallbackProvider(RequestContextSlot.IAST).getCallback(EVENTS.requestStarted());
 
     if (startedCbAppSec == null && startedCbIast == null) {
-      return context;
+      return extracted;
     }
 
     TagContext tagContext = null;
-    if (context == null) {
+    if (extracted == null) {
       tagContext = new TagContext();
-    } else if (context instanceof TagContext) {
-      tagContext = (TagContext) context;
+    } else if (extracted instanceof TagContext) {
+      tagContext = (TagContext) extracted;
     }
 
     if (tagContext != null) {
@@ -423,7 +413,7 @@ private AgentSpanContext.Extracted callIGCallbackStart(final AgentSpanContext.Ex
       return tagContext;
     }
 
-    return context;
+    return extracted;
   }
 
   @Override

From 57e8038cc38c4c406b11c6b49067ac86829e348d Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Mon, 11 Aug 2025 15:21:00 +0200
Subject: [PATCH 19/23] feat(asm): Clean up visitors

---
 .../datadog/trace/instrumentation/jetty9/HandleVisitor.java  | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
index 567517de5e9..6fe101a3a10 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty9/HandleVisitor.java
@@ -172,7 +172,6 @@ public void visitMethodInsn(
           "getCurrentContext",
           "()Ldatadog/context/Context;",
           false);
-      //      super.visitVarInsn(ALOAD, CONTEXT_VAR);
       super.visitMethodInsn(
           INVOKESTATIC,
           Type.getInternalName(JettyBlockingHelper.class),
@@ -259,8 +258,6 @@ public void visitMethodInsn(
       super.visitInvokeDynamicInsn(
           "dispatch",
           "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;"
-              // + Type.getDescriptor(Flow.Action.RequestBlockingAction.class)
-              // + Type.getDescriptor(AgentSpan.class)
               + Type.getDescriptor(Context.class)
               + ")Lorg/eclipse/jetty/server/HttpChannel$Dispatchable;",
           new Handle(
@@ -276,8 +273,6 @@ public void visitMethodInsn(
                 Type.getInternalName(JettyBlockingHelper.class),
                 "blockAndThrowOnFailure",
                 "(Lorg/eclipse/jetty/server/Request;Lorg/eclipse/jetty/server/Response;"
-                    // + Type.getDescriptor(Flow.Action.RequestBlockingAction.class)
-                    // + Type.getDescriptor(AgentSpan.class)
                     + Type.getDescriptor(Context.class)
                     + ")V",
                 false),

From 44f8ed9e8ee948bd16175eec3e6c62b6cd177d74 Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Tue, 12 Aug 2025 11:35:02 +0200
Subject: [PATCH 20/23] feat(play): Improve context usage in advice

---
 .../instrumentation/play26/PlayAdvice.java     | 14 +++++++-------
 .../play26/PlayHttpServerDecorator.java        | 18 +++++++++---------
 2 files changed, 16 insertions(+), 16 deletions(-)

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 b7854fc55d1..4aee183c204 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
@@ -9,6 +9,7 @@
 import datadog.context.Context;
 import datadog.context.ContextScope;
 import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
+import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge;
 import datadog.trace.bootstrap.instrumentation.api.ResourceNamePriorities;
 import net.bytebuddy.asm.Advice;
 import play.api.mvc.Action;
@@ -19,9 +20,8 @@
 
 public class PlayAdvice {
   @Advice.OnMethodEnter(suppress = Throwable.class)
-  public static ContextScope onEnter(
-      @Advice.Argument(value = 0, readOnly = false) Request req,
-      @Advice.Local("extractedContext") Context extractedContext) {
+  public static ContextScope onEnter(@Advice.Argument(value = 0, readOnly = false) Request req) {
+    final Context parentContext;
     final AgentSpan span;
     final ContextScope scope;
 
@@ -32,13 +32,14 @@ public static ContextScope onEnter(
 
     if (activeSpan() == null) {
       final Headers headers = req.headers();
-      extractedContext = DECORATE.extract(headers);
-      final Context context = DECORATE.startSpan(headers, extractedContext);
+      parentContext = DECORATE.extract(headers);
+      final Context context = DECORATE.startSpan(headers, parentContext);
       span = spanFromContext(context);
       scope = context.attach();
     } else {
       // An upstream framework (e.g. akka-http, netty) has already started the span.
       // Do not extract the context.
+      parentContext = Java8BytecodeBridge.getRootContext();
       span = startSpan("play", PLAY_REQUEST);
       scope = span.attach();
     }
@@ -50,7 +51,7 @@ public static ContextScope onEnter(
 
     // Moved from OnMethodExit
     // Call onRequest on return after tags are populated.
-    DECORATE.onRequest(span, req, req, extractedContext);
+    DECORATE.onRequest(span, req, req, parentContext);
 
     return scope;
   }
@@ -58,7 +59,6 @@ public static ContextScope onEnter(
   @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
   public static void stopTraceOnResponse(
       @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,
diff --git a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java
index 1979bebad98..d4c5851df76 100644
--- a/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java
+++ b/dd-java-agent/instrumentation/play-2.6/src/main/java/datadog/trace/instrumentation/play26/PlayHttpServerDecorator.java
@@ -3,6 +3,7 @@
 import static datadog.trace.api.gateway.Events.EVENTS;
 import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR;
 
+import datadog.context.Context;
 import datadog.trace.api.Config;
 import datadog.trace.api.cache.DDCache;
 import datadog.trace.api.cache.DDCaches;
@@ -11,7 +12,6 @@
 import datadog.trace.api.gateway.RequestContextSlot;
 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.ResourceNamePriorities;
 import datadog.trace.bootstrap.instrumentation.api.URIDataAdapter;
 import datadog.trace.bootstrap.instrumentation.api.URIUtils;
@@ -36,7 +36,7 @@
 import scala.Option;
 
 public class PlayHttpServerDecorator
-    extends HttpServerDecorator {
+    extends HttpServerDecorator, Request, Result, Headers> {
   private static final Logger LOG = LoggerFactory.getLogger(PlayHttpServerDecorator.class);
   public static final boolean REPORT_HTTP_STATUS = Config.get().getPlayReportHttpStatus();
   public static final CharSequence PLAY_REQUEST = UTF8BytesString.create("play.request");
@@ -96,17 +96,17 @@ public CharSequence spanName() {
   }
 
   @Override
-  protected String method(final Request httpRequest) {
+  protected String method(final Request httpRequest) {
     return httpRequest.method();
   }
 
   @Override
-  protected URIDataAdapter url(final Request request) {
+  protected URIDataAdapter url(final Request request) {
     return new RequestURIDataAdapter(request);
   }
 
   @Override
-  protected String peerHostIP(final Request request) {
+  protected String peerHostIP(final Request request) {
     RemoteConnection connection = request.connection();
     if (connection instanceof RemoteConnectionWithRawAddress) {
       return ((RemoteConnectionWithRawAddress) connection).rawRemoteAddressString();
@@ -116,7 +116,7 @@ protected String peerHostIP(final Request request) {
   }
 
   @Override
-  protected int peerPort(final Request request) {
+  protected int peerPort(final Request request) {
     return 0;
   }
 
@@ -128,9 +128,9 @@ protected int status(final Result httpResponse) {
   @Override
   public AgentSpan onRequest(
       final AgentSpan span,
-      final Request connection,
-      final Request request,
-      AgentSpanContext.Extracted context) {
+      final Request connection,
+      final Request request,
+      final Context context) {
     super.onRequest(span, connection, request, context);
     if (request != null) {
       // more about routes here:

From 8eed5bac25cfe83ac9ddea7b6c33c27c24c5037a Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Tue, 12 Aug 2025 11:38:31 +0200
Subject: [PATCH 21/23] feat(bootstrap): Improve default instrumentation name
 for http servers

---
 .../instrumentation/decorator/HttpServerDecorator.java      | 6 +++++-
 1 file changed, 5 insertions(+), 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 af6327ae8e7..bca86637d5d 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
@@ -72,6 +72,7 @@ public abstract class HttpServerDecorator 0
+            ? instrumentationNames[0]
+            : DEFAULT_INSTRUMENTATION_NAME;
     AgentSpanContext.Extracted extracted = callIGCallbackStart(context);
     AgentSpan span =
         tracer().startSpan(instrumentationName, spanName(), extracted).setMeasured(true);

From 32b8a2a0fe7c6ad74f2841e702f730e6e5cfab3c Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Tue, 12 Aug 2025 12:54:35 +0200
Subject: [PATCH 22/23] feat: Remove Java8BytecodeBridge usage where it's not
 needed

---
 .../instrumentation/akkahttp/DatadogWrapperHelper.java      | 4 ++--
 .../azure/functions/AzureFunctionsInstrumentation.java      | 6 +++---
 .../trace/instrumentation/jetty11/JettyServerAdvice.java    | 4 ++--
 .../trace/instrumentation/jetty12/JettyServerAdvice.java    | 4 ++--
 .../trace/instrumentation/jetty/JettyBlockingHelper.java    | 6 +++---
 .../liberty20/LibertyServerInstrumentation.java             | 6 +++---
 .../liberty23/LibertyServerInstrumentation.java             | 6 +++---
 .../instrumentation/pekkohttp/DatadogWrapperHelper.java     | 4 ++--
 8 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java
index 3b8fde49930..4c45b352c83 100644
--- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java
+++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/src/main/java/datadog/trace/instrumentation/akkahttp/DatadogWrapperHelper.java
@@ -1,6 +1,6 @@
 package datadog.trace.instrumentation.akkahttp;
 
-import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext;
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 import static datadog.trace.instrumentation.akkahttp.AkkaHttpServerDecorator.DECORATE;
 
 import akka.http.scaladsl.model.HttpRequest;
@@ -13,7 +13,7 @@ public class DatadogWrapperHelper {
   public static ContextScope createSpan(final HttpRequest request) {
     final Context parentContext = DECORATE.extract(request);
     final Context context = DECORATE.startSpan(request, parentContext);
-    final AgentSpan span = spanFromContext(context);
+    final AgentSpan span = fromContext(context);
     DECORATE.afterStart(span);
     DECORATE.onRequest(span, request, request, parentContext);
 
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 e0c06f4c842..472f45bbc77 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.Java8BytecodeBridge.spanFromContext;
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 import static datadog.trace.bootstrap.instrumentation.decorator.http.HttpResourceDecorator.HTTP_RESOURCE_DECORATOR;
 import static datadog.trace.instrumentation.azure.functions.AzureFunctionsDecorator.DECORATE;
 import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@@ -69,7 +69,7 @@ public static ContextScope methodEnter(
         @Advice.Argument(1) final ExecutionContext executionContext) {
       final Context parentContext = DECORATE.extract(request);
       final Context context = DECORATE.startSpan(request, parentContext);
-      final AgentSpan span = spanFromContext(context);
+      final AgentSpan span = fromContext(context);
       DECORATE.afterStart(span, executionContext.getFunctionName());
       DECORATE.onRequest(span, request, request, parentContext);
       HTTP_RESOURCE_DECORATOR.withRoute(
@@ -82,7 +82,7 @@ public static void methodExit(
         @Advice.Enter final ContextScope scope,
         @Advice.Return final HttpResponseMessage response,
         @Advice.Thrown final Throwable throwable) {
-      final AgentSpan span = spanFromContext(scope.context());
+      final AgentSpan span = fromContext(scope.context());
       DECORATE.onError(span, throwable);
       DECORATE.onResponse(span, response);
       DECORATE.beforeFinish(span);
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 19003df1284..65dbaffbe4e 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
@@ -1,7 +1,7 @@
 package datadog.trace.instrumentation.jetty11;
 
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 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.jetty11.JettyDecorator.DECORATE;
 
@@ -29,7 +29,7 @@ public static ContextScope onEnter(
       final Context parentContext = DECORATE.extract(req);
       final Context context = DECORATE.startSpan(req, parentContext);
       final ContextScope scope = context.attach();
-      span = spanFromContext(context);
+      span = fromContext(context);
       span.setMeasured(true);
       DECORATE.afterStart(span);
       DECORATE.onRequest(span, req, req, parentContext);
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 32c44541566..ed8c193b334 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,6 +1,6 @@
 package datadog.trace.instrumentation.jetty12;
 
-import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext;
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE;
 import static datadog.trace.instrumentation.jetty12.JettyDecorator.DECORATE;
 
@@ -31,7 +31,7 @@ public static void onExit(
       final Context parentContext = DECORATE.extract(req);
       final Context context = DECORATE.startSpan(req, parentContext);
       try (final ContextScope ignored = context.attach()) {
-        final AgentSpan span = spanFromContext(context);
+        final AgentSpan span = fromContext(context);
         span.setMeasured(true);
         DECORATE.afterStart(span);
         DECORATE.onRequest(span, req, req, parentContext);
diff --git a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java
index 72a3af4989f..57667466b7b 100644
--- a/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java
+++ b/dd-java-agent/instrumentation/jetty-common/src/main/java/datadog/trace/instrumentation/jetty/JettyBlockingHelper.java
@@ -1,5 +1,6 @@
 package datadog.trace.instrumentation.jetty;
 
+import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext;
 import static java.lang.invoke.MethodHandles.collectArguments;
 import static java.lang.invoke.MethodHandles.lookup;
 import static java.lang.invoke.MethodType.methodType;
@@ -11,7 +12,6 @@
 import datadog.trace.api.internal.TraceSegment;
 import datadog.trace.bootstrap.blocking.BlockingActionHelper;
 import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
-import datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge;
 import datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator;
 import java.io.OutputStream;
 import java.io.PrintWriter;
@@ -228,7 +228,7 @@ public static boolean block(
   }
 
   public static boolean block(Request request, Response response, Context context) {
-    AgentSpan span = Java8BytecodeBridge.spanFromContext(context);
+    AgentSpan span = spanFromContext(context);
     Flow.Action.RequestBlockingAction rba;
     if (span == null || (rba = span.getRequestBlockingAction()) == null) {
       return false;
@@ -243,7 +243,7 @@ public static boolean block(Request request, Response response, Context context)
   }
 
   public static boolean hasRequestBlockingAction(Context context) {
-    AgentSpan span = Java8BytecodeBridge.spanFromContext(context);
+    AgentSpan span = spanFromContext(context);
     return span != null && span.getRequestBlockingAction() != null;
   }
 
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 12b993030b7..80b94a4377e 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.Java8BytecodeBridge.spanFromContext;
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 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;
@@ -108,7 +108,7 @@ public static class HandleRequestAdvice {
       request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext);
       final Context context = DECORATE.startSpan(request, parentContext);
       scope = context.attach();
-      final AgentSpan span = spanFromContext(context);
+      final AgentSpan span = fromContext(context);
       if (Config.get().isJeeSplitByDeployment()) {
         final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext();
         if (dispatcherContext != null) {
@@ -164,7 +164,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(spanFromContext(scope.context()), request);
+        DECORATE.getPath(fromContext(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 cfb8425f1ce..efe145611cd 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.Java8BytecodeBridge.spanFromContext;
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 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;
@@ -110,7 +110,7 @@ public static class HandleRequestAdvice {
       request.setAttribute(DD_EXTRACTED_CONTEXT_ATTRIBUTE, parentContext);
       final Context context = DECORATE.startSpan(request, parentContext);
       scope = context.attach();
-      final AgentSpan span = spanFromContext(context);
+      final AgentSpan span = fromContext(context);
       if (Config.get().isJeeSplitByDeployment()) {
         final IWebAppDispatcherContext dispatcherContext = request.getWebAppDispatcherContext();
         if (dispatcherContext != null) {
@@ -166,7 +166,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(spanFromContext(scope.context()), request);
+        DECORATE.getPath(fromContext(scope.context()), request);
         scope.close();
       }
     }
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 4a5c6187584..5c15a75fa46 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,6 +1,6 @@
 package datadog.trace.instrumentation.pekkohttp;
 
-import static datadog.trace.bootstrap.instrumentation.api.Java8BytecodeBridge.spanFromContext;
+import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext;
 import static datadog.trace.instrumentation.pekkohttp.PekkoHttpServerDecorator.DECORATE;
 
 import datadog.context.Context;
@@ -13,7 +13,7 @@ public class DatadogWrapperHelper {
   public static ContextScope createSpan(final HttpRequest request) {
     final Context parentContext = DECORATE.extract(request);
     final Context context = DECORATE.startSpan(request, parentContext);
-    final AgentSpan span = spanFromContext(context);
+    final AgentSpan span = fromContext(context);
     DECORATE.afterStart(span);
     DECORATE.onRequest(span, request, request, parentContext);
 

From f7b9cb0fb11f99c9938fe1cfe95aaec8c50a1136 Mon Sep 17 00:00:00 2001
From: Bruce Bujon 
Date: Tue, 12 Aug 2025 16:33:31 +0200
Subject: [PATCH 23/23] feat(bootstrap): Removing optimization

Unclear of the benefits compared to the existing optimization.
---
 .../trace/bootstrap/instrumentation/api/AgentSpan.java    | 8 --------
 1 file changed, 8 deletions(-)

diff --git a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java
index 45f0c7b91c4..19876207b81 100644
--- a/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java
+++ b/internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java
@@ -216,12 +216,4 @@ default  T get(@Nonnull ContextKey key) {
   default  Context with(@Nonnull ContextKey key, @Nullable T value) {
     return SPAN_KEY == key ? (Context) value : Context.root().with(SPAN_KEY, this, key, value);
   }
-
-  @Override
-  default Context with(@Nullable ImplicitContextKeyed value) {
-    if (value instanceof AgentSpan) {
-      return (AgentSpan) value;
-    }
-    return Context.super.with(value);
-  }
 }