From 2fa0d4e89814473e62732062d061db0382b6ba15 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Fri, 23 Oct 2026 15:33:05 -0400 Subject: [PATCH 1/3] Move rarely read span context fields onto the trace Every DDSpanContext held three tracer settings, read only at serialization or when a sampling decision fails validation, and the W3C baggage extracted for the local root. The settings are now read from the tracer and the baggage from the trace collector, taking DDSpanContext from 128 to 120 bytes. The trace collectors keep their size, and no field read on span creation, tagging or activation moves. Co-Authored-By: Claude Opus 5.5 --- .../java/datadog/trace/core/CoreTracer.java | 15 ++- .../datadog/trace/core/DDSpanContext.java | 94 +++---------------- .../datadog/trace/core/TraceCollector.java | 15 +++ 3 files changed, 41 insertions(+), 83 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 0f5d63c32cd..4bc10d31054 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 @@ -295,6 +295,18 @@ public void updatePreferredServiceName(String serviceName, CharSequence source) ServiceNameCollector.get().addService(serviceName); } + boolean isSamplingMechanismValidationDisabled() { + return disableSamplingMechanismValidation; + } + + boolean isInjectBaggageAsTags() { + return injectBaggageAsTags; + } + + boolean isInjectLinksAsTags() { + return injectLinksAsTags; + } + PropagationTags.Factory getPropagationTagsFactory() { return propagationTagsFactory; } @@ -2347,11 +2359,8 @@ protected static final DDSpanContext buildSpanContext( requestContextDataIast, ciVisibilityContextData, pathwayContext, - tracer.disableSamplingMechanismValidation, propagationTags, tracer.profilingContextIntegration, - tracer.injectBaggageAsTags, - tracer.injectLinksAsTags, mergedTracerTagsNeedsIntercept ? null : mergedTracerTags); // By setting the tags on the context we apply decorators to any tags that have been set via diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java index f154198f320..d780a00b9ce 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java @@ -90,8 +90,6 @@ public class DDSpanContext implements AgentSpanContext, ProfilerContext { /** Baggage is associated with the whole trace and shared with other spans */ private volatile Map baggageItems; - private final Baggage w3cBaggage; - // Not Shared with other span contexts private final DDTraceId traceId; private final long spanId; @@ -166,8 +164,6 @@ public class DDSpanContext implements AgentSpanContext, ProfilerContext { private volatile boolean topLevel; - private final boolean disableSamplingMechanismValidation; - /** * This span's own propagation tags, when they differ from the trace's. Only a non-root span that * is the target of a write (e.g. {@code _dd.p.ts}) gets one. Access via {@link @@ -183,8 +179,6 @@ public class DDSpanContext implements AgentSpanContext, ProfilerContext { private volatile PathwayContext pathwayContext; private final ProfilingContextIntegration profilingContextIntegration; - private final boolean injectBaggageAsTags; - private final boolean injectLinksAsTags; private volatile int encodedOperationName; private volatile int encodedResourceName; @@ -213,7 +207,6 @@ public DDSpanContext( final Object requestContextDataAppSec, final Object requestContextDataIast, final PathwayContext pathwayContext, - final boolean disableSamplingMechanismValidation, final PropagationTags propagationTags) { this( traceId, @@ -236,62 +229,8 @@ public DDSpanContext( requestContextDataIast, null, pathwayContext, - disableSamplingMechanismValidation, propagationTags, ProfilingContextIntegration.NoOp.INSTANCE, - true, - true, - null); - } - - public DDSpanContext( - final DDTraceId traceId, - final long spanId, - final long parentId, - final CharSequence parentServiceName, - final String serviceName, - final CharSequence operationName, - final CharSequence resourceName, - final int samplingPriority, - final CharSequence origin, - final Map baggageItems, - final boolean errorFlag, - final CharSequence spanType, - final int tagsSize, - final TraceCollector traceCollector, - final Object requestContextDataAppSec, - final Object requestContextDataIast, - final PathwayContext pathwayContext, - final boolean disableSamplingMechanismValidation, - final PropagationTags propagationTags, - final boolean injectBaggageAsTags, - final boolean injectLinksAsTags) { - this( - traceId, - spanId, - parentId, - parentServiceName, - null, - serviceName, - operationName, - resourceName, - samplingPriority, - origin, - baggageItems, - null, - errorFlag, - spanType, - tagsSize, - traceCollector, - requestContextDataAppSec, - requestContextDataIast, - null, - pathwayContext, - disableSamplingMechanismValidation, - propagationTags, - ProfilingContextIntegration.NoOp.INSTANCE, - injectBaggageAsTags, - injectLinksAsTags, null); } @@ -317,11 +256,8 @@ public DDSpanContext( final Object requestContextDataIast, final Object CiVisibilityContextData, final PathwayContext pathwayContext, - final boolean disableSamplingMechanismValidation, final PropagationTags propagationTags, - final ProfilingContextIntegration profilingContextIntegration, - final boolean injectBaggageAsTags, - final boolean injectLinksAsTags) { + final ProfilingContextIntegration profilingContextIntegration) { this( traceId, spanId, @@ -343,11 +279,8 @@ public DDSpanContext( requestContextDataIast, CiVisibilityContextData, pathwayContext, - disableSamplingMechanismValidation, propagationTags, profilingContextIntegration, - injectBaggageAsTags, - injectLinksAsTags, null); } @@ -372,11 +305,8 @@ public DDSpanContext( final Object requestContextDataIast, final Object CiVisibilityContextData, final PathwayContext pathwayContext, - final boolean disableSamplingMechanismValidation, final PropagationTags propagationTags, final ProfilingContextIntegration profilingContextIntegration, - final boolean injectBaggageAsTags, - final boolean injectLinksAsTags, final TagMap readThroughParent) { assert traceCollector != null; @@ -394,7 +324,9 @@ public DDSpanContext( } else { this.baggageItems = new ConcurrentHashMap<>(baggageItems); } - this.w3cBaggage = w3cBaggage; + if (w3cBaggage != null) { + traceCollector.initW3CBaggage(w3cBaggage); + } if (requestContextDataAppSec != null || requestContextDataIast != null @@ -433,7 +365,6 @@ public DDSpanContext( this.threadId = current.getId(); this.threadName = THREAD_NAMES.computeIfAbsent(current.getName(), Functions.UTF8_ENCODE); - this.disableSamplingMechanismValidation = disableSamplingMechanismValidation; if (propagationTags != null) { propagationTags.updateTraceIdHighOrderBits(this.traceId.toHighOrderLong()); if (traceCollector.initPropagationTags(propagationTags) != propagationTags) { @@ -441,8 +372,6 @@ public DDSpanContext( this.propagationTags = propagationTags; } } - this.injectBaggageAsTags = injectBaggageAsTags; - this.injectLinksAsTags = injectLinksAsTags; if (origin != null) { setOrigin(origin); } @@ -808,7 +737,7 @@ private boolean validateSamplingPriority(final int newPriority, final int newMec return false; } if (!SamplingMechanism.validateWithSamplingPriority(newMechanism, newPriority)) { - if (disableSamplingMechanismValidation) { + if (traceCollector.getTracer().isSamplingMechanismValidationDisabled()) { log.debug( "{}: Bypassing setting setSamplingPriority check (" + TracerConfig.SAMPLING_MECHANISM_VALIDATION_DISABLED @@ -1541,7 +1470,8 @@ void earlyProcessTags(AppendableSpanLinks links) { */ void processTagsAndBaggage( final MetadataConsumer consumer, int longRunningVersion, DDSpan restrictedSpan, int options) { - boolean injectLinksAsTags = this.injectLinksAsTags && (options & STRUCTURED_LINKS) == 0; + boolean injectLinksAsTags = + traceCollector.getTracer().isInjectLinksAsTags() && (options & STRUCTURED_LINKS) == 0; boolean injectEventsAsTags = (options & STRUCTURED_EVENTS) == 0; PropagationTags serializedPropagationTags; if ((options & ROOT_PROPAGATION_TAGS) != 0) { @@ -1581,10 +1511,13 @@ void processTagsAndBaggage( // Baggage Map baggageItemsWithPropagationTags; - if (this.injectBaggageAsTags) { + if (traceCollector.getTracer().isInjectBaggageAsTags()) { baggageItemsWithPropagationTags = new HashMap<>(baggageItems); + // W3C baggage is only extracted onto the local root + Baggage w3cBaggage = + getRootSpanContextIfDifferent() == null ? traceCollector.getW3CBaggage() : null; if (w3cBaggage != null) { - injectW3CBaggageTags(baggageItemsWithPropagationTags); + injectW3CBaggageTags(baggageItemsWithPropagationTags, w3cBaggage); } if (serializedPropagationTags != null) { serializedPropagationTags.fillTagMap(baggageItemsWithPropagationTags); @@ -1709,7 +1642,8 @@ private static void appendJsonString(StringBuilder builder, String value) { builder.append('"'); } - void injectW3CBaggageTags(Map baggageItemsWithPropagationTags) { + void injectW3CBaggageTags( + Map baggageItemsWithPropagationTags, Baggage w3cBaggage) { List baggageTagKeys = Config.get().getTraceBaggageTagKeys(); if (baggageTagKeys.isEmpty()) { return; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/TraceCollector.java b/dd-trace-core/src/main/java/datadog/trace/core/TraceCollector.java index 87ca4b9a956..5a7be8cd12d 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/TraceCollector.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/TraceCollector.java @@ -10,6 +10,7 @@ import datadog.trace.api.sampling.PrioritySampling; import datadog.trace.api.time.TimeSource; import datadog.trace.bootstrap.instrumentation.api.AgentTraceCollector; +import datadog.trace.bootstrap.instrumentation.api.Baggage; import datadog.trace.bootstrap.instrumentation.api.ClientIpAddressData; import datadog.trace.common.sampling.PrioritySampler; import datadog.trace.core.propagation.PropagationTags; @@ -73,6 +74,9 @@ enum PublishState { /** The origin of the trace. (eg. Synthetics, CI App) */ private volatile CharSequence origin; + /** The W3C baggage extracted with the trace, held for the local root's serialization. */ + private volatile Baggage w3cBaggage; + private volatile BlockResponseFunction blockResponseFunction; private volatile ClientIpAddressData clientIpAddressData; @@ -162,6 +166,17 @@ PropagationTags initPropagationTags(PropagationTags propagationTags) { : this.propagationTags; } + /** Sets the extracted W3C baggage unless already set. */ + void initW3CBaggage(Baggage w3cBaggage) { + if (this.w3cBaggage == null) { + this.w3cBaggage = w3cBaggage; + } + } + + Baggage getW3CBaggage() { + return w3cBaggage; + } + CharSequence getOrigin() { return origin; } From a0a657c14a6d407a837569d62397f71232ebcbfd Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Fri, 23 Oct 2026 15:33:08 -0400 Subject: [PATCH 2/3] Update span context construction for trace-level settings Co-Authored-By: Claude Opus 5.5 --- .../src/test/groovy/TypeConverterTest.groovy | 1 - .../src/test/groovy/TypeConverterTest.groovy | 1 - .../src/test/groovy/TypeConverterTest.groovy | 1 - .../writer/ddagent/TraceMapperBenchmark.java | 1 - .../datadog/trace/core/PendingTraceWrite.java | 2 - .../datadog/trace/core/TracerMapperMap.java | 1 - .../core/propagation/InjectorBenchmark.java | 1 - .../writer/PayloadDispatcherImplTest.java | 1 - .../trace/core/DDCoreJavaSpecification.java | 5 +-- .../trace/core/DDSpanSerializationTest.java | 41 ++++++------------- .../java/datadog/trace/core/DDSpanTest.java | 1 - .../core/LongRunningTracesTrackerTest.java | 1 - .../trace/core/PendingTraceBufferTest.java | 2 - .../datadog/trace/core/PendingTraceTest.java | 1 - .../propagation/AbstractHttpInjectorTest.java | 1 - 15 files changed, 13 insertions(+), 48 deletions(-) diff --git a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy index 60c0f43d9be..190364bea57 100644 --- a/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy +++ b/dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/TypeConverterTest.groovy @@ -58,7 +58,6 @@ class TypeConverterTest extends InstrumentationSpecification { null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()) { @Override void setServiceName(final String serviceName) { // override this method that is called from the DDSpanContext constructor diff --git a/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/test/groovy/TypeConverterTest.groovy b/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/test/groovy/TypeConverterTest.groovy index 3a3b5c6efca..e1e3bc1e05f 100644 --- a/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/test/groovy/TypeConverterTest.groovy +++ b/dd-java-agent/instrumentation/opentracing/opentracing-0.31/src/test/groovy/TypeConverterTest.groovy @@ -70,7 +70,6 @@ class TypeConverterTest extends InstrumentationSpecification { null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()) { @Override void setServiceName(final String serviceName) { // override this method that is called from the DDSpanContext constructor diff --git a/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/test/groovy/TypeConverterTest.groovy b/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/test/groovy/TypeConverterTest.groovy index 9ecfd5221ef..2f9c9d3d19a 100644 --- a/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/test/groovy/TypeConverterTest.groovy +++ b/dd-java-agent/instrumentation/opentracing/opentracing-0.32/src/test/groovy/TypeConverterTest.groovy @@ -70,7 +70,6 @@ class TypeConverterTest extends InstrumentationSpecification { null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()) { @Override void setServiceName(final String serviceName) { // override this method that is called from the DDSpanContext constructor diff --git a/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java index 54192804b05..b974ac36f7d 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/common/writer/ddagent/TraceMapperBenchmark.java @@ -121,7 +121,6 @@ public void init(Blackhole blackhole) { null, null, NoopPathwayContext.INSTANCE, - false, propagationTags); DDSpanHelper.setAllTags(rootContext, tags); DDSpan root = DDSpanHelper.create("benchmark", System.currentTimeMillis() * 1000, rootContext); diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java b/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java index b0a90c7bffb..977bfff8fe6 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/PendingTraceWrite.java @@ -60,7 +60,6 @@ public void init(TraceCounters counters, Blackhole blackhole) { null, null, NoopPathwayContext.INSTANCE, - false, null), null); span = @@ -85,7 +84,6 @@ public void init(TraceCounters counters, Blackhole blackhole) { null, null, NoopPathwayContext.INSTANCE, - false, null), null); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/TracerMapperMap.java b/dd-trace-core/src/jmh/java/datadog/trace/core/TracerMapperMap.java index 4075274cca2..0d513d52b97 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/TracerMapperMap.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/TracerMapperMap.java @@ -140,7 +140,6 @@ private DDSpan createSpanWithOrigin(int iter, final String origin) { null, null, NoopPathwayContext.INSTANCE, - false, null), null); } diff --git a/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java b/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java index 1c070167377..1cf5f227858 100644 --- a/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java +++ b/dd-trace-core/src/jmh/java/datadog/trace/core/propagation/InjectorBenchmark.java @@ -127,7 +127,6 @@ public void setUp(Blackhole blackhole) { null, null, null, - false, propagationTags); } diff --git a/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java b/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java index 574cea13611..8940a258329 100644 --- a/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/common/writer/PayloadDispatcherImplTest.java @@ -234,7 +234,6 @@ DDSpan realSpan() throws Exception { null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()); Constructor ctor = DDSpan.class.getDeclaredConstructor( diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java b/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java index d5fead39ea7..9ef3ec549a1 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDCoreJavaSpecification.java @@ -121,11 +121,8 @@ protected DDSpan buildSpan( null, ciVisibilityContextData, NoopPathwayContext.INSTANCE, - false, propagationTags, - ProfilingContextIntegration.NoOp.INSTANCE, - true, - true); + ProfilingContextIntegration.NoOp.INSTANCE); DDSpan span = DDSpan.create("test", timestamp, context, null); for (Map.Entry entry : tags.entrySet()) { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java index b8ca25a6cc5..3ad2a974d82 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanSerializationTest.java @@ -202,7 +202,7 @@ void serializeTraceWithBaggageAndTagsCorrectlyV04( boolean injectBaggage) throws Exception { ListWriter writer = new ListWriter(); - CoreTracer tracer = tracerBuilder().writer(writer).build(); + CoreTracer tracer = tracerBuilder().writer(writer).injectBaggageAsTags(injectBaggage).build(); DDSpanContext context = new DDSpanContext( DDTraceId.ONE, @@ -222,10 +222,7 @@ void serializeTraceWithBaggageAndTagsCorrectlyV04( null, null, NoopPathwayContext.INSTANCE, - false, - null, - injectBaggage, - true); + null); context.setAllTags(tags); DDSpan span = DDSpan.create("test", 0, context, null); CaptureBuffer capture = new CaptureBuffer(); @@ -279,7 +276,7 @@ void serializeTraceWithBaggageAndTagsCorrectlyV05( boolean injectBaggage) throws Exception { ListWriter writer = new ListWriter(); - CoreTracer tracer = tracerBuilder().writer(writer).build(); + CoreTracer tracer = tracerBuilder().writer(writer).injectBaggageAsTags(injectBaggage).build(); DDSpanContext context = new DDSpanContext( DDTraceId.ONE, @@ -299,10 +296,7 @@ void serializeTraceWithBaggageAndTagsCorrectlyV05( null, null, NoopPathwayContext.INSTANCE, - false, - null, - injectBaggage, - true); + null); context.setAllTags(tags); DDSpan span = DDSpan.create("test", 0, context, null); CaptureBuffer capture = new CaptureBuffer(); @@ -343,7 +337,8 @@ void serializeTraceWithBaggageAndTagsCorrectlyV05( @WithConfig(key = TRACE_BAGGAGE_TAG_KEYS, value = "user.id,custom") void serializeTraceWithConfiguredBaggageAndTagsCorrectlyV1(String scenario, boolean injectBaggage) throws Exception { - CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); + CoreTracer tracer = + tracerBuilder().writer(new ListWriter()).injectBaggageAsTags(injectBaggage).build(); Map baggage = new HashMap<>(); baggage.put("legacy-baggage", "legacy-value"); @@ -352,8 +347,7 @@ void serializeTraceWithConfiguredBaggageAndTagsCorrectlyV1(String scenario, bool w3cBaggageItems.put("custom", "custom-value"); w3cBaggageItems.put("ignored", "ignored-value"); - DDSpanContext context = - createSpanContext(tracer, baggage, Baggage.create(w3cBaggageItems), injectBaggage, true, 1); + DDSpanContext context = createSpanContext(tracer, baggage, Baggage.create(w3cBaggageItems), 1); context.setTag("span-tag", "span-value"); DDSpan span = DDSpan.create("test", 0, context, null); @@ -377,7 +371,7 @@ void serializeTraceWithConfiguredBaggageAndTagsCorrectlyV1(String scenario, bool @Test void serializeTraceWithSpanLinksAsStructuredLinksOnlyV1() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpanContext context = createSpanContext(tracer, Collections.emptyMap(), null, true, true, 0); + DDSpanContext context = createSpanContext(tracer, Collections.emptyMap(), null, 0); DDSpan span = DDSpan.create("test", 0, context, null); Map linkAttributes = new HashMap<>(); @@ -407,7 +401,7 @@ void serializeTraceWithSpanLinksAsStructuredLinksOnlyV1() throws Exception { @Test void serializeTraceWithSpanEventsAsStructuredEventsOnlyV1() throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpanContext context = createSpanContext(tracer, Collections.emptyMap(), null, true, true, 1); + DDSpanContext context = createSpanContext(tracer, Collections.emptyMap(), null, 1); DDSpan span = DDSpan.create("test", 0, context, null); span.addEvent("event.one", typedAttributes(), 1234567890L, NANOSECONDS); span.addEvent("event.two", Collections.emptyMap(), 1234567891L, NANOSECONDS); @@ -439,7 +433,7 @@ void serializeTraceWithSpanEventsAsStructuredEventsOnlyV1() throws Exception { }) void serializeTraceWithSpanEventsAsEventsTag(String protocol) throws Exception { CoreTracer tracer = tracerBuilder().writer(new ListWriter()).build(); - DDSpanContext context = createSpanContext(tracer, Collections.emptyMap(), null, true, true, 1); + DDSpanContext context = createSpanContext(tracer, Collections.emptyMap(), null, 1); DDSpan span = DDSpan.create("test", 0, context, null); span.addEvent("event.one", typedAttributes(), 1234567890L, NANOSECONDS); span.addEvent("event \"two\"", Collections.emptyMap(), 1234567891L, NANOSECONDS); @@ -541,7 +535,6 @@ void serializeTraceWithFlatMapTagV04() throws Exception { null, null, NoopPathwayContext.INSTANCE, - false, null); context.setTag("key1", "value1"); Map nested = new HashMap<>(); @@ -608,7 +601,6 @@ void serializeTraceWithFlatMapTagV05() throws Exception { null, null, NoopPathwayContext.INSTANCE, - false, null); context.setTag("key1", "value1"); Map nested = new HashMap<>(); @@ -752,7 +744,6 @@ private DDSpanContext createSpanContext( null, null, NoopPathwayContext.INSTANCE, - false, null); Map tags = new HashMap<>(); tags.put("k1", "v1"); @@ -761,12 +752,7 @@ private DDSpanContext createSpanContext( } private DDSpanContext createSpanContext( - CoreTracer tracer, - Map baggage, - Baggage w3cBaggage, - boolean injectBaggage, - boolean injectLinks, - int tagsSize) { + CoreTracer tracer, Map baggage, Baggage w3cBaggage, int tagsSize) { return new DDSpanContext( DDTraceId.ONE, 1, @@ -788,11 +774,8 @@ private DDSpanContext createSpanContext( null, null, NoopPathwayContext.INSTANCE, - false, null, - ProfilingContextIntegration.NoOp.INSTANCE, - injectBaggage, - injectLinks); + ProfilingContextIntegration.NoOp.INSTANCE); } private static byte[] serializeV1Payload(DDSpan span) throws Exception { diff --git a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java index c82eb0d07d2..acf42ad0c46 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/DDSpanTest.java @@ -422,7 +422,6 @@ void inferTopLevelFromParentServiceName( null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()); assertEquals(expectTopLevel, context.isTopLevel()); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java b/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java index 27c8156e27f..0acf93a7a81 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/LongRunningTracesTrackerTest.java @@ -233,7 +233,6 @@ private static DDSpan newSpanOf(PendingTrace trace, int samplingPriority, long t null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()); return DDSpan.create("test", timestampMicro, context, null); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java index e72e5fa3a7c..2510c86cb7d 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceBufferTest.java @@ -535,7 +535,6 @@ private static DDSpan newSpanOf(PendingTrace trace, int samplingPriority, long t null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()); return DDSpan.create("test", timestampMicro, context, null); } @@ -561,7 +560,6 @@ private static DDSpan newSpanOf(DDSpan parent) { null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()); return DDSpan.create("test", 0, context, null); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java index 7d47a0b17c5..f9f1169b20b 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/PendingTraceTest.java @@ -70,7 +70,6 @@ private DDSpan createSimpleSpanWithID(PendingTrace trace, long id) { null, null, NoopPathwayContext.INSTANCE, - false, PropagationTags.factory().empty()), null); } diff --git a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpInjectorTest.java b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpInjectorTest.java index 3098ab217ec..d608842b4a0 100644 --- a/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpInjectorTest.java +++ b/dd-trace-core/src/test/java/datadog/trace/core/propagation/AbstractHttpInjectorTest.java @@ -56,7 +56,6 @@ protected DDSpanContext mockSpanContext( null, null, NoopPathwayContext.INSTANCE, - false, propagationTags); } } From 55176e3f5fe1989cc264a3436ac3ff4f3e367d44 Mon Sep 17 00:00:00 2001 From: Douglas Q Hawkins Date: Fri, 23 Oct 2026 16:17:33 -0400 Subject: [PATCH 3/3] Use the local root span check for W3C baggage Co-Authored-By: Claude Opus 5.5 --- .../src/main/java/datadog/trace/core/DDSpanContext.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java index d780a00b9ce..f01d250f8bc 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpanContext.java @@ -1514,8 +1514,7 @@ void processTagsAndBaggage( if (traceCollector.getTracer().isInjectBaggageAsTags()) { baggageItemsWithPropagationTags = new HashMap<>(baggageItems); // W3C baggage is only extracted onto the local root - Baggage w3cBaggage = - getRootSpanContextIfDifferent() == null ? traceCollector.getW3CBaggage() : null; + Baggage w3cBaggage = isLocalRoot() ? traceCollector.getW3CBaggage() : null; if (w3cBaggage != null) { injectW3CBaggageTags(baggageItemsWithPropagationTags, w3cBaggage); }