Skip to content

Commit bff441b

Browse files
authored
Encode the last seen Datadog span ID within tracestate (#7067)
w3c phase 2 support
1 parent 7afb3eb commit bff441b

18 files changed

Lines changed: 140 additions & 32 deletions

File tree

dd-java-agent/instrumentation/opentelemetry/opentelemetry-0.3/src/test/groovy/OpenTelemetryTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ class OpenTelemetryTest extends AgentTestRunner {
274274
def expectedTraceparent = "00-${span.delegate.traceId.toHexStringPadded(32)}" +
275275
"-${DDSpanId.toHexStringPadded(span.delegate.spanId)}" +
276276
"-" + (propagatedPriority > 0 ? "01" : "00")
277-
def expectedTracestate = "dd=s:${propagatedPriority}"
277+
def expectedTracestate = "dd=s:${propagatedPriority};p:${DDSpanId.toHexStringPadded(span.delegate.spanId)}"
278278
def expectedDatadogTags = null
279279
if (propagatedMechanism != UNKNOWN) {
280280
expectedDatadogTags = "_dd.p.dm=-" + propagatedMechanism
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package opentelemetry14.context.propagation
2+
3+
import static datadog.trace.api.sampling.PrioritySampling.SAMPLER_KEEP
4+
5+
class W3cLastParentIdTest extends AgentPropagatorTest {
6+
@Override
7+
String style() {
8+
return 'tracecontext'
9+
}
10+
11+
@Override
12+
def values() {
13+
// spotless:off
14+
return [
15+
[['traceparent': '00-11111111111111111111111111111111-2222222222222222-01','tracestate': 'dd=s:2;p:1948e0b51aee0bfa'], '11111111111111111111111111111111', '2222222222222222', SAMPLER_KEEP]
16+
]
17+
// spotless:on
18+
}
19+
20+
@Override
21+
void assertInjectedHeaders(Map<String, String> headers, String traceId, String spanId, byte sampling) {
22+
assert headers['tracestate'].contains("p:1948e0b51aee0bfa")
23+
}
24+
}

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/opentelemetry14/context/propagation/W3cPropagatorTest.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,7 @@ class W3cPropagatorTest extends AgentPropagatorTest {
2323
void assertInjectedHeaders(Map<String, String> headers, String traceId, String spanId, byte sampling) {
2424
def traceFlags = sampling == SAMPLER_KEEP ? '01' : '00'
2525
assert headers['traceparent'] == "00-$traceId-$spanId-$traceFlags"
26+
// 'p:' not expected in tracestate here because 'p' is not supplied in values()
27+
assert !headers['tracestate'].contains("p:")
2628
}
2729
}

dd-java-agent/instrumentation/opentelemetry/opentelemetry-1.4/src/test/groovy/opentelemetry14/context/propagation/W3cPropagatorTracestateTest.groovy

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,16 @@ class W3cPropagatorTracestateTest extends AgentTestRunner {
5555
// Check tracestate contains extracted members plus the Datadog one in first position
5656
def injectedMembers = injectedTracestate.split(',')
5757
injectedMembers.length == Math.min(1 + members.length, 32)
58-
injectedMembers[0] == "dd=s:0;t.tid:1111111111111111"
58+
injectedMembers[0] == expect
5959
for (int i = 0; i< Math.min(members.length, 31); i++) {
6060
assert injectedMembers[i+1] == members[i]
6161
}
6262

6363
where:
64-
// spotless:off
65-
tracestate << [
66-
"foo=1,bar=2",
67-
"dd=s:0,foo=1,bar=2",
68-
"foo=1,dd=s:0,bar=2",
69-
]
70-
// spotless:on
64+
tracestate |expect
65+
"foo=1,bar=2" |"dd=s:0;t.tid:1111111111111111"
66+
"dd=s:0,foo=1,bar=2" |"dd=s:0;t.tid:1111111111111111"
67+
"foo=1,dd=s:0,bar=2" |"dd=s:0;t.tid:1111111111111111"
68+
"dd=s:3" |"dd=s:0;t.tid:1111111111111111"
7169
}
7270
}

dd-java-agent/instrumentation/opentracing/api-0.31/src/test/groovy/OpenTracing31Test.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ class OpenTracing31Test extends AgentTestRunner {
280280
def expectedTraceparent = "00-${context.delegate.traceId.toHexStringPadded(32)}" +
281281
"-${DDSpanId.toHexStringPadded(context.delegate.spanId)}" +
282282
"-" + (propagatedPriority > 0 ? "01" : "00")
283-
def expectedTracestate = "dd=s:${propagatedPriority}"
283+
def expectedTracestate = "dd=s:${propagatedPriority};p:${DDSpanId.toHexStringPadded(context.delegate.spanId)}"
284284
def expectedDatadogTags = null
285285
if (propagatedPriority > 0) {
286286
def effectiveSamplingMechanism = contextPriority == UNSET ? AGENT_RATE : samplingMechanism

dd-java-agent/instrumentation/opentracing/api-0.32/src/test/groovy/OpenTracing32Test.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ class OpenTracing32Test extends AgentTestRunner {
295295
def expectedTraceparent = "00-${context.delegate.traceId.toHexStringPadded(32)}" +
296296
"-${DDSpanId.toHexStringPadded(context.delegate.spanId)}" +
297297
"-" + (propagatedPriority > 0 ? "01" : "00")
298-
def expectedTracestate = "dd=s:${propagatedPriority}"
298+
def expectedTracestate = "dd=s:${propagatedPriority};p:${DDSpanId.toHexStringPadded(context.delegate.spanId)}"
299299
def expectedDatadogTags = null
300300
if (propagatedPriority > 0) {
301301
def effectiveSamplingMechanism = contextPriority == UNSET ? AGENT_RATE : samplingMechanism

dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/asserts/TagsAssert.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class TagsAssert {
6868
assertedTags.add(DDTags.DD_ENTRY_METHOD_SIGNATURE)
6969
assertedTags.add(DDTags.DSM_ENABLED)
7070
assertedTags.add(DDTags.DJM_ENABLED)
71+
assertedTags.add(DDTags.PARENT_ID)
7172

7273
assert tags["thread.name"] != null
7374
assert tags["thread.id"] != null

dd-trace-api/src/main/java/datadog/trace/api/DDTags.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,5 @@ public class DDTags {
7171

7272
public static final String PROFILING_CONTEXT_ENGINE = "_dd.profiling.ctx";
7373
public static final String BASE_SERVICE = "_dd.base_service";
74+
public static final String PARENT_ID = "_dd.parent_id";
7475
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ public class DDSpanContext
142142
private volatile int encodedOperationName;
143143
private volatile int encodedResourceName;
144144
private volatile boolean requiresPostProcessing;
145+
private volatile CharSequence lastParentId;
145146
private final boolean isRemote;
146147

147148
/**
@@ -373,6 +374,7 @@ public DDSpanContext(
373374
if (samplingPriority != PrioritySampling.UNSET) {
374375
setSamplingPriority(samplingPriority, SamplingMechanism.UNKNOWN);
375376
}
377+
setLastParentId(this.propagationTags.getLastParentId());
376378
this.isRemote = isRemote;
377379
}
378380

@@ -1015,6 +1017,19 @@ public boolean isRequiresPostProcessing() {
10151017
return requiresPostProcessing;
10161018
}
10171019

1020+
public CharSequence getLastParentId() {
1021+
return lastParentId;
1022+
}
1023+
1024+
public void setLastParentId(CharSequence lastParentId) {
1025+
if (lastParentId != null) {
1026+
synchronized (unsafeTags) {
1027+
unsafeSetTag("_dd.parent_id", lastParentId);
1028+
}
1029+
this.lastParentId = lastParentId;
1030+
}
1031+
}
1032+
10181033
public boolean isRemote() {
10191034
return isRemote;
10201035
}

dd-trace-core/src/main/java/datadog/trace/core/propagation/ContextInterpreter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public abstract class ContextInterpreter implements AgentPropagation.KeyClassifi
4444
protected Map<String, String> tags;
4545
protected Map<String, String> baggage;
4646

47+
protected CharSequence lastParentId;
4748
protected CharSequence origin;
4849
protected long endToEndStartTime;
4950
protected boolean valid;

0 commit comments

Comments
 (0)