From 5f969ec1e6ea75101f51d6120cfab1206a247e67 Mon Sep 17 00:00:00 2001 From: Lucas Pimentel Date: Wed, 15 Jan 2025 20:55:11 -0500 Subject: [PATCH 1/2] temp --- .../core/baggage/W3CBaggageExtractor.java | 22 +++++++++++++++++++ .../core/baggage/W3CBaggageInjector.java | 21 ++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageExtractor.java create mode 100644 dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageExtractor.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageExtractor.java new file mode 100644 index 00000000000..2623d26aeb2 --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageExtractor.java @@ -0,0 +1,22 @@ +package datadog.trace.core.baggage; + +import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; +import datadog.trace.bootstrap.instrumentation.api.TagContext; +import datadog.trace.core.propagation.HttpCodec; +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 + return this.delegate.extract(carrier, getter); + } +} diff --git a/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java new file mode 100644 index 00000000000..036a490080e --- /dev/null +++ b/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java @@ -0,0 +1,21 @@ +package datadog.trace.core.baggage; + +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) { + Iterable> baggageItems = span.context().baggageItems(); + // get span.context().baggageItems() and build the baggage header value like "key1=value1,key2=value2" + + String headerValue = "TODO"; + setter.set(carrier, "baggage", headerValue); + } +} + From 029c5040a6ce06fe33d05582a9b3843bfa0175b2 Mon Sep 17 00:00:00 2001 From: Lucas Pimentel Date: Thu, 16 Jan 2025 14:55:11 -0500 Subject: [PATCH 2/2] wip --- .../java/datadog/trace/core/CoreTracer.java | 10 ++++-- .../core/baggage/W3CBaggageInjector.java | 21 ------------- .../core/propagation/CorePropagation.java | 5 ++- .../W3CBaggageExtractor.java | 9 ++++-- .../core/propagation/W3CBaggageInjector.java | 31 +++++++++++++++++++ 5 files changed, 48 insertions(+), 28 deletions(-) delete mode 100644 dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java rename dd-trace-core/src/main/java/datadog/trace/core/{baggage => propagation}/W3CBaggageExtractor.java (77%) create mode 100644 dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageInjector.java 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/baggage/W3CBaggageInjector.java b/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java deleted file mode 100644 index 036a490080e..00000000000 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageInjector.java +++ /dev/null @@ -1,21 +0,0 @@ -package datadog.trace.core.baggage; - -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) { - Iterable> baggageItems = span.context().baggageItems(); - // get span.context().baggageItems() and build the baggage header value like "key1=value1,key2=value2" - - String headerValue = "TODO"; - setter.set(carrier, "baggage", headerValue); - } -} - 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/baggage/W3CBaggageExtractor.java b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageExtractor.java similarity index 77% rename from dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageExtractor.java rename to dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageExtractor.java index 2623d26aeb2..1dc0d2da2b1 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/baggage/W3CBaggageExtractor.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/propagation/W3CBaggageExtractor.java @@ -1,8 +1,7 @@ -package datadog.trace.core.baggage; +package datadog.trace.core.propagation; import datadog.trace.bootstrap.instrumentation.api.AgentPropagation; import datadog.trace.bootstrap.instrumentation.api.TagContext; -import datadog.trace.core.propagation.HttpCodec; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -17,6 +16,10 @@ public W3CBaggageExtractor(HttpCodec.Extractor delegate) { @Override public TagContext extract(C carrier, AgentPropagation.ContextVisitor getter) { // delegate to the default HTTP extraction - return this.delegate.extract(carrier, getter); + 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()); + } +} +