Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<TracePropagationStyle, HttpCodec.Injector> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ public class CorePropagation implements AgentPropagation {
private final HttpCodec.Injector injector;
private final Map<TracePropagationStyle, HttpCodec.Injector> injectors;
private final DataStreamContextInjector dataStreamContextInjector;
private final W3CBaggageInjector baggageInjector;
private final HttpCodec.Extractor extractor;

/**
Expand All @@ -29,11 +30,13 @@ public CorePropagation(
HttpCodec.Extractor extractor,
HttpCodec.Injector defaultInjector,
Map<TracePropagationStyle, HttpCodec.Injector> injectors,
DataStreamContextInjector dataStreamContextInjector) {
DataStreamContextInjector dataStreamContextInjector,
W3CBaggageInjector baggageInjector) {
this.extractor = extractor;
this.injector = defaultInjector;
this.injectors = injectors;
this.dataStreamContextInjector = dataStreamContextInjector;
this.baggageInjector = baggageInjector;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -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 <C> TagContext extract(C carrier, AgentPropagation.ContextVisitor<C> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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 <C> void inject(AgentSpan span, C carrier, AgentPropagation.Setter<C> setter) {
StringBuilder builder = new StringBuilder();

for (final Map.Entry<String, String> 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());
}
}

Loading