Skip to content

Commit 70c9598

Browse files
Ensure test session trace ID and span ID are the same (#7747)
1 parent 5886196 commit 70c9598

File tree

37 files changed

+386
-239
lines changed

37 files changed

+386
-239
lines changed

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package datadog.trace.civisibility.domain;
22

3-
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
3+
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
44

55
import datadog.trace.api.Config;
66
import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric;
77
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
88
import datadog.trace.api.civisibility.telemetry.tag.EventType;
99
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
10+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
1011
import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes;
1112
import datadog.trace.bootstrap.instrumentation.api.Tags;
1213
import datadog.trace.civisibility.codeowners.Codeowners;
@@ -49,12 +50,18 @@ public AbstractTestModule(
4950
this.methodLinesResolver = methodLinesResolver;
5051
this.onSpanFinish = onSpanFinish;
5152

53+
AgentTracer.SpanBuilder spanBuilder =
54+
AgentTracer.get()
55+
.buildSpan(
56+
CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test_module")
57+
.asChildOf(sessionSpanContext);
58+
5259
if (startTime != null) {
53-
span = startSpan(testDecorator.component() + ".test_module", sessionSpanContext, startTime);
54-
} else {
55-
span = startSpan(testDecorator.component() + ".test_module", sessionSpanContext);
60+
spanBuilder = spanBuilder.withStartTimestamp(startTime);
5661
}
5762

63+
span = spanBuilder.start();
64+
5865
span.setSpanType(InternalSpanTypes.TEST_MODULE_END);
5966
span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_TEST_MODULE);
6067

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package datadog.trace.civisibility.domain;
22

3-
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
3+
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
44

55
import datadog.trace.api.Config;
6+
import datadog.trace.api.DDTraceId;
7+
import datadog.trace.api.IdGenerationStrategy;
68
import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric;
79
import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector;
810
import datadog.trace.api.civisibility.telemetry.TagValue;
@@ -26,6 +28,7 @@
2628
import javax.annotation.Nullable;
2729

2830
public abstract class AbstractTestSession {
31+
2932
protected final Provider ciProvider;
3033
protected final InstrumentationType instrumentationType;
3134
protected final AgentSpan span;
@@ -56,12 +59,24 @@ public AbstractTestSession(
5659
this.codeowners = codeowners;
5760
this.methodLinesResolver = methodLinesResolver;
5861

62+
// CI Test Cycle protocol requires session's trace ID and span ID to be the same
63+
IdGenerationStrategy idGenerationStrategy = config.getIdGenerationStrategy();
64+
DDTraceId traceId = idGenerationStrategy.generateTraceId();
65+
AgentSpan.Context traceContext = new TraceContext(traceId);
66+
67+
AgentTracer.SpanBuilder spanBuilder =
68+
AgentTracer.get()
69+
.buildSpan(
70+
CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test_session")
71+
.asChildOf(traceContext)
72+
.withSpanId(traceId.toLong());
73+
5974
if (startTime != null) {
60-
span = startSpan(testDecorator.component() + ".test_session", startTime);
61-
} else {
62-
span = startSpan(testDecorator.component() + ".test_session");
75+
spanBuilder = spanBuilder.withStartTimestamp(startTime);
6376
}
6477

78+
span = spanBuilder.start();
79+
6580
span.setSpanType(InternalSpanTypes.TEST_SESSION_END);
6681
span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_TEST_SESSION);
6782
span.setTag(Tags.TEST_SESSION_ID, span.getTraceId());

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package datadog.trace.civisibility.domain;
22

3+
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
34
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
45
import static datadog.trace.util.Strings.toJson;
56

@@ -85,7 +86,7 @@ public TestImpl(
8586

8687
AgentTracer.SpanBuilder spanBuilder =
8788
AgentTracer.get()
88-
.buildSpan(testDecorator.component() + ".test")
89+
.buildSpan(CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test")
8990
.ignoreActiveSpan()
9091
.asChildOf(null)
9192
.withRequestContextData(RequestContextSlot.CI_VISIBILITY, context);

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package datadog.trace.civisibility.domain;
22

3+
import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME;
34
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
4-
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
55

66
import datadog.trace.api.Config;
77
import datadog.trace.api.civisibility.DDTestSuite;
@@ -78,12 +78,18 @@ public TestSuiteImpl(
7878
this.coverageStoreFactory = coverageStoreFactory;
7979
this.onSpanFinish = onSpanFinish;
8080

81+
AgentTracer.SpanBuilder spanBuilder =
82+
AgentTracer.get()
83+
.buildSpan(
84+
CI_VISIBILITY_INSTRUMENTATION_NAME, testDecorator.component() + ".test_suite")
85+
.asChildOf(moduleSpanContext);
86+
8187
if (startTime != null) {
82-
span = startSpan(testDecorator.component() + ".test_suite", moduleSpanContext, startTime);
83-
} else {
84-
span = startSpan(testDecorator.component() + ".test_suite", moduleSpanContext);
88+
spanBuilder = spanBuilder.withStartTimestamp(startTime);
8589
}
8690

91+
span = spanBuilder.start();
92+
8793
span.setSpanType(InternalSpanTypes.TEST_SUITE_END);
8894
span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_TEST_SUITE);
8995

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package datadog.trace.civisibility.domain;
2+
3+
import datadog.trace.api.DDSpanId;
4+
import datadog.trace.api.DDTraceId;
5+
import datadog.trace.api.sampling.PrioritySampling;
6+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
7+
import datadog.trace.bootstrap.instrumentation.api.AgentTraceCollector;
8+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
9+
import datadog.trace.bootstrap.instrumentation.api.PathwayContext;
10+
import java.util.Collections;
11+
import java.util.Map;
12+
13+
/**
14+
* Test session spans need to have trace ID and span ID which are identical (CI Test Cycle protocol
15+
* requirement), so this dummy context class is used as a crutch to supply a specific trace ID when
16+
* creating a session span.
17+
*/
18+
public class TraceContext implements AgentSpan.Context {
19+
20+
private final DDTraceId traceId;
21+
22+
public TraceContext(DDTraceId traceId) {
23+
this.traceId = traceId;
24+
}
25+
26+
@Override
27+
public DDTraceId getTraceId() {
28+
return traceId;
29+
}
30+
31+
@Override
32+
public long getSpanId() {
33+
return DDSpanId.ZERO;
34+
}
35+
36+
@Override
37+
public AgentTraceCollector getTraceCollector() {
38+
return AgentTracer.NoopAgentTraceCollector.INSTANCE;
39+
}
40+
41+
@Override
42+
public int getSamplingPriority() {
43+
return PrioritySampling.UNSET;
44+
}
45+
46+
@Override
47+
public Iterable<Map.Entry<String, String>> baggageItems() {
48+
return Collections.emptyList();
49+
}
50+
51+
@Override
52+
public PathwayContext getPathwayContext() {
53+
return AgentTracer.NoopPathwayContext.INSTANCE;
54+
}
55+
}

dd-java-agent/instrumentation/maven-3.2.1/src/test/resources/test_maven_build_with_failed_tests_generates_spans/events.ftl

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"_dd.trace_span_attribute_schema" : 0
1717
},
1818
"meta" : {
19+
"_dd.p.tid" : ${content_meta__dd_p_tid},
1920
"test.type" : "test",
2021
"_dd.tracer_host" : ${content_meta__dd_tracer_host},
2122
"test.status" : "fail",
@@ -51,6 +52,7 @@
5152
"_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2}
5253
},
5354
"meta" : {
55+
"_dd.p.tid" : ${content_meta__dd_p_tid_2},
5456
"test.type" : "test",
5557
"test.module" : "Maven Integration Tests Project maven-surefire-plugin default-test",
5658
"test.status" : "fail",
@@ -73,7 +75,7 @@
7375
"content" : {
7476
"trace_id" : ${content_test_session_id},
7577
"span_id" : ${content_span_id},
76-
"parent_id" : ${content_parent_id},
78+
"parent_id" : ${content_test_session_id},
7779
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
7880
"name" : "Maven_Integration_Tests_Project_maven_clean_plugin_default_clean",
7981
"resource" : "Maven_Integration_Tests_Project_maven_clean_plugin_default_clean",
@@ -82,6 +84,7 @@
8284
"error" : 0,
8385
"metrics" : { },
8486
"meta" : {
87+
"_dd.p.tid" : ${content_meta__dd_p_tid_3},
8588
"execution" : "default-clean",
8689
"project" : "Maven Integration Tests Project",
8790
"library_version" : ${content_meta_library_version},
@@ -95,7 +98,7 @@
9598
"content" : {
9699
"trace_id" : ${content_test_session_id},
97100
"span_id" : ${content_span_id_2},
98-
"parent_id" : ${content_parent_id},
101+
"parent_id" : ${content_test_session_id},
99102
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
100103
"name" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_compile",
101104
"resource" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_compile",
@@ -104,6 +107,7 @@
104107
"error" : 0,
105108
"metrics" : { },
106109
"meta" : {
110+
"_dd.p.tid" : ${content_meta__dd_p_tid_4},
107111
"execution" : "default-compile",
108112
"project" : "Maven Integration Tests Project",
109113
"library_version" : ${content_meta_library_version},
@@ -117,7 +121,7 @@
117121
"content" : {
118122
"trace_id" : ${content_test_session_id},
119123
"span_id" : ${content_span_id_3},
120-
"parent_id" : ${content_parent_id},
124+
"parent_id" : ${content_test_session_id},
121125
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
122126
"name" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_testCompile",
123127
"resource" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_testCompile",
@@ -126,6 +130,7 @@
126130
"error" : 0,
127131
"metrics" : { },
128132
"meta" : {
133+
"_dd.p.tid" : ${content_meta__dd_p_tid_5},
129134
"execution" : "default-testCompile",
130135
"project" : "Maven Integration Tests Project",
131136
"library_version" : ${content_meta_library_version},
@@ -139,7 +144,7 @@
139144
"content" : {
140145
"trace_id" : ${content_test_session_id},
141146
"span_id" : ${content_span_id_4},
142-
"parent_id" : ${content_parent_id},
147+
"parent_id" : ${content_test_session_id},
143148
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
144149
"name" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_resources",
145150
"resource" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_resources",
@@ -148,6 +153,7 @@
148153
"error" : 0,
149154
"metrics" : { },
150155
"meta" : {
156+
"_dd.p.tid" : ${content_meta__dd_p_tid_6},
151157
"execution" : "default-resources",
152158
"project" : "Maven Integration Tests Project",
153159
"library_version" : ${content_meta_library_version},
@@ -161,7 +167,7 @@
161167
"content" : {
162168
"trace_id" : ${content_test_session_id},
163169
"span_id" : ${content_span_id_5},
164-
"parent_id" : ${content_parent_id},
170+
"parent_id" : ${content_test_session_id},
165171
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
166172
"name" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_testResources",
167173
"resource" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_testResources",
@@ -170,6 +176,7 @@
170176
"error" : 0,
171177
"metrics" : { },
172178
"meta" : {
179+
"_dd.p.tid" : ${content_meta__dd_p_tid_7},
173180
"execution" : "default-testResources",
174181
"project" : "Maven Integration Tests Project",
175182
"library_version" : ${content_meta_library_version},

dd-java-agent/instrumentation/maven-3.2.1/src/test/resources/test_maven_build_with_incorrect_command_generates_spans/events.ftl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"_dd.trace_span_attribute_schema" : 0
1717
},
1818
"meta" : {
19+
"_dd.p.tid" : ${content_meta__dd_p_tid},
1920
"test.type" : "test",
2021
"_dd.tracer_host" : ${content_meta__dd_tracer_host},
2122
"test.status" : "fail",

dd-java-agent/instrumentation/maven-3.2.1/src/test/resources/test_maven_build_with_no_fork_generates_spans/events.ftl

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"_dd.trace_span_attribute_schema" : 0
1717
},
1818
"meta" : {
19+
"_dd.p.tid" : ${content_meta__dd_p_tid},
1920
"test.type" : "test",
2021
"_dd.tracer_host" : ${content_meta__dd_tracer_host},
2122
"test.status" : "pass",
@@ -48,6 +49,7 @@
4849
"_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2}
4950
},
5051
"meta" : {
52+
"_dd.p.tid" : ${content_meta__dd_p_tid_2},
5153
"test.type" : "test",
5254
"test.module" : "Maven Integration Tests Project maven-surefire-plugin default-test",
5355
"test.status" : "pass",
@@ -67,7 +69,7 @@
6769
"content" : {
6870
"trace_id" : ${content_test_session_id},
6971
"span_id" : ${content_span_id},
70-
"parent_id" : ${content_parent_id},
72+
"parent_id" : ${content_test_session_id},
7173
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
7274
"name" : "Maven_Integration_Tests_Project_maven_clean_plugin_default_clean",
7375
"resource" : "Maven_Integration_Tests_Project_maven_clean_plugin_default_clean",
@@ -76,6 +78,7 @@
7678
"error" : 0,
7779
"metrics" : { },
7880
"meta" : {
81+
"_dd.p.tid" : ${content_meta__dd_p_tid_3},
7982
"execution" : "default-clean",
8083
"project" : "Maven Integration Tests Project",
8184
"library_version" : ${content_meta_library_version},
@@ -89,7 +92,7 @@
8992
"content" : {
9093
"trace_id" : ${content_test_session_id},
9194
"span_id" : ${content_span_id_2},
92-
"parent_id" : ${content_parent_id},
95+
"parent_id" : ${content_test_session_id},
9396
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
9497
"name" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_compile",
9598
"resource" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_compile",
@@ -98,6 +101,7 @@
98101
"error" : 0,
99102
"metrics" : { },
100103
"meta" : {
104+
"_dd.p.tid" : ${content_meta__dd_p_tid_4},
101105
"execution" : "default-compile",
102106
"project" : "Maven Integration Tests Project",
103107
"library_version" : ${content_meta_library_version},
@@ -111,7 +115,7 @@
111115
"content" : {
112116
"trace_id" : ${content_test_session_id},
113117
"span_id" : ${content_span_id_3},
114-
"parent_id" : ${content_parent_id},
118+
"parent_id" : ${content_test_session_id},
115119
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
116120
"name" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_testCompile",
117121
"resource" : "Maven_Integration_Tests_Project_maven_compiler_plugin_default_testCompile",
@@ -120,6 +124,7 @@
120124
"error" : 0,
121125
"metrics" : { },
122126
"meta" : {
127+
"_dd.p.tid" : ${content_meta__dd_p_tid_5},
123128
"execution" : "default-testCompile",
124129
"project" : "Maven Integration Tests Project",
125130
"library_version" : ${content_meta_library_version},
@@ -133,7 +138,7 @@
133138
"content" : {
134139
"trace_id" : ${content_test_session_id},
135140
"span_id" : ${content_span_id_4},
136-
"parent_id" : ${content_parent_id},
141+
"parent_id" : ${content_test_session_id},
137142
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
138143
"name" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_resources",
139144
"resource" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_resources",
@@ -142,6 +147,7 @@
142147
"error" : 0,
143148
"metrics" : { },
144149
"meta" : {
150+
"_dd.p.tid" : ${content_meta__dd_p_tid_6},
145151
"execution" : "default-resources",
146152
"project" : "Maven Integration Tests Project",
147153
"library_version" : ${content_meta_library_version},
@@ -155,7 +161,7 @@
155161
"content" : {
156162
"trace_id" : ${content_test_session_id},
157163
"span_id" : ${content_span_id_5},
158-
"parent_id" : ${content_parent_id},
164+
"parent_id" : ${content_test_session_id},
159165
"service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
160166
"name" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_testResources",
161167
"resource" : "Maven_Integration_Tests_Project_maven_resources_plugin_default_testResources",
@@ -164,6 +170,7 @@
164170
"error" : 0,
165171
"metrics" : { },
166172
"meta" : {
173+
"_dd.p.tid" : ${content_meta__dd_p_tid_7},
167174
"execution" : "default-testResources",
168175
"project" : "Maven Integration Tests Project",
169176
"library_version" : ${content_meta_library_version},

0 commit comments

Comments
 (0)