Skip to content

Commit 0dc5a8c

Browse files
committed
refactor multiple implementations of W3C trace context building into a dedicated helper
1 parent 13c1634 commit 0dc5a8c

File tree

7 files changed

+77
-65
lines changed

7 files changed

+77
-65
lines changed

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/JDBCDecorator.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import static datadog.trace.bootstrap.instrumentation.api.Tags.*;
99

1010
import datadog.trace.api.Config;
11-
import datadog.trace.api.DDSpanId;
1211
import datadog.trace.api.DDTraceId;
12+
import datadog.trace.api.W3CTraceParent;
1313
import datadog.trace.api.naming.SpanNaming;
1414
import datadog.trace.api.telemetry.LogCollector;
1515
import datadog.trace.bootstrap.ContextStore;
@@ -257,16 +257,6 @@ private AgentSpan withQueryInfo(AgentSpan span, DBQueryInfo info, CharSequence c
257257
return span.setTag(Tags.COMPONENT, component);
258258
}
259259

260-
public String traceParent(AgentSpan span, int samplingPriority) {
261-
StringBuilder sb = new StringBuilder(55);
262-
sb.append("00-");
263-
sb.append(span.getTraceId().toHexString());
264-
sb.append('-');
265-
sb.append(DDSpanId.toHexStringPadded(span.getSpanId()));
266-
sb.append(samplingPriority > 0 ? "-01" : "-00");
267-
return sb.toString();
268-
}
269-
270260
public boolean isOracle(final DBInfo dbInfo) {
271261
return "oracle".equals(dbInfo.getType());
272262
}
@@ -294,7 +284,9 @@ public void setAction(AgentSpan span, Connection connection) {
294284
if (priority == null) {
295285
return;
296286
}
297-
final String traceContext = DD_INSTRUMENTATION_PREFIX + DECORATE.traceParent(span, priority);
287+
final String traceContext =
288+
DD_INSTRUMENTATION_PREFIX
289+
+ W3CTraceParent.build(span.getTraceId(), span.getSpanId(), priority);
298290

299291
connection.setClientInfo("OCSID.ACTION", traceContext);
300292

@@ -380,7 +372,8 @@ public void setApplicationName(AgentSpan span, Connection connection) {
380372
if (priority == null) {
381373
return;
382374
}
383-
final String traceParent = DECORATE.traceParent(span, priority);
375+
final String traceParent =
376+
W3CTraceParent.build(span.getTraceId(), span.getSpanId(), priority);
384377
final String traceContext = "_DD_" + traceParent;
385378

386379
connection.setClientInfo("ApplicationName", traceContext);

dd-java-agent/instrumentation/jdbc/src/main/java/datadog/trace/instrumentation/jdbc/StatementInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import datadog.appsec.api.blocking.BlockingException;
1818
import datadog.trace.agent.tooling.Instrumenter;
1919
import datadog.trace.agent.tooling.InstrumenterModule;
20+
import datadog.trace.api.W3CTraceParent;
2021
import datadog.trace.bootstrap.CallDepthThreadLocalMap;
2122
import datadog.trace.bootstrap.InstrumentationContext;
2223
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
@@ -119,7 +120,7 @@ public static AgentScope onEnter(
119120
Integer priority = span.forceSamplingDecision();
120121
if (priority != null) {
121122
if (!isSqlServer) {
122-
traceParent = DECORATE.traceParent(span, priority);
123+
traceParent = W3CTraceParent.build(span.getTraceId(), span.getSpanId(), priority);
123124
}
124125
// set the dbm trace injected tag on the span
125126
span.setTag(DBM_TRACE_INJECTED, true);

dd-java-agent/instrumentation/mongo/common/src/main/java/datadog/trace/instrumentation/mongo/MongoCommentInjector.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import static datadog.trace.bootstrap.instrumentation.api.InstrumentationTags.DBM_TRACE_INJECTED;
55

66
import datadog.trace.api.Config;
7-
import datadog.trace.api.DDSpanId;
7+
import datadog.trace.api.W3CTraceParent;
88
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
99
import datadog.trace.bootstrap.instrumentation.dbm.SharedDBCommenter;
1010
import org.bson.BsonArray;
@@ -75,7 +75,8 @@ public static String buildComment(AgentSpan dbSpan, String hostname, String dbNa
7575
String dbService = dbSpan.getServiceName();
7676
String traceParent =
7777
Config.get().getDbmPropagationMode().equals(DBM_PROPAGATION_MODE_FULL)
78-
? buildTraceParent(dbSpan)
78+
? W3CTraceParent.build(
79+
dbSpan.getTraceId(), dbSpan.getSpanId(), dbSpan.context().getSamplingPriority())
7980
: null;
8081

8182
// Use shared comment builder directly
@@ -112,13 +113,4 @@ private static BsonValue mergeComment(BsonValue existingComment, String dbmComme
112113
// Incompatible type, preserve existing comment unchanged
113114
return existingComment;
114115
}
115-
116-
static String buildTraceParent(AgentSpan span) {
117-
// W3C traceparent format: version-traceId-spanId-flags
118-
return "00-" // version
119-
+ span.getTraceId().toHexString() // traceId
120-
+ '-'
121-
+ DDSpanId.toHexStringPadded(span.getSpanId()) // spanId
122-
+ (span.context().getSamplingPriority() > 0 ? "-01" : "-00");
123-
}
124116
}

dd-java-agent/instrumentation/mongo/common/src/test/groovy/MongoCommentInjectorTest.groovy

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import datadog.trace.agent.test.InstrumentationSpecification
22
import datadog.trace.api.config.TraceInstrumentationConfig
3-
import datadog.trace.api.sampling.PrioritySampling
43
import datadog.trace.instrumentation.mongo.MongoCommentInjector
54
import org.bson.BsonDocument
65
import org.bson.BsonString
@@ -18,38 +17,6 @@ abstract class BaseMongoCommentInjectorTest extends InstrumentationSpecification
1817
}
1918

2019
class MongoCommentInjectorTest extends BaseMongoCommentInjectorTest {
21-
def "buildTraceParent with sampled flag (SAMPLER_KEEP)"() {
22-
setup:
23-
def span = TEST_TRACER.buildSpan("test-op").start()
24-
span.setSamplingPriority(PrioritySampling.SAMPLER_KEEP, 0)
25-
26-
when:
27-
String traceParent = MongoCommentInjector.buildTraceParent(span)
28-
29-
then:
30-
traceParent != null
31-
traceParent ==~ /00-[0-9a-f]{32}-[0-9a-f]{16}-01/
32-
33-
cleanup:
34-
span?.finish()
35-
}
36-
37-
def "buildTraceParent with not sampled flag (SAMPLER_DROP)"() {
38-
setup:
39-
def span = TEST_TRACER.buildSpan("test-op").start()
40-
span.setSamplingPriority(PrioritySampling.SAMPLER_DROP, 0)
41-
42-
when:
43-
String traceParent = MongoCommentInjector.buildTraceParent(span)
44-
45-
then:
46-
traceParent != null
47-
traceParent ==~ /00-[0-9a-f]{32}-[0-9a-f]{16}-00/
48-
49-
cleanup:
50-
span?.finish()
51-
}
52-
5320
def "injectComment returns null when event is null"() {
5421
when:
5522
BsonDocument result = MongoCommentInjector.injectComment("test-comment", null)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package datadog.trace.api;
2+
3+
/**
4+
* Utility class for building W3C traceparent headers.
5+
*
6+
* @see <a href="https://www.w3.org/TR/trace-context/#traceparent-header">W3C Trace Context</a>
7+
*/
8+
public final class W3CTraceParent {
9+
10+
private W3CTraceParent() {}
11+
12+
/**
13+
* Builds a W3C traceparent header value from the given trace context components.
14+
*
15+
* <p>Format: {@code <version>-<traceId>-<spanId>-<flags>}
16+
*
17+
* @param traceId the trace id
18+
* @param spanId the span id
19+
* @param samplingPriority the sampling priority (positive values result in sampled flag set)
20+
* @return the W3C traceparent header value
21+
*/
22+
public static String build(DDTraceId traceId, long spanId, int samplingPriority) {
23+
return "00-"
24+
+ traceId.toHexString()
25+
+ '-'
26+
+ DDSpanId.toHexStringPadded(spanId)
27+
+ (samplingPriority > 0 ? "-01" : "-00");
28+
}
29+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package datadog.trace.api
2+
3+
import datadog.trace.test.util.DDSpecification
4+
5+
class W3CTraceParentTest extends DDSpecification {
6+
7+
def "build produces correct format with samplingPriority=#samplingPriority"() {
8+
when:
9+
def result = W3CTraceParent.build(traceId, spanId, samplingPriority)
10+
11+
then:
12+
result == expected
13+
14+
where:
15+
traceId | spanId | samplingPriority | expected
16+
DDTraceId.from(1) | 2 | 1 | "00-00000000000000000000000000000001-0000000000000002-01"
17+
DDTraceId.from(1) | 2 | 0 | "00-00000000000000000000000000000001-0000000000000002-00"
18+
DDTraceId.from(1) | 2 | -1 | "00-00000000000000000000000000000001-0000000000000002-00"
19+
DDTraceId.from(1) | 2 | 2 | "00-00000000000000000000000000000001-0000000000000002-01"
20+
DDTraceId.fromHex("0af7651916cd43dd8448eb211c80319c") | 0x00f067aa0ba902b7L | 1 | "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"
21+
DDTraceId.from(Long.MAX_VALUE) | Long.MAX_VALUE | 1 | "00-00000000000000007fffffffffffffff-7fffffffffffffff-01"
22+
}
23+
24+
def "build matches W3C traceparent format"() {
25+
when:
26+
def result = W3CTraceParent.build(DDTraceId.from(123456789L), 987654321L, 1)
27+
28+
then:
29+
// W3C format: version-traceId(32 hex)-spanId(16 hex)-flags(2 hex)
30+
result ==~ /00-[0-9a-f]{32}-[0-9a-f]{16}-(00|01)/
31+
}
32+
}

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

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import datadog.trace.api.DDTraceId;
1717
import datadog.trace.api.TraceConfig;
1818
import datadog.trace.api.TracePropagationStyle;
19+
import datadog.trace.api.W3CTraceParent;
1920
import datadog.trace.api.internal.util.LongStringUtils;
2021
import datadog.trace.api.sampling.PrioritySampling;
2122
import datadog.trace.api.sampling.SamplingMechanism;
@@ -70,13 +71,10 @@ public <C> void inject(
7071
}
7172

7273
private <C> void injectTraceParent(DDSpanContext context, C carrier, CarrierSetter<C> setter) {
73-
StringBuilder sb = new StringBuilder(TRACE_PARENT_LENGTH);
74-
sb.append("00-");
75-
sb.append(context.getTraceId().toHexString());
76-
sb.append('-');
77-
sb.append(DDSpanId.toHexStringPadded(context.getSpanId()));
78-
sb.append(context.getSamplingPriority() > 0 ? "-01" : "-00");
79-
setter.set(carrier, TRACE_PARENT_KEY, sb.toString());
74+
String traceparent =
75+
W3CTraceParent.build(
76+
context.getTraceId(), context.getSpanId(), context.getSamplingPriority());
77+
setter.set(carrier, TRACE_PARENT_KEY, traceparent);
8078
}
8179

8280
private <C> void injectTraceState(DDSpanContext context, C carrier, CarrierSetter<C> setter) {

0 commit comments

Comments
 (0)