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 29208628624..331d5f519e9 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 @@ -74,6 +74,8 @@ import datadog.trace.common.writer.WriterFactory; import datadog.trace.common.writer.ddintake.DDIntakeTraceInterceptor; import datadog.trace.context.TraceScope; +import datadog.trace.core.propagation.W3CBaggageExtractor; +import datadog.trace.core.propagation.W3CBaggageInjector; import datadog.trace.core.datastreams.DataStreamContextInjector; import datadog.trace.core.datastreams.DataStreamsMonitoring; import datadog.trace.core.datastreams.DefaultDataStreamsMonitoring; @@ -707,17 +709,19 @@ private CoreTracer( sharedCommunicationObjects.whenReady(this.dataStreamsMonitoring::start); - // Create default extractor from config if not provided and decorate it with DSM extractor + // Create default extractor from config if not provided and decorate it with DSM and baggage extractors HttpCodec.Extractor builtExtractor = extractor == null ? HttpCodec.createExtractor(config, this::captureTraceConfig) : extractor; builtExtractor = this.dataStreamsMonitoring.extractor(builtExtractor); - // Create all HTTP injectors plus the DSM one + builtExtractor = new W3CBaggageExtractor(builtExtractor); + // Create all HTTP injectors plus the DSM and baggage injectors Map injectors = HttpCodec.allInjectorsFor(config, invertMap(baggageMapping)); DataStreamContextInjector dataStreamContextInjector = this.dataStreamsMonitoring.injector(); + W3CBaggageInjector baggageInjector = new W3CBaggageInjector(); // Store all propagators to propagation this.propagation = - new CorePropagation(builtExtractor, injector, injectors, dataStreamContextInjector); + new CorePropagation(builtExtractor, injector, injectors, dataStreamContextInjector, baggageInjector); this.tagInterceptor = null == tagInterceptor ? new TagInterceptor(new RuleFlags(config)) : tagInterceptor; diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/CorePropagation.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/CorePropagation.java index 75c3abb949c..c8343220f8c 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/propagation/CorePropagation.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/CorePropagation.java @@ -14,6 +14,7 @@ public class CorePropagation implements AgentPropagation { private final HttpCodec.Injector injector; private final Map injectors; private final DataStreamContextInjector dataStreamContextInjector; + private final W3CBaggageInjector baggageInjector; private final HttpCodec.Extractor extractor; /** @@ -29,11 +30,13 @@ public CorePropagation( HttpCodec.Extractor extractor, HttpCodec.Injector defaultInjector, Map injectors, - DataStreamContextInjector dataStreamContextInjector) { + DataStreamContextInjector dataStreamContextInjector, + W3CBaggageInjector baggageInjector) { this.extractor = extractor; this.injector = defaultInjector; this.injectors = injectors; this.dataStreamContextInjector = dataStreamContextInjector; + this.baggageInjector = baggageInjector; } @Override diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageExtractor.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageExtractor.java new file mode 100644 index 00000000000..1dc0d2da2b1 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageExtractor.java @@ -0,0 +1,25 @@ +package datadog.trace.core.propagation; + +import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; +import datadog.trace.bootstrap.instrumentation.api.TagContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class W3CBaggageExtractor implements HttpCodec.Extractor { + private static final Logger LOGGER = LoggerFactory.getLogger(W3CBaggageExtractor.class); + private final HttpCodec.Extractor delegate; + + public W3CBaggageExtractor(HttpCodec.Extractor delegate) { + this.delegate = delegate; + } + + @Override + public TagContext extract(C carrier, AgentPropagation.ContextVisitor getter) { + // delegate to the default HTTP extraction + TagContext context = this.delegate.extract(carrier, getter); + + // TODO: extract baggage from carrier and add it to context + + return context; + } +} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageInjector.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageInjector.java new file mode 100644 index 00000000000..5af9a6b290f --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageInjector.java @@ -0,0 +1,31 @@ +package datadog.trace.core.propagation; + +import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; + +public class W3CBaggageInjector { + private static final Logger LOGGER = LoggerFactory.getLogger(W3CBaggageInjector.class); + + public void inject(AgentSpan span, C carrier, AgentPropagation.Setter setter) { + StringBuilder builder = new StringBuilder(); + + for (final Map.Entry baggageItem : span.context().baggageItems()) { + // quick and dirty implementation for now + if (builder.length() > 0) { + builder.append(","); + } + + // TODO: encode baggageItem.getValue() to be W3C compliant + builder.append(baggageItem.getKey()) + .append('=') + .append(HttpCodec.encodeBaggage(baggageItem.getValue())); + } + + setter.set(carrier, "baggage", builder.toString()); + } +} +