Skip to content

Commit 8bb2a4b

Browse files
jandro996claudebric3
authored
Report dd-java-agent itself as a Maven dependency in SCA telemetry (#10975)
* Report dd-java-agent itself as a Maven dependency in SCA telemetry Generate META-INF/maven/com.datadoghq/dd-java-agent/pom.properties at build time so the SCA dependency pipeline (JarReader → DependencyResolver) detects com.datadoghq:dd-java-agent in the APP_DEPENDENCIES_LOADED telemetry events. Add a unit test in DependencyResolverSpecification verifying the resolver correctly parses the generated pom.properties, and extend the AbstractServerSmokeTest tracer-dependency assertion to include com.datadoghq:dd-java-agent so all server smoke tests validate this end-to-end against the real shadow JAR. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Update telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy Co-authored-by: Brice Dutheil <brice.dutheil@gmail.com> * Apply reviewer suggestions - Use built-in Gradle WriteProperties task instead of custom doLast action, which handles inputs/outputs/caching natively - Fix Groovy with{} usage in test: apply it on ZipOutputStream (not ZipEntry as incorrectly suggested in the upstream commit) * Use WriteProperties task and wire srcDir via task provider Use the built-in Gradle WriteProperties task as suggested by bric3. Instead of splitting the output directory into a separate variable and adding an explicit dependsOn (which bric3 did not suggest), derive the srcDir provider from the task itself via generatePomProperties.map{...}. This way Gradle infers the processResources -> generatePomProperties dependency automatically, without extra boilerplate. * spotless * Follow existing pattern for generated resources Follow the same pattern as includedAgentDir/includedJarFileTree: - declare pomPropertiesDir and pomPropertiesFileTree near the top - add dependsOn(pomPropertiesFileTree) to processResources - declare main.resources.srcDir(pomPropertiesDir) in the sourceSets block - register generatePomProperties (WriteProperties) near generateAgentJarIndex - wire pomPropertiesFileTree.builtBy(generatePomProperties) This avoids the need for a task-provider-mapped srcDir since WriteProperties outputs a single file (not a directory), so the fileTree + builtBy approach is the correct way to express the dependency. * Combine srcDirs as suggested by reviewer Replace two separate srcDir calls with a single srcDirs(includedAgentDir, pomPropertiesDir) as suggested by bric3. * Keep original srcDir and add srcDirs per reviewer diff * Fix duplicate srcDir causing processResources failure includedAgentDir was registered twice — once via srcDir and again inside srcDirs. Replace both with a single srcDirs call. * Fix implicit dependency on generatePomProperties from sourcesJar sourcesJar includes main.resources srcDirs (including pomPropertiesDir) but had no dependency on generatePomProperties. Add explicit dependsOn(pomPropertiesFileTree) consistent with the processResources wiring. * chore: trigger CI --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Brice Dutheil <brice.dutheil@gmail.com>
1 parent daa425b commit 8bb2a4b

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

dd-java-agent/build.gradle

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,16 @@ configurations {
1919
def includedAgentDir = project.layout.buildDirectory.dir("generated/included")
2020
def includedJarFileTree = fileTree(includedAgentDir)
2121

22+
def pomPropertiesDir = project.layout.buildDirectory.dir("generated/maven-metadata")
23+
def pomPropertiesFileTree = fileTree(pomPropertiesDir)
24+
2225
tasks.named("processResources") {
2326
dependsOn(includedJarFileTree)
27+
dependsOn(pomPropertiesFileTree)
28+
}
29+
30+
tasks.named("sourcesJar") {
31+
dependsOn(pomPropertiesFileTree)
2432
}
2533

2634
sourceSets {
@@ -33,7 +41,7 @@ sourceSets {
3341
"main_java11" {
3442
java.srcDirs "${project.projectDir}/src/main/java11"
3543
}
36-
main.resources.srcDir(includedAgentDir)
44+
main.resources.srcDirs(includedAgentDir, pomPropertiesDir)
3745
}
3846

3947
def java6CompileTask = tasks.named("compileMain_java6Java") {
@@ -324,6 +332,14 @@ def generateAgentJarIndex = tasks.register('generateAgentJarIndex', JavaExec) {
324332
}
325333
sourceSets.main.resources.srcDir(generateAgentJarIndex)
326334

335+
def generatePomProperties = tasks.register('generatePomProperties', WriteProperties) {
336+
destinationFile = pomPropertiesDir.map { it.file("META-INF/maven/com.datadoghq/dd-java-agent/pom.properties") }
337+
property("groupId", "com.datadoghq")
338+
property("artifactId", "dd-java-agent")
339+
property("version", project.providers.provider { project.version.toString() })
340+
}
341+
pomPropertiesFileTree.builtBy(generatePomProperties)
342+
327343
subprojects { Project subProj ->
328344
// Don't need javadoc task run for internal projects.
329345
subProj.tasks.withType(Javadoc).configureEach { enabled = false }

dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractServerSmokeTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ abstract class AbstractServerSmokeTest extends AbstractSmokeTest {
183183

184184
and: 'received tracer dependencies'
185185
// Not exhaustive list of tracer dependencies.
186-
Set<String> missingDependencyNames = ['com.github.jnr:jnr-ffi', 'net.bytebuddy:byte-buddy-agent',].toSet()
186+
Set<String> missingDependencyNames = ['com.datadoghq:dd-java-agent', 'com.github.jnr:jnr-ffi', 'net.bytebuddy:byte-buddy-agent',].toSet()
187187
missingDependencyNames.removeAll(dependencyNames) || true
188188
missingDependencyNames.isEmpty()
189189

telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,26 @@ class DependencyResolverSpecification extends DepSpecification {
9595
)
9696
}
9797

98+
void 'jar with dd-java-agent pom.properties resolves to com.datadoghq:dd-java-agent'() {
99+
given: 'a jar containing META-INF/maven/com.datadoghq/dd-java-agent/pom.properties'
100+
File file = new File(testDir, 'dd-java-agent.jar')
101+
new ZipOutputStream(new FileOutputStream(file)).with {
102+
putNextEntry(new ZipEntry('META-INF/maven/com.datadoghq/dd-java-agent/pom.properties'))
103+
write('groupId=com.datadoghq\nartifactId=dd-java-agent\nversion=1.0.0\n'.getBytes('UTF-8'))
104+
closeEntry()
105+
close()
106+
}
107+
108+
when:
109+
List<Dependency> deps = DependencyResolver.resolve(file.toURI())
110+
111+
then:
112+
deps.size() == 1
113+
deps[0].name == 'com.datadoghq:dd-java-agent'
114+
deps[0].version == '1.0.0'
115+
deps[0].hash == null
116+
}
117+
98118
void 'jar without manifest and no version in filename gets resolved'() {
99119
// If no manifest info and no suitable file name - calculate sha1 hash
100120
knownJarCheck(

0 commit comments

Comments
 (0)