From f34cb203d4ca87a078c5982b6f05d929a27a69a2 Mon Sep 17 00:00:00 2001 From: "alejandro.gonzalez" Date: Thu, 26 Mar 2026 11:02:54 +0100 Subject: [PATCH] Report dd-java-agent itself as a Maven dependency in SCA telemetry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- dd-java-agent/build.gradle | 12 +++++++++++ .../smoketest/AbstractServerSmokeTest.groovy | 2 +- .../DependencyResolverSpecification.groovy | 20 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/build.gradle b/dd-java-agent/build.gradle index a34b233cea9..e422b38bd1b 100644 --- a/dd-java-agent/build.gradle +++ b/dd-java-agent/build.gradle @@ -324,6 +324,18 @@ def generateAgentJarIndex = tasks.register('generateAgentJarIndex', JavaExec) { } sourceSets.main.resources.srcDir(generateAgentJarIndex) +def generatePomProperties = tasks.register('generatePomProperties') { + def outputDir = project.layout.buildDirectory.dir("generated/maven-metadata") + inputs.property("version", project.provider { project.version.toString() }) + outputs.dir(outputDir) + doLast { + def pomPropsFile = outputDir.get().file("META-INF/maven/com.datadoghq/dd-java-agent/pom.properties").asFile + pomPropsFile.parentFile.mkdirs() + pomPropsFile.text = "groupId=com.datadoghq\nartifactId=dd-java-agent\nversion=${project.version}\n" + } +} +sourceSets.main.resources.srcDir(generatePomProperties) + subprojects { Project subProj -> // Don't need javadoc task run for internal projects. subProj.tasks.withType(Javadoc).configureEach { enabled = false } diff --git a/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractServerSmokeTest.groovy b/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractServerSmokeTest.groovy index 19972aae71a..bb1b90304d4 100644 --- a/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractServerSmokeTest.groovy +++ b/dd-smoke-tests/src/main/groovy/datadog/smoketest/AbstractServerSmokeTest.groovy @@ -183,7 +183,7 @@ abstract class AbstractServerSmokeTest extends AbstractSmokeTest { and: 'received tracer dependencies' // Not exhaustive list of tracer dependencies. - Set missingDependencyNames = ['com.github.jnr:jnr-ffi', 'net.bytebuddy:byte-buddy-agent',].toSet() + Set missingDependencyNames = ['com.datadoghq:dd-java-agent', 'com.github.jnr:jnr-ffi', 'net.bytebuddy:byte-buddy-agent',].toSet() missingDependencyNames.removeAll(dependencyNames) || true missingDependencyNames.isEmpty() diff --git a/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy index 4437f1a1c65..fa2a8bfba17 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy @@ -95,6 +95,26 @@ class DependencyResolverSpecification extends DepSpecification { ) } + void 'jar with dd-java-agent pom.properties resolves to com.datadoghq:dd-java-agent'() { + given: 'a jar containing META-INF/maven/com.datadoghq/dd-java-agent/pom.properties' + File file = new File(testDir, 'dd-java-agent.jar') + ZipOutputStream out = new ZipOutputStream(new FileOutputStream(file)) + ZipEntry e = new ZipEntry('META-INF/maven/com.datadoghq/dd-java-agent/pom.properties') + out.putNextEntry(e) + out.write('groupId=com.datadoghq\nartifactId=dd-java-agent\nversion=1.0.0\n'.getBytes('UTF-8')) + out.closeEntry() + out.close() + + when: + List deps = DependencyResolver.resolve(file.toURI()) + + then: + deps.size() == 1 + deps[0].name == 'com.datadoghq:dd-java-agent' + deps[0].version == '1.0.0' + deps[0].hash == null + } + void 'jar without manifest and no version in filename gets resolved'() { // If no manifest info and no suitable file name - calculate sha1 hash knownJarCheck(