Skip to content

Commit f9c6fba

Browse files
Trace Maven and Gradle build tasks (#7721)
1 parent 24da7b5 commit f9c6fba

File tree

55 files changed

+6542
-1438
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+6542
-1438
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import datadog.trace.api.civisibility.domain.BuildModuleLayout;
44
import datadog.trace.api.civisibility.domain.BuildSessionSettings;
55
import datadog.trace.api.civisibility.domain.JavaAgent;
6+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
67
import datadog.trace.civisibility.config.JvmInfo;
78
import java.nio.file.Path;
89
import java.util.Collection;
@@ -25,6 +26,8 @@ BuildSystemModule testModuleStart(
2526
@Nullable Collection<Path> classpath,
2627
@Nullable JavaAgent jacocoAgent);
2728

29+
AgentSpan testTaskStart(String taskName);
30+
2831
BuildSessionSettings getSettings();
2932

3033
interface Factory {

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

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

3+
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
4+
35
import datadog.trace.api.Config;
46
import datadog.trace.api.DDTags;
57
import datadog.trace.api.civisibility.CIConstants;
@@ -202,6 +204,11 @@ public BuildSystemModuleImpl testModuleStart(
202204
this::onModuleFinish);
203205
}
204206

207+
@Override
208+
public AgentSpan testTaskStart(String taskName) {
209+
return startSpan("ci_visibility", taskName, span.context());
210+
}
211+
205212
private void onModuleFinish(AgentSpan moduleSpan) {
206213
// multiple modules can finish in parallel
207214
synchronized (tagPropagationLock) {

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/BuildEventsHandlerImpl.java

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import datadog.trace.api.civisibility.domain.BuildSessionSettings;
66
import datadog.trace.api.civisibility.domain.JavaAgent;
77
import datadog.trace.api.civisibility.events.BuildEventsHandler;
8+
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
89
import datadog.trace.bootstrap.instrumentation.api.Tags;
910
import datadog.trace.civisibility.config.JvmInfo;
1011
import datadog.trace.civisibility.config.JvmInfoFactory;
@@ -23,7 +24,10 @@ public class BuildEventsHandlerImpl<SessionKey> implements BuildEventsHandler<Se
2324
private final ConcurrentMap<SessionKey, BuildSystemSession> inProgressTestSessions =
2425
new ConcurrentHashMap<>();
2526

26-
private final ConcurrentMap<TestModuleDescriptor<SessionKey>, BuildSystemModule>
27+
private final ConcurrentMap<BuildTaskDescriptor<SessionKey>, AgentSpan> inProgressBuildTasks =
28+
new ConcurrentHashMap<>();
29+
30+
private final ConcurrentMap<BuildTaskDescriptor<SessionKey>, BuildSystemModule>
2731
inProgressTestModules = new ConcurrentHashMap<>();
2832

2933
private final BuildSystemSession.Factory sessionFactory;
@@ -79,6 +83,47 @@ public void onTestSessionFinish(final SessionKey sessionKey) {
7983
testSession.end(null);
8084
}
8185

86+
@Override
87+
public void onBuildTaskStart(
88+
SessionKey sessionKey, String taskName, Map<String, Object> additionalTags) {
89+
BuildSystemSession testSession = inProgressTestSessions.get(sessionKey);
90+
if (testSession == null) {
91+
throw new IllegalStateException("Could not find session span for key: " + sessionKey);
92+
}
93+
AgentSpan buildTask = testSession.testTaskStart(taskName);
94+
for (Map.Entry<String, Object> e : additionalTags.entrySet()) {
95+
buildTask.setTag(e.getKey(), e.getValue());
96+
}
97+
inProgressBuildTasks.put(new BuildTaskDescriptor<>(sessionKey, taskName), buildTask);
98+
}
99+
100+
@Override
101+
public void onBuildTaskFail(SessionKey sessionKey, String taskName, Throwable throwable) {
102+
AgentSpan buildTask = inProgressBuildTasks.get(new BuildTaskDescriptor<>(sessionKey, taskName));
103+
if (buildTask == null) {
104+
throw new IllegalStateException(
105+
"Could not find build task span for session key "
106+
+ sessionKey
107+
+ " and task name "
108+
+ taskName);
109+
}
110+
buildTask.setError(true);
111+
buildTask.addThrowable(throwable);
112+
}
113+
114+
@Override
115+
public void onBuildTaskFinish(SessionKey sessionKey, String taskName) {
116+
AgentSpan buildTask = inProgressBuildTasks.get(new BuildTaskDescriptor<>(sessionKey, taskName));
117+
if (buildTask == null) {
118+
throw new IllegalStateException(
119+
"Could not find build task span for session key "
120+
+ sessionKey
121+
+ " and task name "
122+
+ taskName);
123+
}
124+
buildTask.finish();
125+
}
126+
82127
@Override
83128
public BuildModuleSettings onTestModuleStart(
84129
final SessionKey sessionKey,
@@ -104,8 +149,8 @@ public BuildModuleSettings onTestModuleStart(
104149
}
105150
}
106151

107-
TestModuleDescriptor<SessionKey> testModuleDescriptor =
108-
new TestModuleDescriptor<>(sessionKey, moduleName);
152+
BuildTaskDescriptor<SessionKey> testModuleDescriptor =
153+
new BuildTaskDescriptor<>(sessionKey, moduleName);
109154
inProgressTestModules.put(testModuleDescriptor, testModule);
110155

111156
return testModule.getSettings();
@@ -126,8 +171,8 @@ public void onTestModuleFail(
126171
}
127172

128173
private BuildSystemModule getTestModule(final SessionKey sessionKey, final String moduleName) {
129-
TestModuleDescriptor<SessionKey> testModuleDescriptor =
130-
new TestModuleDescriptor<>(sessionKey, moduleName);
174+
BuildTaskDescriptor<SessionKey> testModuleDescriptor =
175+
new BuildTaskDescriptor<>(sessionKey, moduleName);
131176
BuildSystemModule testModule = inProgressTestModules.get(testModuleDescriptor);
132177
if (testModule == null) {
133178
throw new IllegalStateException(
@@ -138,8 +183,8 @@ private BuildSystemModule getTestModule(final SessionKey sessionKey, final Strin
138183

139184
@Override
140185
public void onTestModuleFinish(SessionKey sessionKey, String moduleName) {
141-
TestModuleDescriptor<SessionKey> testModuleDescriptor =
142-
new TestModuleDescriptor<>(sessionKey, moduleName);
186+
BuildTaskDescriptor<SessionKey> testModuleDescriptor =
187+
new BuildTaskDescriptor<>(sessionKey, moduleName);
143188
BuildSystemModule testModule = inProgressTestModules.remove(testModuleDescriptor);
144189
if (testModule == null) {
145190
throw new IllegalStateException(
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package datadog.trace.civisibility.events;
2+
3+
import java.util.Objects;
4+
5+
public class BuildTaskDescriptor<T> {
6+
7+
private final T sessionKey;
8+
private final String taskName;
9+
10+
public BuildTaskDescriptor(T sessionKey, String taskName) {
11+
this.sessionKey = sessionKey;
12+
this.taskName = taskName;
13+
}
14+
15+
@Override
16+
public boolean equals(Object o) {
17+
if (this == o) {
18+
return true;
19+
}
20+
if (o == null || getClass() != o.getClass()) {
21+
return false;
22+
}
23+
BuildTaskDescriptor<?> that = (BuildTaskDescriptor<?>) o;
24+
return sessionKey.equals(that.sessionKey) && taskName.equals(that.taskName);
25+
}
26+
27+
@Override
28+
public int hashCode() {
29+
return Objects.hash(sessionKey, taskName);
30+
}
31+
}

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/events/TestModuleDescriptor.java

Lines changed: 0 additions & 31 deletions
This file was deleted.

dd-java-agent/instrumentation/gradle-3.0/src/main/groovy/datadog/trace/instrumentation/gradle/legacy/GradleBuildListener.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import datadog.trace.api.civisibility.domain.JavaAgent;
99
import datadog.trace.api.civisibility.events.BuildEventsHandler;
1010
import java.nio.file.Path;
11+
import java.util.Collections;
1112
import java.util.List;
1213
import java.util.Map;
1314
import java.util.Set;
@@ -95,14 +96,15 @@ static final class TestTaskExecutionListener implements TaskExecutionListener {
9596

9697
@Override
9798
public void beforeExecute(@Nonnull Task task) {
98-
if (!GradleUtils.isTestTask(task)) {
99-
return;
100-
}
101-
10299
Project project = task.getProject();
103100
Gradle gradle = project.getGradle();
104101
String taskPath = task.getPath();
105102

103+
if (!GradleUtils.isTestTask(task)) {
104+
buildEventsHandler.onBuildTaskStart(gradle, taskPath, Collections.emptyMap());
105+
return;
106+
}
107+
106108
List<String> sourceSetNames = Config.get().getCiVisibilityJacocoGradleSourceSets();
107109
BuildModuleLayout moduleLayout = GradleUtils.getModuleLayout(project, sourceSetNames);
108110
Path jvmExecutable = GradleUtils.getEffectiveExecutable(task);
@@ -118,15 +120,19 @@ public void beforeExecute(@Nonnull Task task) {
118120

119121
@Override
120122
public void afterExecute(@Nonnull Task task, @Nonnull TaskState state) {
121-
if (!GradleUtils.isTestTask(task)) {
122-
return;
123-
}
124-
125123
Project project = task.getProject();
126124
Gradle gradle = project.getGradle();
127125
String taskPath = task.getPath();
128-
129126
Throwable failure = state.getFailure();
127+
128+
if (!GradleUtils.isTestTask(task)) {
129+
if (failure != null) {
130+
buildEventsHandler.onBuildTaskFail(gradle, taskPath, failure);
131+
}
132+
buildEventsHandler.onBuildTaskFinish(gradle, taskPath);
133+
return;
134+
}
135+
130136
if (failure != null) {
131137
buildEventsHandler.onTestModuleFail(gradle, taskPath, failure);
132138

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityGradleListener.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,13 @@ public void projectsEvaluated(Gradle gradle) {
173173
@SuppressWarnings("unchecked")
174174
@Override
175175
public void beforeExecute(TaskIdentity<?> taskIdentity) {
176+
String taskPath = taskIdentity.getTaskPath();
176177
if (!Test.class.isAssignableFrom(taskIdentity.getTaskType())) {
178+
ciVisibilityService.onBuildTaskStart(taskPath);
177179
return;
178180
}
179181

180182
String projectPath = taskIdentity.getProjectPath();
181-
String taskPath = taskIdentity.getTaskPath();
182-
183183
Project project = gradle.getRootProject().project(projectPath);
184184
Test task = (Test) project.getTasks().getByName(taskIdentity.name);
185185

@@ -226,12 +226,14 @@ private JavaAgent getJacocoAgent(Test task) {
226226

227227
@Override
228228
public void afterExecute(TaskIdentity<?> taskIdentity, TaskState state) {
229+
String taskPath = taskIdentity.getTaskPath();
230+
Throwable failure = state.getFailure();
231+
229232
if (!Test.class.isAssignableFrom(taskIdentity.getTaskType())) {
233+
ciVisibilityService.onBuildTaskFinish(taskPath, failure);
230234
return;
231235
}
232236

233-
String taskPath = taskIdentity.getTaskPath();
234-
Throwable failure = state.getFailure();
235237
String reason = state.getSkipped() || !state.getDidWork() ? state.getSkipMessage() : null;
236238
ciVisibilityService.onModuleFinish(taskPath, failure, reason);
237239
}

dd-java-agent/instrumentation/gradle-8.3/src/main/java/datadog/trace/instrumentation/gradle/CiVisibilityService.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,17 @@ public void onBuildStart(
104104
SESSION_KEY, buildPath, projectRoot, startCommand, "gradle", gradleVersion, additionalTags);
105105
}
106106

107+
public void onBuildTaskStart(String taskPath) {
108+
buildEventsHandler.onBuildTaskStart(SESSION_KEY, taskPath, Collections.emptyMap());
109+
}
110+
111+
public void onBuildTaskFinish(String taskPath, @Nullable Throwable failure) {
112+
if (failure != null) {
113+
buildEventsHandler.onBuildTaskFail(SESSION_KEY, taskPath, failure);
114+
}
115+
buildEventsHandler.onBuildTaskFinish(SESSION_KEY, taskPath);
116+
}
117+
107118
public void onModuleStart(
108119
String taskPath,
109120
BuildModuleLayout moduleLayout,

0 commit comments

Comments
 (0)