Skip to content

Commit e0914eb

Browse files
jandro996devflow.devflow-routing-intake
andauthored
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) Merge branch 'master' into alejandro.gonzalez/APPSEC-61920 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 Merge branch 'master' into alejandro.gonzalez/APPSEC-61920 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. Merge branch 'master' into alejandro.gonzalez/APPSEC-61920 Merge branch 'master' into alejandro.gonzalez/APPSEC-61920 chore: trigger CI Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent 860047f commit e0914eb

3 files changed

Lines changed: 38 additions & 2 deletions

File tree

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)