From 5facbfde7f9df4dcbfac80b2be9ec7b2c57289fa Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 25 Jun 2025 16:19:10 -0400 Subject: [PATCH 1/4] Fixing issues with dropping baggage when TracePropagationBehaviorExtract = IGNORE --- .../trace/core/baggage/BaggagePropagator.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java index 808264222ca..58abe6f88b5 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java @@ -1,5 +1,6 @@ package datadog.trace.core.baggage; +import static datadog.trace.api.TracePropagationBehaviorExtract.IGNORE; import static java.util.Collections.emptyMap; import datadog.context.Context; @@ -7,6 +8,7 @@ import datadog.context.propagation.CarrierVisitor; import datadog.context.propagation.Propagator; import datadog.trace.api.Config; +import datadog.trace.api.TracePropagationBehaviorExtract; import datadog.trace.bootstrap.instrumentation.api.Baggage; import datadog.trace.core.util.PercentEscaper; import datadog.trace.core.util.PercentEscaper.Escaped; @@ -28,21 +30,29 @@ public class BaggagePropagator implements Propagator { private final boolean extractBaggage; private final int maxItems; private final int maxBytes; + private final TracePropagationBehaviorExtract behaviorExtract; public BaggagePropagator(Config config) { this( config.isBaggageInject(), config.isBaggageInject(), config.getTraceBaggageMaxItems(), - config.getTraceBaggageMaxBytes()); + config.getTraceBaggageMaxBytes(), + config.getTracePropagationBehaviorExtract()); } // use primarily for testing purposes - BaggagePropagator(boolean injectBaggage, boolean extractBaggage, int maxItems, int maxBytes) { + BaggagePropagator( + boolean injectBaggage, + boolean extractBaggage, + int maxItems, + int maxBytes, + TracePropagationBehaviorExtract behaviorExtract) { this.injectBaggage = injectBaggage; this.extractBaggage = extractBaggage; this.maxItems = maxItems; this.maxBytes = maxBytes; + this.behaviorExtract = behaviorExtract; } @Override @@ -104,7 +114,11 @@ public void inject(Context context, C carrier, CarrierSetter setter) { @Override public Context extract(Context context, C carrier, CarrierVisitor visitor) { - if (!this.extractBaggage || context == null || carrier == null || visitor == null) { + if (!this.extractBaggage + || this.behaviorExtract == IGNORE + || context == null + || carrier == null + || visitor == null) { return context; } BaggageExtractor baggageExtractor = new BaggageExtractor(); From 917c6c028014ba01a6c7f28c2d2537f7d7bc9523 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Wed, 25 Jun 2025 17:00:38 -0400 Subject: [PATCH 2/4] updating calls to BaggagePropagator from unit tests --- .../trace/core/baggage/BaggagePropagatorTest.groovy | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy index 288eec8d15a..098abf50670 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy @@ -11,6 +11,7 @@ import java.util.function.BiConsumer import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_BYTES import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_ITEMS +import static datadog.trace.api.TracePropagationBehaviorExtract.CONTINUE import static datadog.trace.core.baggage.BaggagePropagator.BAGGAGE_KEY class BaggagePropagatorTest extends DDSpecification { @@ -35,7 +36,7 @@ class BaggagePropagatorTest extends DDSpecification { } def setup() { - this.propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, DEFAULT_TRACE_BAGGAGE_MAX_BYTES) + this.propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, DEFAULT_TRACE_BAGGAGE_MAX_BYTES, CONTINUE) this.setter = new MapCarrierAccessor() this.carrier = [:] this.context = Context.root() @@ -65,7 +66,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage inject item limit"() { setup: - propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES, CONTINUE) //creating a new instance after injecting config context = Baggage.create(baggage).storeInto(context) when: @@ -82,7 +83,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage inject bytes limit"() { setup: - propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20, CONTINUE) //creating a new instance after injecting config context = Baggage.create(baggage).storeInto(context) when: @@ -184,7 +185,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage cache items limit"(){ setup: - propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES, CONTINUE) //creating a new instance after injecting config def headers = [ (BAGGAGE_KEY) : baggageHeader, ] @@ -205,7 +206,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage cache bytes limit"(){ setup: - propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20, CONTINUE) //creating a new instance after injecting config def headers = [ (BAGGAGE_KEY) : baggageHeader, ] From 0be2fc173d8ee2732bd1c76f6564b07b301a46c0 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 26 Jun 2025 09:54:53 -0400 Subject: [PATCH 3/4] fixing call to base constructor --- .../main/java/datadog/trace/core/baggage/BaggagePropagator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java index 58abe6f88b5..32d2b96347d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java @@ -35,7 +35,7 @@ public class BaggagePropagator implements Propagator { public BaggagePropagator(Config config) { this( config.isBaggageInject(), - config.isBaggageInject(), + config.isBaggageExtract(), config.getTraceBaggageMaxItems(), config.getTraceBaggageMaxBytes(), config.getTracePropagationBehaviorExtract()); From a26badd44a8bcde3aa0465dfa5bc8bf2a8d12820 Mon Sep 17 00:00:00 2001 From: Matthew Li Date: Thu, 26 Jun 2025 11:29:38 -0400 Subject: [PATCH 4/4] updating to handle behaviorExtract=IGNORE in CoreTracer rather than BaggagePropagator --- .../java/datadog/trace/core/CoreTracer.java | 5 +++-- .../trace/core/baggage/BaggagePropagator.java | 20 +++---------------- .../core/baggage/BaggagePropagatorTest.groovy | 11 +++++----- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 1e44edd3f89..66bfdeacc2e 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -4,7 +4,7 @@ import static datadog.trace.api.DDTags.DJM_ENABLED; import static datadog.trace.api.DDTags.DSM_ENABLED; import static datadog.trace.api.DDTags.PROFILING_CONTEXT_ENGINE; -import static datadog.trace.api.TracePropagationBehaviorExtract.RESTART; +import static datadog.trace.api.TracePropagationBehaviorExtract.IGNORE; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.BAGGAGE_CONCERN; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.DSM_CONCERN; import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.TRACING_CONCERN; @@ -716,7 +716,8 @@ private CoreTracer( if (config.isDataStreamsEnabled()) { Propagators.register(DSM_CONCERN, this.dataStreamsMonitoring.propagator()); } - if (config.isBaggagePropagationEnabled()) { + if (config.isBaggagePropagationEnabled() + && config.getTracePropagationBehaviorExtract() != IGNORE) { Propagators.register(BAGGAGE_CONCERN, new BaggagePropagator(config)); } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java index 32d2b96347d..3f3d00c373f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/BaggagePropagator.java @@ -1,6 +1,5 @@ package datadog.trace.core.baggage; -import static datadog.trace.api.TracePropagationBehaviorExtract.IGNORE; import static java.util.Collections.emptyMap; import datadog.context.Context; @@ -8,7 +7,6 @@ import datadog.context.propagation.CarrierVisitor; import datadog.context.propagation.Propagator; import datadog.trace.api.Config; -import datadog.trace.api.TracePropagationBehaviorExtract; import datadog.trace.bootstrap.instrumentation.api.Baggage; import datadog.trace.core.util.PercentEscaper; import datadog.trace.core.util.PercentEscaper.Escaped; @@ -30,29 +28,21 @@ public class BaggagePropagator implements Propagator { private final boolean extractBaggage; private final int maxItems; private final int maxBytes; - private final TracePropagationBehaviorExtract behaviorExtract; public BaggagePropagator(Config config) { this( config.isBaggageInject(), config.isBaggageExtract(), config.getTraceBaggageMaxItems(), - config.getTraceBaggageMaxBytes(), - config.getTracePropagationBehaviorExtract()); + config.getTraceBaggageMaxBytes()); } // use primarily for testing purposes - BaggagePropagator( - boolean injectBaggage, - boolean extractBaggage, - int maxItems, - int maxBytes, - TracePropagationBehaviorExtract behaviorExtract) { + BaggagePropagator(boolean injectBaggage, boolean extractBaggage, int maxItems, int maxBytes) { this.injectBaggage = injectBaggage; this.extractBaggage = extractBaggage; this.maxItems = maxItems; this.maxBytes = maxBytes; - this.behaviorExtract = behaviorExtract; } @Override @@ -114,11 +104,7 @@ public void inject(Context context, C carrier, CarrierSetter setter) { @Override public Context extract(Context context, C carrier, CarrierVisitor visitor) { - if (!this.extractBaggage - || this.behaviorExtract == IGNORE - || context == null - || carrier == null - || visitor == null) { + if (!this.extractBaggage || context == null || carrier == null || visitor == null) { return context; } BaggageExtractor baggageExtractor = new BaggageExtractor(); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy index 098abf50670..288eec8d15a 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/baggage/BaggagePropagatorTest.groovy @@ -11,7 +11,6 @@ import java.util.function.BiConsumer import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_BYTES import static datadog.trace.api.ConfigDefaults.DEFAULT_TRACE_BAGGAGE_MAX_ITEMS -import static datadog.trace.api.TracePropagationBehaviorExtract.CONTINUE import static datadog.trace.core.baggage.BaggagePropagator.BAGGAGE_KEY class BaggagePropagatorTest extends DDSpecification { @@ -36,7 +35,7 @@ class BaggagePropagatorTest extends DDSpecification { } def setup() { - this.propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, DEFAULT_TRACE_BAGGAGE_MAX_BYTES, CONTINUE) + this.propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, DEFAULT_TRACE_BAGGAGE_MAX_BYTES) this.setter = new MapCarrierAccessor() this.carrier = [:] this.context = Context.root() @@ -66,7 +65,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage inject item limit"() { setup: - propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES, CONTINUE) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES) //creating a new instance after injecting config context = Baggage.create(baggage).storeInto(context) when: @@ -83,7 +82,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage inject bytes limit"() { setup: - propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20, CONTINUE) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20) //creating a new instance after injecting config context = Baggage.create(baggage).storeInto(context) when: @@ -185,7 +184,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage cache items limit"(){ setup: - propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES, CONTINUE) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, 2, DEFAULT_TRACE_BAGGAGE_MAX_BYTES) //creating a new instance after injecting config def headers = [ (BAGGAGE_KEY) : baggageHeader, ] @@ -206,7 +205,7 @@ class BaggagePropagatorTest extends DDSpecification { def "test baggage cache bytes limit"(){ setup: - propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20, CONTINUE) //creating a new instance after injecting config + propagator = new BaggagePropagator(true, true, DEFAULT_TRACE_BAGGAGE_MAX_ITEMS, 20) //creating a new instance after injecting config def headers = [ (BAGGAGE_KEY) : baggageHeader, ]