From d61c3e050faae4f4671a2a95630495ae46e76910 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Fri, 29 May 2026 20:56:55 -0400 Subject: [PATCH] Fix W3C baggage not propagated on outgoing reactor-netty (WebClient) requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CaptureConnectSpan captured only the active span into the Reactor context at subscription time, discarding the full Datadog Context (which carries baggage). TransferConnectSpan then called captureSpan(span) on the Reactor I/O thread where no Datadog scope is active, so the resulting continuation held a context of just the span — no baggage. HttpClientRequestTracingHandler.injectContext(current(),…) therefore found no Baggage entry and skipped the baggage header. Fix: CaptureConnectSpan now also stores Context.current() (the full context including baggage) into the Reactor context alongside the span. TransferConnectSpan uses the new captureSpan(AgentSpan, Context) overload to build the continuation from that captured context, so baggage is carried across the async boundary and injected correctly. The new overload is wired through AgentTracer, TracerAPI, CoreTracer, and ContinuableScopeManager. Fixes: https://github.com/DataDog/dd-trace-java/issues/11510 Co-Authored-By: Claude Sonnet 4.6 --- .../reactor/netty/CaptureConnectSpan.java | 4 ++- .../reactor/netty/TransferConnectSpan.java | 10 ++++++- .../java/datadog/trace/core/CoreTracer.java | 6 +++++ .../scopemanager/ContinuableScopeManager.java | 7 +++++ .../instrumentation/api/AgentTracer.java | 26 +++++++++++++++++++ 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java index 351a37affd3..68cb2c55208 100644 --- a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java +++ b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/CaptureConnectSpan.java @@ -2,6 +2,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; +import datadog.context.Context; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import java.util.function.Function; import reactor.core.publisher.Mono; @@ -11,6 +12,7 @@ public class CaptureConnectSpan implements Function, Mono> { static final String CONNECT_SPAN = "datadog.connect.span"; + static final String CONNECT_CONTEXT = "datadog.connect.context"; @Override public Mono apply(Mono mono) { @@ -18,7 +20,7 @@ public Mono apply(Mono mono) { context -> { final AgentSpan span = activeSpan(); if (null != span) { - return context.put(CONNECT_SPAN, span); + return context.put(CONNECT_SPAN, span).put(CONNECT_CONTEXT, Context.current()); } else { return context; } diff --git a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java index 5d07e5c3c26..b0a4926e865 100644 --- a/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java +++ b/dd-java-agent/instrumentation/reactor-netty-1.0/src/main/java/datadog/trace/instrumentation/reactor/netty/TransferConnectSpan.java @@ -2,8 +2,10 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; import static datadog.trace.instrumentation.netty41.AttributeKeys.CONNECT_PARENT_CONTINUATION_ATTRIBUTE_KEY; +import static datadog.trace.instrumentation.reactor.netty.CaptureConnectSpan.CONNECT_CONTEXT; import static datadog.trace.instrumentation.reactor.netty.CaptureConnectSpan.CONNECT_SPAN; +import datadog.context.Context; import datadog.trace.bootstrap.instrumentation.api.AgentScope.Continuation; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import java.util.function.BiConsumer; @@ -14,7 +16,13 @@ public class TransferConnectSpan implements BiConsumer