Skip to content

Commit aa7341b

Browse files
authored
Merge branch 'master' into kr-igor/dsm-service-name-override
2 parents a0e834e + 00856e0 commit aa7341b

File tree

31 files changed

+409
-125
lines changed

31 files changed

+409
-125
lines changed

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,18 +89,18 @@ public class CiVisibilityRepoServices {
8989
}
9090
}
9191

92-
private static String getModuleName(Config config, Path path, CIInfo ciInfo) {
92+
static String getModuleName(Config config, Path path, CIInfo ciInfo) {
9393
// if parent process is instrumented, it will provide build system's module name
9494
String parentModuleName = config.getCiVisibilityModuleName();
9595
if (parentModuleName != null) {
9696
return parentModuleName;
9797
}
9898
String repoRoot = ciInfo.getNormalizedCiWorkspace();
99-
if (repoRoot != null
100-
&& path.startsWith(repoRoot)
101-
// module name cannot be empty
102-
&& !path.toString().equals(repoRoot)) {
103-
return Paths.get(repoRoot).relativize(path).toString();
99+
if (repoRoot != null && path.startsWith(repoRoot)) {
100+
String relativePath = Paths.get(repoRoot).relativize(path).toString();
101+
if (!relativePath.isEmpty()) {
102+
return relativePath;
103+
}
104104
}
105105
return config.getServiceName();
106106
}

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import datadog.trace.civisibility.events.BuildEventsHandlerImpl;
3131
import datadog.trace.civisibility.events.TestEventsHandlerImpl;
3232
import datadog.trace.civisibility.ipc.SignalServer;
33+
import datadog.trace.civisibility.source.index.RepoIndex;
3334
import datadog.trace.civisibility.telemetry.CiVisibilityMetricCollectorImpl;
3435
import datadog.trace.civisibility.test.ExecutionStrategy;
3536
import datadog.trace.civisibility.utils.ConcurrentHashMapContextStore;
@@ -90,7 +91,8 @@ public static void start(Instrumentation inst, SharedCommunicationObjects sco) {
9091
// so if lines are explicitly enabled,
9192
// we rely on Jacoco instrumentation rather than on our own coverage mechanism
9293
!config.isCiVisibilityCoverageLinesEnabled()) {
93-
Predicate<String> instrumentationFilter = createCoverageInstrumentationFilter(config);
94+
Predicate<String> instrumentationFilter =
95+
createCoverageInstrumentationFilter(services, repoServices);
9496
inst.addTransformer(new CoverageClassTransformer(instrumentationFilter));
9597
}
9698

@@ -112,9 +114,15 @@ private static Path getCurrentPath() {
112114
}
113115
}
114116

115-
private static Predicate<String> createCoverageInstrumentationFilter(Config config) {
116-
String[] includedPackages = config.getCiVisibilityCodeCoverageIncludedPackages();
117-
String[] excludedPackages = config.getCiVisibilityCodeCoverageExcludedPackages();
117+
private static Predicate<String> createCoverageInstrumentationFilter(
118+
CiVisibilityServices services, CiVisibilityRepoServices repoServices) {
119+
String[] includedPackages = services.config.getCiVisibilityCodeCoverageIncludedPackages();
120+
if (includedPackages.length == 0 && services.processHierarchy.isHeadless()) {
121+
RepoIndex repoIndex = repoServices.repoIndexProvider.getIndex();
122+
includedPackages =
123+
Config.convertJacocoExclusionFormatToPackagePrefixes(repoIndex.getRootPackages());
124+
}
125+
String[] excludedPackages = services.config.getCiVisibilityCodeCoverageExcludedPackages();
118126
return new CoverageInstrumentationFilter(includedPackages, excludedPackages);
119127
}
120128

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/ConcurrentCoverageStore.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import datadog.trace.api.civisibility.coverage.CoverageProbes;
55
import datadog.trace.api.civisibility.coverage.CoverageStore;
66
import datadog.trace.api.civisibility.coverage.TestReport;
7+
import datadog.trace.civisibility.source.SourceResolutionException;
78
import java.util.Collection;
89
import java.util.Map;
910
import java.util.concurrent.ConcurrentHashMap;
@@ -36,13 +37,18 @@ private T create(Thread thread) {
3637

3738
@Override
3839
public boolean report(DDTraceId testSessionId, Long testSuiteId, long testSpanId) {
39-
report = report(testSessionId, testSuiteId, testSpanId, probes.values());
40-
return report != null && report.isNotEmpty();
40+
try {
41+
report = report(testSessionId, testSuiteId, testSpanId, probes.values());
42+
return report != null && report.isNotEmpty();
43+
} catch (SourceResolutionException e) {
44+
return false;
45+
}
4146
}
4247

4348
@Nullable
4449
protected abstract TestReport report(
45-
DDTraceId testSessionId, Long testSuiteId, long testSpanId, Collection<T> probes);
50+
DDTraceId testSessionId, Long testSuiteId, long testSpanId, Collection<T> probes)
51+
throws SourceResolutionException;
4652

4753
@Nullable
4854
@Override

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/file/FileCoverageStore.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import datadog.trace.api.civisibility.telemetry.tag.CoverageErrorType;
1212
import datadog.trace.civisibility.coverage.ConcurrentCoverageStore;
1313
import datadog.trace.civisibility.source.SourcePathResolver;
14+
import datadog.trace.civisibility.source.SourceResolutionException;
1415
import java.util.ArrayList;
1516
import java.util.Collection;
1617
import java.util.Collections;
@@ -46,7 +47,8 @@ private FileCoverageStore(
4647
@Nullable
4748
@Override
4849
protected TestReport report(
49-
DDTraceId testSessionId, Long testSuiteId, long testSpanId, Collection<FileProbes> probes) {
50+
DDTraceId testSessionId, Long testSuiteId, long testSpanId, Collection<FileProbes> probes)
51+
throws SourceResolutionException {
5052
try {
5153
Set<Class<?>> combinedClasses = Collections.newSetFromMap(new IdentityHashMap<>());
5254
Collection<String> combinedNonCodeResources = new HashSet<>();

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import datadog.trace.api.civisibility.telemetry.tag.CoverageErrorType;
1212
import datadog.trace.civisibility.coverage.ConcurrentCoverageStore;
1313
import datadog.trace.civisibility.source.SourcePathResolver;
14+
import datadog.trace.civisibility.source.SourceResolutionException;
1415
import datadog.trace.civisibility.source.Utils;
1516
import java.io.InputStream;
1617
import java.util.ArrayList;
@@ -52,7 +53,8 @@ private LineCoverageStore(
5253
@Nullable
5354
@Override
5455
protected TestReport report(
55-
DDTraceId testSessionId, Long testSuiteId, long testSpanId, Collection<LineProbes> probes) {
56+
DDTraceId testSessionId, Long testSuiteId, long testSpanId, Collection<LineProbes> probes)
57+
throws SourceResolutionException {
5658
try {
5759
Map<Class<?>, ExecutionDataAdapter> combinedExecutionData = new IdentityHashMap<>();
5860
Collection<String> combinedNonCodeResources = new HashSet<>();

dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/percentage/JacocoCoverageCalculator.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import datadog.trace.civisibility.ipc.ModuleCoverageDataJacoco;
1010
import datadog.trace.civisibility.ipc.SignalResponse;
1111
import datadog.trace.civisibility.ipc.SignalType;
12+
import datadog.trace.civisibility.source.SourceResolutionException;
1213
import datadog.trace.civisibility.source.index.RepoIndex;
1314
import datadog.trace.civisibility.source.index.RepoIndexProvider;
1415
import datadog.trace.util.Strings;
@@ -312,13 +313,19 @@ private RepoIndexFileLocator(RepoIndex repoIndex, String repoRoot) {
312313

313314
@Override
314315
protected InputStream getSourceStream(String path) throws IOException {
315-
String relativePath = repoIndex.getSourcePath(path);
316-
if (relativePath == null) {
316+
try {
317+
String relativePath = repoIndex.getSourcePath(path);
318+
if (relativePath == null) {
319+
return null;
320+
}
321+
String absolutePath =
322+
repoRoot + (!repoRoot.endsWith(File.separator) ? File.separator : "") + relativePath;
323+
return new BufferedInputStream(Files.newInputStream(Paths.get(absolutePath)));
324+
325+
} catch (SourceResolutionException e) {
326+
LOGGER.debug("Could not resolve source for path {}", path, e);
317327
return null;
318328
}
319-
String absolutePath =
320-
repoRoot + (!repoRoot.endsWith(File.separator) ? File.separator : "") + relativePath;
321-
return new BufferedInputStream(Files.newInputStream(Paths.get(absolutePath)));
322329
}
323330
}
324331

@@ -354,7 +361,13 @@ private long getMergedCoveragePercentage(IBundleCoverage coverageBundle) {
354361
String fileName = sourceFile.getName();
355362
String pathRelativeToSourceRoot =
356363
(Strings.isNotBlank(packageName) ? packageName + "/" : "") + fileName;
357-
String pathRelativeToIndexRoot = repoIndex.getSourcePath(pathRelativeToSourceRoot);
364+
String pathRelativeToIndexRoot;
365+
try {
366+
pathRelativeToIndexRoot = repoIndex.getSourcePath(pathRelativeToSourceRoot);
367+
} catch (SourceResolutionException e) {
368+
LOGGER.debug("Could not resolve source for path {}", pathRelativeToSourceRoot, e);
369+
continue;
370+
}
358371

359372
BitSet sourceFileCoveredLines = getCoveredLines(sourceFile);
360373
// backendCoverageData contains data for all modules in the repo,

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import datadog.trace.civisibility.decorator.TestDecorator;
3333
import datadog.trace.civisibility.source.MethodLinesResolver;
3434
import datadog.trace.civisibility.source.SourcePathResolver;
35+
import datadog.trace.civisibility.source.SourceResolutionException;
3536
import java.lang.reflect.Method;
3637
import java.util.Collection;
3738
import java.util.function.Consumer;
@@ -147,8 +148,14 @@ private void populateSourceDataTags(
147148
return;
148149
}
149150

150-
String sourcePath = sourcePathResolver.getSourcePath(testClass);
151-
if (sourcePath == null || sourcePath.isEmpty()) {
151+
String sourcePath;
152+
try {
153+
sourcePath = sourcePathResolver.getSourcePath(testClass);
154+
if (sourcePath == null || sourcePath.isEmpty()) {
155+
return;
156+
}
157+
} catch (SourceResolutionException e) {
158+
log.debug("Could not populate source path for {}", testClass, e);
152159
return;
153160
}
154161

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

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,18 @@
1919
import datadog.trace.civisibility.decorator.TestDecorator;
2020
import datadog.trace.civisibility.source.MethodLinesResolver;
2121
import datadog.trace.civisibility.source.SourcePathResolver;
22+
import datadog.trace.civisibility.source.SourceResolutionException;
2223
import datadog.trace.civisibility.utils.SpanUtils;
2324
import java.lang.reflect.Method;
2425
import java.util.function.Consumer;
2526
import javax.annotation.Nullable;
27+
import org.slf4j.Logger;
28+
import org.slf4j.LoggerFactory;
2629

2730
public class TestSuiteImpl implements DDTestSuite {
2831

32+
private static final Logger log = LoggerFactory.getLogger(TestSuiteImpl.class);
33+
2934
private final AgentSpan.Context moduleSpanContext;
3035
private final AgentSpan span;
3136
private final String moduleName;
@@ -106,13 +111,9 @@ public TestSuiteImpl(
106111
span.setTag(Tags.TEST_STATUS, TestStatus.skip);
107112

108113
this.testClass = testClass;
109-
if (this.testClass != null) {
110-
if (config.isCiVisibilitySourceDataEnabled()) {
111-
String sourcePath = sourcePathResolver.getSourcePath(testClass);
112-
if (sourcePath != null && !sourcePath.isEmpty()) {
113-
span.setTag(Tags.TEST_SOURCE_FILE, sourcePath);
114-
}
115-
}
114+
115+
if (config.isCiVisibilitySourceDataEnabled()) {
116+
populateSourceDataTags(testClass, sourcePathResolver);
116117
}
117118

118119
testDecorator.afterStart(span);
@@ -129,6 +130,20 @@ public TestSuiteImpl(
129130
}
130131
}
131132

133+
private void populateSourceDataTags(Class<?> testClass, SourcePathResolver sourcePathResolver) {
134+
if (this.testClass == null) {
135+
return;
136+
}
137+
try {
138+
String sourcePath = sourcePathResolver.getSourcePath(testClass);
139+
if (sourcePath != null && !sourcePath.isEmpty()) {
140+
span.setTag(Tags.TEST_SOURCE_FILE, sourcePath);
141+
}
142+
} catch (SourceResolutionException e) {
143+
log.debug("Could not populate source path for {}", testClass, e);
144+
}
145+
}
146+
132147
@Override
133148
public void setTag(String key, Object value) {
134149
span.setTag(key, value);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,11 @@ private Map<String, String> getPropertiesPropagatedToChildProcess(
191191
CiVisibilityConfig.CIVISIBILITY_SIGNAL_SERVER_PORT),
192192
String.valueOf(signalServerAddress != null ? signalServerAddress.getPort() : 0));
193193

194-
List<String> coverageEnabledPackages = sessionSettings.getCoverageEnabledPackages();
194+
List<String> coverageIncludedPackages = sessionSettings.getCoverageIncludedPackages();
195195
propagatedSystemProperties.put(
196196
Strings.propertyNameToSystemPropertyName(
197197
CiVisibilityConfig.CIVISIBILITY_CODE_COVERAGE_INCLUDES),
198-
String.join(":", coverageEnabledPackages));
198+
String.join(":", coverageIncludedPackages));
199199

200200
if (jacocoAgent != null && !config.isCiVisibilityCoverageLinesDisabled()) {
201201
// If the module is using Jacoco,

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

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,7 @@
4040
import java.util.ArrayList;
4141
import java.util.Collection;
4242
import java.util.Collections;
43-
import java.util.Iterator;
4443
import java.util.List;
45-
import java.util.stream.Collectors;
4644
import javax.annotation.Nullable;
4745

4846
public class BuildSystemSessionImpl<T extends CoverageCalculator> extends AbstractTestSession
@@ -92,7 +90,10 @@ public BuildSystemSessionImpl(
9290
this.repoIndexProvider = repoIndexProvider;
9391
this.coverageCalculatorFactory = coverageCalculatorFactory;
9492
this.coverageCalculator = coverageCalculatorFactory.sessionCoverage(span.getSpanId());
95-
this.settings = new BuildSessionSettings(getCoverageEnabledPackages(config, repoIndexProvider));
93+
this.settings =
94+
new BuildSessionSettings(
95+
getCoverageIncludedPackages(config, repoIndexProvider),
96+
config.getCiVisibilityCodeCoverageExcludes());
9697

9798
signalServer.registerSignalHandler(
9899
SignalType.MODULE_EXECUTION_RESULT, moduleSignalRouter::onModuleSignalReceived);
@@ -107,48 +108,19 @@ public BuildSystemSessionImpl(
107108
setTag(Tags.TEST_COMMAND, startCommand);
108109
}
109110

110-
private static List<String> getCoverageEnabledPackages(
111+
private static List<String> getCoverageIncludedPackages(
111112
Config config, RepoIndexProvider repoIndexProvider) {
112113
if (!config.isCiVisibilityCodeCoverageEnabled()) {
113114
return Collections.emptyList();
114115
}
115116

116117
List<String> includedPackages = config.getCiVisibilityCodeCoverageIncludes();
117-
List<String> packages;
118118
if (includedPackages != null && !includedPackages.isEmpty()) {
119-
packages = includedPackages;
119+
return new ArrayList<>(includedPackages);
120120
} else {
121121
RepoIndex repoIndex = repoIndexProvider.getIndex();
122-
packages = new ArrayList<>(repoIndex.getRootPackages());
122+
return new ArrayList<>(repoIndex.getRootPackages());
123123
}
124-
125-
List<String> excludedPackages = config.getCiVisibilityCodeCoverageExcludes();
126-
if (excludedPackages != null && !excludedPackages.isEmpty()) {
127-
removeMatchingPackages(packages, excludedPackages);
128-
}
129-
return packages;
130-
}
131-
132-
private static void removeMatchingPackages(List<String> packages, List<String> excludedPackages) {
133-
List<String> excludedPrefixes =
134-
excludedPackages.stream()
135-
.map(BuildSystemSessionImpl::trimTrailingAsterisk)
136-
.collect(Collectors.toList());
137-
Iterator<String> packagesIterator = packages.iterator();
138-
while (packagesIterator.hasNext()) {
139-
String p = packagesIterator.next();
140-
141-
for (String excludedPrefix : excludedPrefixes) {
142-
if (p.startsWith(excludedPrefix)) {
143-
packagesIterator.remove();
144-
break;
145-
}
146-
}
147-
}
148-
}
149-
150-
private static String trimTrailingAsterisk(String s) {
151-
return s.endsWith("*") ? s.substring(0, s.length() - 1) : s;
152124
}
153125

154126
private SignalResponse onRepoIndexRequestReceived(RepoIndexRequest request) {

0 commit comments

Comments
 (0)