Skip to content

Commit c73768e

Browse files
committed
feat(core): Introduce tracing propagator
1 parent 523df01 commit c73768e

File tree

6 files changed

+126
-5
lines changed

6 files changed

+126
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package datadog.context.propagation;
22

3-
import javax.annotation.Nullable;
4-
53
@FunctionalInterface
64
public interface CarrierSetter<C> {
75
/**
@@ -11,5 +9,5 @@ public interface CarrierSetter<C> {
119
* @param key the key to set.
1210
* @param value the value to set.
1311
*/
14-
void set(@Nullable C carrier, String key, String value);
12+
void set(C carrier, String key, String value);
1513
}

dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java

+4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import datadog.communication.ddagent.SharedCommunicationObjects;
1919
import datadog.communication.monitor.Monitoring;
2020
import datadog.communication.monitor.Recording;
21+
import datadog.context.propagation.Propagators;
2122
import datadog.trace.api.ClassloaderConfigurationOverrides;
2223
import datadog.trace.api.Config;
2324
import datadog.trace.api.DDSpanId;
@@ -86,6 +87,7 @@
8687
import datadog.trace.core.propagation.ExtractedContext;
8788
import datadog.trace.core.propagation.HttpCodec;
8889
import datadog.trace.core.propagation.PropagationTags;
90+
import datadog.trace.core.propagation.TracingPropagator;
8991
import datadog.trace.core.scopemanager.ContinuableScopeManager;
9092
import datadog.trace.core.taginterceptor.RuleFlags;
9193
import datadog.trace.core.taginterceptor.TagInterceptor;
@@ -719,6 +721,8 @@ private CoreTracer(
719721
this.propagation =
720722
new CorePropagation(builtExtractor, injector, injectors, dataStreamContextInjector);
721723

724+
Propagators.register(TracingPropagator.concern(), new TracingPropagator(injector, extractor));
725+
722726
this.tagInterceptor =
723727
null == tagInterceptor ? new TagInterceptor(new RuleFlags(config)) : tagInterceptor;
724728

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package datadog.trace.core.propagation;
2+
3+
import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromSpanContext;
4+
5+
import datadog.context.Context;
6+
import datadog.context.propagation.CarrierSetter;
7+
import datadog.context.propagation.CarrierVisitor;
8+
import datadog.context.propagation.Concern;
9+
import datadog.context.propagation.Propagator;
10+
import datadog.trace.bootstrap.instrumentation.api.AgentPropagation;
11+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
12+
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
13+
import datadog.trace.bootstrap.instrumentation.api.TagContext;
14+
import datadog.trace.core.DDSpanContext;
15+
import javax.annotation.ParametersAreNonnullByDefault;
16+
17+
// TODO Javadoc
18+
@ParametersAreNonnullByDefault
19+
public class TracingPropagator implements Propagator {
20+
private static final Concern TRACING_CONCERN = Concern.named("tracing");
21+
private final HttpCodec.Injector injector;
22+
private final HttpCodec.Extractor extractor;
23+
24+
// TODO Javadoc
25+
public TracingPropagator(HttpCodec.Injector injector, HttpCodec.Extractor extractor) {
26+
this.injector = injector;
27+
this.extractor = extractor;
28+
}
29+
30+
// TODO Javadoc
31+
public static Concern concern() {
32+
return TRACING_CONCERN;
33+
}
34+
35+
@Override
36+
public <C> void inject(Context context, C carrier, CarrierSetter<C> setter) {
37+
//noinspection ConstantValue
38+
if (context == null || carrier == null || setter == null) {
39+
return;
40+
}
41+
AgentSpan span = AgentSpan.fromContext(context);
42+
if (span != null) {
43+
AgentSpanContext spanContext = span.context();
44+
if (spanContext instanceof DDSpanContext) {
45+
DDSpanContext ddSpanContext = (DDSpanContext) context;
46+
injector.inject(ddSpanContext, carrier, setter::set);
47+
}
48+
}
49+
}
50+
51+
@Override
52+
public <C> Context extract(Context context, C carrier, CarrierVisitor<C> visitor) {
53+
//noinspection ConstantValue
54+
if (context == null || carrier == null || visitor == null) {
55+
return context;
56+
}
57+
TagContext spanContext = this.extractor.extract(carrier, toContextVisitor(visitor));
58+
return context.with(fromSpanContext(spanContext));
59+
}
60+
61+
private static <C> AgentPropagation.ContextVisitor<C> toContextVisitor(CarrierVisitor<C> visitor) {
62+
return (carrier1, classifier) -> visitor.forEachKeyValue(carrier1, classifier::accept);
63+
}
64+
private static <C> AgentPropagation.ContextVisitor<C> toContextVisitor(
65+
CarrierVisitor<C> visitor) {

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentPropagation.java

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package datadog.trace.bootstrap.instrumentation.api;
22

3+
import datadog.context.propagation.CarrierSetter;
4+
import datadog.context.propagation.CarrierVisitor;
35
import datadog.trace.api.TracePropagationStyle;
46
import java.util.LinkedHashMap;
7+
import java.util.function.BiConsumer;
8+
import javax.annotation.ParametersAreNonnullByDefault;
59

610
public interface AgentPropagation {
711
<C> void inject(AgentSpan span, C carrier, Setter<C> setter);
@@ -25,7 +29,7 @@ <C> void injectPathwayContext(
2529
<C> void injectPathwayContextWithoutSendingStats(
2630
AgentSpan span, C carrier, Setter<C> setter, LinkedHashMap<String, String> sortedTags);
2731

28-
interface Setter<C> {
32+
interface Setter<C> extends CarrierSetter<C> {
2933
void set(C carrier, String key, String value);
3034
}
3135

@@ -35,7 +39,18 @@ interface KeyClassifier {
3539
boolean accept(String key, String value);
3640
}
3741

38-
interface ContextVisitor<C> {
42+
interface ContextVisitor<C> extends CarrierVisitor<C> {
3943
void forEachKey(C carrier, KeyClassifier classifier);
44+
45+
@ParametersAreNonnullByDefault
46+
@Override
47+
default void forEachKeyValue(C carrier, BiConsumer<String, String> visitor) {
48+
forEachKey(
49+
carrier,
50+
(key, value) -> {
51+
visitor.accept(key, value);
52+
return true;
53+
});
54+
}
4055
}
4156
}

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentSpan.java

+15
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,26 @@
1010
import datadog.trace.api.gateway.IGSpanInfo;
1111
import datadog.trace.api.gateway.RequestContext;
1212
import datadog.trace.api.interceptor.MutableSpan;
13+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopAgentSpan;
14+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopContext;
1315
import javax.annotation.Nullable;
1416

1517
public interface AgentSpan
1618
extends MutableSpan, ImplicitContextKeyed, Context, IGSpanInfo, WithAgentSpan {
1719

20+
// TODO Javadoc
21+
static AgentSpan fromContext(Context context) {
22+
return context.get(SPAN_KEY);
23+
}
24+
25+
// TODO Javadoc
26+
static AgentSpan fromSpanContext(AgentSpanContext spanContext) {
27+
if (spanContext == null || spanContext == NoopContext.INSTANCE) {
28+
return NoopAgentSpan.INSTANCE;
29+
}
30+
return new AgentTracer.ExtractedSpan(spanContext);
31+
}
32+
1833
DDTraceId getTraceId();
1934

2035
long getSpanId();

internal-api/src/main/java/datadog/trace/bootstrap/instrumentation/api/AgentTracer.java

+24
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,30 @@ public AgentSpanContext context() {
584584
}
585585
}
586586

587+
// TODO Support more behavior like tags edit
588+
static final class ExtractedSpan extends AgentTracer.NoopAgentSpan {
589+
private final AgentSpanContext spanContext;
590+
591+
ExtractedSpan(AgentSpanContext spanContext) {
592+
this.spanContext = spanContext;
593+
}
594+
595+
@Override
596+
public DDTraceId getTraceId() {
597+
return this.spanContext.getTraceId();
598+
}
599+
600+
@Override
601+
public long getSpanId() {
602+
return this.spanContext.getSpanId();
603+
}
604+
605+
@Override
606+
public AgentSpanContext context() {
607+
return this.spanContext;
608+
}
609+
}
610+
587611
public static class NoopAgentSpan implements AgentSpan {
588612
public static final NoopAgentSpan INSTANCE = new NoopAgentSpan();
589613

0 commit comments

Comments
 (0)