diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 33b792627b5..495b959bbac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -53,7 +53,7 @@ variables: BUILD_JOB_NAME: "build" DEPENDENCY_CACHE_POLICY: pull BUILD_CACHE_POLICY: pull - GRADLE_VERSION: "9.7.0" # must match gradle-wrapper.properties + GRADLE_VERSION: "9.7.1" # must match gradle-wrapper.properties MASS_READ_URL: "https://mass-read.us1.ddbuild.io" MAVEN_REPOSITORY_PROXY: "https://depot-read-api-java.us1.ddbuild.io/magicmirror/magicmirror/@current/" GRADLE_PLUGIN_PROXY: "https://depot-read-api-java.us1.ddbuild.io/magicmirror/magicmirror/@current/" diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts index c218e2cd34c..29531d9f156 100644 --- a/build-logic/settings.gradle.kts +++ b/build-logic/settings.gradle.kts @@ -48,4 +48,5 @@ dependencyResolutionManagement { rootProject.name = "build-logic" include(":conventions") +include(":spring-boot-shadow") include(":smoke-test") diff --git a/build-logic/spring-boot-shadow/build.gradle.kts b/build-logic/spring-boot-shadow/build.gradle.kts new file mode 100644 index 00000000000..579111ec851 --- /dev/null +++ b/build-logic/spring-boot-shadow/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + `kotlin-dsl` +} + +// Shadow 9's plugin API targets Java 17, so keep it isolated from Java 8 build-logic modules. +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +kotlin { + compilerOptions { + jvmTarget.set(org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_17) + } +} + +dependencies { + implementation("com.gradleup.shadow:shadow-gradle-plugin:${libs.versions.shadow.get()}") +} diff --git a/build-logic/spring-boot-shadow/src/main/kotlin/dd-trace-java.spring-boot-shadow-jar.gradle.kts b/build-logic/spring-boot-shadow/src/main/kotlin/dd-trace-java.spring-boot-shadow-jar.gradle.kts new file mode 100644 index 00000000000..1d807f45e21 --- /dev/null +++ b/build-logic/spring-boot-shadow/src/main/kotlin/dd-trace-java.spring-boot-shadow-jar.gradle.kts @@ -0,0 +1,36 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer + +plugins { + id("com.gradleup.shadow") +} + +tasks.withType().configureEach { + if (name == "shadowJar") { + // `configurations` is left at its convention, which the Shadow plugin already sets to + // `runtimeClasspath`; adding it again is a no-op because the property is a `SetProperty`. + + // Spring discovery metadata can occur in multiple dependency jars. With enhanced graph + // ordering, keeping only the first duplicate may omit required registrations. + duplicatesStrategy = DuplicatesStrategy.INCLUDE + mergeServiceFiles() + append("META-INF/spring.handlers") + append("META-INF/spring.schemas") + append("META-INF/spring.tooling") + transform(PropertiesFileTransformer::class.java) { + paths.set(listOf("META-INF/spring.factories")) + mergeStrategy.set(PropertiesFileTransformer.MergeStrategy.Append) + } + filesNotMatching( + listOf( + "META-INF/services/**", + "META-INF/spring.handlers", + "META-INF/spring.schemas", + "META-INF/spring.tooling", + "META-INF/spring.factories", + ) + ) { + duplicatesStrategy = DuplicatesStrategy.EXCLUDE + } + } +} diff --git a/components/http/http-api/build.gradle.kts b/components/http/http-api/build.gradle.kts index a3b5b4bce0c..9ae842817ac 100644 --- a/components/http/http-api/build.gradle.kts +++ b/components/http/http-api/build.gradle.kts @@ -28,5 +28,21 @@ dependencies { // testRuntimeOnly(project(":components:http:http-lib-jdk")) // testRuntimeOnly(project(":components:http:http-lib-okhttp")) // Add MockServer for test fixtures - testFixturesImplementation("org.mock-server:mockserver-junit-jupiter-no-dependencies:5.14.0") + // Avoid mockserver-junit-jupiter-no-dependencies: its embedded JUnit classes can shadow ours. + testFixturesImplementation(libs.junit.jupiter) + // DO NOT BUMP THIS VERSION WITHOUT CHECKING THE JAR CONTENTS. + // + // The `-no-dependencies` artifacts relocate most of their dependencies under `shaded_package`, + // but leave `org.slf4j` unrelocated. That jar sorts ahead of `slf4j-api` on the test runtime + // classpath, so whichever slf4j API it embeds is the one that gets loaded: + // * 5.14.0 embeds the slf4j 1.7 API, which matches the slf4j-api version used here, and + // ships no binding of its own, so logback-classic still binds normally. + // * 5.15.0 embeds the slf4j 2.0 API plus a + // `META-INF/services/org.slf4j.spi.SLF4JServiceProvider` pointing at + // `org.slf4j.jul.JULServiceProvider`. slf4j 2.0 ignores logback 1.2's + // `org.slf4j.impl.StaticLoggerBinder`, so test logging silently reroutes to JUL. + // + // Switching to the non-shaded `org.mock-server:mockserver-netty` would remove the hazard + // entirely by letting Gradle arbitrate slf4j, at the cost of many transitives. + testFixturesImplementation("org.mock-server:mockserver-netty-no-dependencies:5.14.0") } diff --git a/components/http/http-api/gradle.lockfile b/components/http/http-api/gradle.lockfile index bb9ff39023b..9eeb0ca787f 100644 --- a/components/http/http-api/gradle.lockfile +++ b/components/http/http-api/gradle.lockfile @@ -26,7 +26,7 @@ org.apache.commons:commons-lang3:3.20.0=spotbugs org.apache.commons:commons-text:1.15.0=spotbugs org.apache.logging.log4j:log4j-api:2.26.1=spotbugs org.apache.logging.log4j:log4j-core:2.26.1=spotbugs -org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath +org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath,testFixturesCompileClasspath org.codehaus.groovy:groovy-ant:3.0.23=codenarc org.codehaus.groovy:groovy-docgenerator:3.0.23=codenarc org.codehaus.groovy:groovy-groovydoc:3.0.23=codenarc @@ -44,19 +44,19 @@ org.jacoco:org.jacoco.agent:0.8.15=jacocoAgent,jacocoAnt org.jacoco:org.jacoco.ant:0.8.15=jacocoAnt org.jacoco:org.jacoco.core:0.8.15=jacocoAnt org.jacoco:org.jacoco.report:0.8.15=jacocoAnt -org.junit.jupiter:junit-jupiter-api:5.14.1=testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-engine:5.14.1=testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.14.1=testCompileClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.14.1=testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.14.1=testCompileClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.14.1=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.14.1=testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.14.1=testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.14.1=testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.14.1=testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.14.1=testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.14.1=testCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath org.junit.platform:junit-platform-launcher:1.14.1=testRuntimeClasspath -org.junit:junit-bom:5.14.1=testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.14.1=testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath org.junit:junit-bom:6.1.2=spotbugs -org.mock-server:mockserver-junit-jupiter-no-dependencies:5.14.0=testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.mock-server:mockserver-netty-no-dependencies:5.14.0=testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath org.mockito:mockito-core:4.4.0=testRuntimeClasspath org.objenesis:objenesis:3.3=testCompileClasspath,testRuntimeClasspath -org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testFixturesCompileClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath org.ow2.asm:asm-analysis:9.10.1=spotbugs org.ow2.asm:asm-commons:9.10.1=jacocoAnt,spotbugs org.ow2.asm:asm-tree:9.10.1=jacocoAnt,spotbugs diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java index 30c2df16168..d02535a910a 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientAsyncTest.java @@ -20,7 +20,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockserver.integration.ClientAndServer; -import org.mockserver.junit.jupiter.MockServerExtension; @ExtendWith(MockServerExtension.class) public class HttpClientAsyncTest { diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java index 811ed742723..256efa891dd 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpClientTest.java @@ -14,7 +14,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockserver.integration.ClientAndServer; -import org.mockserver.junit.jupiter.MockServerExtension; @ExtendWith(MockServerExtension.class) public class HttpClientTest { diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java index 2bfde756dcc..b4f6eae92d7 100644 --- a/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/HttpResponseTest.java @@ -18,7 +18,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockserver.integration.ClientAndServer; -import org.mockserver.junit.jupiter.MockServerExtension; @ExtendWith(MockServerExtension.class) public class HttpResponseTest { diff --git a/components/http/http-api/src/testFixtures/java/datadog/http/client/MockServerExtension.java b/components/http/http-api/src/testFixtures/java/datadog/http/client/MockServerExtension.java new file mode 100644 index 00000000000..5ca83b2c8e8 --- /dev/null +++ b/components/http/http-api/src/testFixtures/java/datadog/http/client/MockServerExtension.java @@ -0,0 +1,45 @@ +package datadog.http.client; + +import static org.mockserver.integration.ClientAndServer.startClientAndServer; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; + +/** Minimal JUnit lifecycle adapter for the shaded MockServer server artifact. */ +public final class MockServerExtension + implements ParameterResolver, BeforeAllCallback, AfterAllCallback { + private ClientAndServer server; + + @Override + public void beforeAll(ExtensionContext context) { + this.server = startClientAndServer(0); + } + + @Override + public boolean supportsParameter( + ParameterContext parameterContext, ExtensionContext extensionContext) { + return MockServerClient.class.isAssignableFrom(parameterContext.getParameter().getType()); + } + + @Override + public Object resolveParameter( + ParameterContext parameterContext, ExtensionContext extensionContext) { + if (this.server == null) { + throw new ParameterResolutionException("MockServer has not been started"); + } + return this.server; + } + + @Override + public void afterAll(ExtensionContext context) { + if (this.server != null && this.server.isRunning()) { + this.server.stop(); + } + } +} diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/build.gradle b/dd-java-agent/instrumentation/liberty/liberty-20.0/build.gradle index 96eec5c67d4..8268a59b4d0 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/build.gradle +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/build.gradle @@ -40,6 +40,8 @@ dependencies { testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') testRuntimeOnly project(':dd-java-agent:instrumentation:osgi-4.3') testRuntimeOnly files(filterLogbackClassic.map { it.destinationDir }) + // Keep shared classloader naming and multipart hooks under test without duplicating them. + testRuntimeOnly project(':dd-java-agent:instrumentation:liberty:liberty-common') testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0') testImplementation(libs.groovy.xml) diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestFinishInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestFinishInstrumentation.java index a254cf8d92c..e5ec1be57ef 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestFinishInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/RequestFinishInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.liberty20; +import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_CONTEXT_ATTRIBUTE; @@ -16,10 +17,14 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumenterModule.class) public class RequestFinishInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + implements Instrumenter.ForSingleType, + Instrumenter.WithTypeStructure, + Instrumenter.HasMethodAdvice { public RequestFinishInstrumentation() { super("liberty"); @@ -42,6 +47,12 @@ public String instrumentedType() { return "com.ibm.ws.webcontainer.srt.SRTServletRequest"; } + @Override + public ElementMatcher structureMatcher() { + // Liberty keeps this class name across the javax-to-jakarta servlet migration. + return implementsInterface(named("javax.servlet.http.HttpServletRequest")); + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ResponseFinishInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ResponseFinishInstrumentation.java index 7debc6f3a31..56d4ef467a7 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ResponseFinishInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ResponseFinishInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.liberty20; +import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_CONTEXT_ATTRIBUTE; @@ -18,6 +19,8 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; /** * XXX: {@link SRTServletResponse#finish()} is not appropriate method to look at the response @@ -28,7 +31,9 @@ */ @AutoService(InstrumenterModule.class) public class ResponseFinishInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + implements Instrumenter.ForSingleType, + Instrumenter.WithTypeStructure, + Instrumenter.HasMethodAdvice { public ResponseFinishInstrumentation() { super("liberty"); @@ -51,6 +56,12 @@ public String instrumentedType() { return "com.ibm.ws.webcontainer.srt.SRTServletResponse"; } + @Override + public ElementMatcher structureMatcher() { + // Liberty keeps this class name across the javax-to-jakarta servlet migration. + return implementsInterface(named("javax.servlet.http.HttpServletResponse")); + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/build.gradle b/dd-java-agent/instrumentation/liberty/liberty-23.0/build.gradle index ec21a6a21d3..95d607add98 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/build.gradle +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/build.gradle @@ -45,7 +45,8 @@ dependencies { testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') testRuntimeOnly project(':dd-java-agent:instrumentation:osgi-4.3') testRuntimeOnly files(filterLogbackClassic.map { it.destinationDir }) - testRuntimeOnly project(':dd-java-agent:instrumentation:liberty:liberty-20.0') + // Reuse shared classloader naming and multipart hooks without loading javax instrumentation. + testRuntimeOnly project(':dd-java-agent:instrumentation:liberty:liberty-common') testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:jakarta-servlet-5.0') testRuntimeOnly files(shadowJar.map { it.archiveFile }) diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestFinishInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestFinishInstrumentation.java index 1e4aed9bd66..ca6b501a9a0 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestFinishInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/RequestFinishInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.liberty23; +import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_CONTEXT_ATTRIBUTE; @@ -16,10 +17,14 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumenterModule.class) public class RequestFinishInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + implements Instrumenter.ForSingleType, + Instrumenter.WithTypeStructure, + Instrumenter.HasMethodAdvice { public RequestFinishInstrumentation() { super("liberty"); @@ -42,6 +47,12 @@ public String instrumentedType() { return "com.ibm.ws.webcontainer.srt.SRTServletRequest"; } + @Override + public ElementMatcher structureMatcher() { + // Liberty keeps this class name across the javax-to-jakarta servlet migration. + return implementsInterface(named("jakarta.servlet.http.HttpServletRequest")); + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/ResponseFinishInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/ResponseFinishInstrumentation.java index 500d6ac9545..9980f24db23 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/ResponseFinishInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-23.0/src/main/java/datadog/trace/instrumentation/liberty23/ResponseFinishInstrumentation.java @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.liberty23; +import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentSpan.fromContext; import static datadog.trace.bootstrap.instrumentation.decorator.HttpServerDecorator.DD_CONTEXT_ATTRIBUTE; @@ -18,6 +19,8 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; /** * XXX: {@link SRTServletResponse#finish()} is not appropriate method to look at the response @@ -28,7 +31,9 @@ */ @AutoService(InstrumenterModule.class) public class ResponseFinishInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + implements Instrumenter.ForSingleType, + Instrumenter.WithTypeStructure, + Instrumenter.HasMethodAdvice { public ResponseFinishInstrumentation() { super("liberty"); @@ -51,6 +56,12 @@ public String instrumentedType() { return "com.ibm.ws.webcontainer.srt.SRTServletResponse"; } + @Override + public ElementMatcher structureMatcher() { + // Liberty keeps this class name across the javax-to-jakarta servlet migration. + return implementsInterface(named("jakarta.servlet.http.HttpServletResponse")); + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/liberty/liberty-common/build.gradle b/dd-java-agent/instrumentation/liberty/liberty-common/build.gradle new file mode 100644 index 00000000000..3d48cbcff41 --- /dev/null +++ b/dd-java-agent/instrumentation/liberty/liberty-common/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'dd-trace-java.module.instrumentation' +} diff --git a/dd-java-agent/instrumentation/liberty/liberty-common/gradle.lockfile b/dd-java-agent/instrumentation/liberty/liberty-common/gradle.lockfile new file mode 100644 index 00000000000..1363fcd2a7f --- /dev/null +++ b/dd-java-agent/instrumentation/liberty/liberty-common/gradle.lockfile @@ -0,0 +1,125 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +# To regenerate this file, run: ./gradlew :dd-java-agent:instrumentation:liberty:liberty-common:dependencies --write-locks +cafe.cryptography:curve25519-elisabeth:0.1.0=testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=testRuntimeClasspath +ch.qos.logback:logback-classic:1.2.13=testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-core:1.2.13=testCompileClasspath,testRuntimeClasspath +com.blogspot.mydailyjava:weak-lock-free:0.17=buildTimeInstrumentationPlugin,compileClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-instrument-java:0.0.4=buildTimeInstrumentationPlugin,compileClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=buildTimeInstrumentationPlugin,compileClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.5=testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.6=codenarc +com.github.jnr:jffi:1.3.15=testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.20=testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.19=testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.22=testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.25=testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.10.3=compileClasspath,spotbugs +com.github.spotbugs:spotbugs:4.10.3=spotbugs +com.github.stephenc.jcip:jcip-annotations:1.0-1=spotbugs +com.google.auto.service:auto-service-annotations:1.1.1=annotationProcessor,compileClasspath,testAnnotationProcessor,testCompileClasspath +com.google.auto.service:auto-service:1.1.1=annotationProcessor,testAnnotationProcessor +com.google.auto:auto-common:1.2.1=annotationProcessor,testAnnotationProcessor +com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,spotbugs,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath +com.google.code.gson:gson:2.14.0=spotbugs +com.google.errorprone:error_prone_annotations:2.18.0=annotationProcessor,testAnnotationProcessor +com.google.errorprone:error_prone_annotations:2.47.0=testCompileClasspath,testRuntimeClasspath +com.google.errorprone:error_prone_annotations:2.48.0=spotbugs +com.google.guava:failureaccess:1.0.1=annotationProcessor,testAnnotationProcessor +com.google.guava:failureaccess:1.0.3=testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:32.0.1-jre=annotationProcessor,testAnnotationProcessor +com.google.guava:guava:33.6.0-jre=testCompileClasspath,testRuntimeClasspath +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath +com.google.j2objc:j2objc-annotations:2.8=annotationProcessor,testAnnotationProcessor +com.google.j2objc:j2objc-annotations:3.1=testCompileClasspath,testRuntimeClasspath +com.google.re2j:re2j:1.8=testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=testCompileClasspath,testRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:3.12.12=testCompileClasspath,testRuntimeClasspath +com.squareup.okhttp3:okhttp:3.12.12=testCompileClasspath,testRuntimeClasspath +com.squareup.okio:okio:1.17.5=testCompileClasspath,testRuntimeClasspath +com.thoughtworks.qdox:qdox:1.12.1=codenarc +commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testRuntimeClasspath +commons-io:commons-io:2.11.0=testCompileClasspath,testRuntimeClasspath +commons-io:commons-io:2.21.0=spotbugs +de.thetaphi:forbiddenapis:3.10=compileClasspath,testCompileClasspath,testRuntimeClasspath +io.leangen.geantyref:geantyref:1.3.16=testRuntimeClasspath +io.sqreen:libsqreen:17.5.0=testRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=testCompileClasspath,testRuntimeClasspath +jaxen:jaxen:2.0.6=spotbugs +junit:junit:4.13.2=testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.18.10=buildTimeInstrumentationPlugin,compileClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.18.10=buildTimeInstrumentationPlugin,compileClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=testRuntimeClasspath +net.sf.saxon:Saxon-HE:12.10=spotbugs +org.apache.ant:ant-antlr:1.10.14=codenarc +org.apache.ant:ant-junit:1.10.14=codenarc +org.apache.bcel:bcel:6.12.0=spotbugs +org.apache.commons:commons-lang3:3.20.0=spotbugs +org.apache.commons:commons-text:1.15.0=spotbugs +org.apache.logging.log4j:log4j-api:2.26.1=spotbugs +org.apache.logging.log4j:log4j-core:2.26.1=spotbugs +org.apiguardian:apiguardian-api:1.1.2=testCompileClasspath +org.checkerframework:checker-qual:3.33.0=annotationProcessor,testAnnotationProcessor +org.codehaus.groovy:groovy-ant:3.0.23=codenarc +org.codehaus.groovy:groovy-docgenerator:3.0.23=codenarc +org.codehaus.groovy:groovy-groovydoc:3.0.23=codenarc +org.codehaus.groovy:groovy-json:3.0.23=codenarc +org.codehaus.groovy:groovy-json:3.0.25=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-templates:3.0.23=codenarc +org.codehaus.groovy:groovy-xml:3.0.23=codenarc +org.codehaus.groovy:groovy:3.0.23=codenarc +org.codehaus.groovy:groovy:3.0.25=testCompileClasspath,testRuntimeClasspath +org.codenarc:CodeNarc:3.7.0=codenarc +org.dom4j:dom4j:2.2.0=spotbugs +org.gmetrics:GMetrics:2.1.0=codenarc +org.hamcrest:hamcrest-core:1.3=testRuntimeClasspath +org.hamcrest:hamcrest:3.0=testCompileClasspath,testRuntimeClasspath +org.jctools:jctools-core-jdk11:4.0.6=testRuntimeClasspath +org.jctools:jctools-core:4.0.6=testRuntimeClasspath +org.jspecify:jspecify:1.0.0=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.14.1=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.14.1=testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.14.1=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.14.1=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.14.1=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.14.1=testCompileClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.14.1=testRuntimeClasspath +org.junit.platform:junit-platform-runner:1.14.1=testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.14.1=testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.14.1=testRuntimeClasspath +org.junit:junit-bom:5.14.1=testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:6.1.2=spotbugs +org.mockito:mockito-core:4.4.0=testRuntimeClasspath +org.objenesis:objenesis:3.3=testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=testCompileClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.10.1=spotbugs +org.ow2.asm:asm-analysis:9.7.1=testRuntimeClasspath +org.ow2.asm:asm-commons:9.10.1=spotbugs,testRuntimeClasspath +org.ow2.asm:asm-tree:9.10.1=spotbugs,testRuntimeClasspath +org.ow2.asm:asm-util:9.10.1=spotbugs +org.ow2.asm:asm-util:9.7.1=testRuntimeClasspath +org.ow2.asm:asm:9.10.1=buildTimeInstrumentationPlugin,compileClasspath,muzzleTooling,runtimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +org.slf4j:jcl-over-slf4j:1.7.30=testCompileClasspath,testRuntimeClasspath +org.slf4j:jul-to-slf4j:1.7.30=testCompileClasspath,testRuntimeClasspath +org.slf4j:log4j-over-slf4j:1.7.30=testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:1.7.30=buildTimeInstrumentationPlugin,compileClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath +org.slf4j:slf4j-api:1.7.32=testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:2.0.17=spotbugsSlf4j +org.slf4j:slf4j-api:2.0.18=spotbugs +org.slf4j:slf4j-simple:2.0.17=spotbugsSlf4j +org.snakeyaml:snakeyaml-engine:2.9=buildTimeInstrumentationPlugin,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.spockframework:spock-bom:2.4-groovy-3.0=testCompileClasspath,testRuntimeClasspath +org.spockframework:spock-core:2.4-groovy-3.0=testCompileClasspath,testRuntimeClasspath +org.tabletest:tabletest-junit:1.2.2=testCompileClasspath,testRuntimeClasspath +org.tabletest:tabletest-parser:1.2.1=testCompileClasspath,testRuntimeClasspath +org.xmlresolver:xmlresolver:5.3.3=spotbugs +empty=spotbugsPlugins diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/BundleNameHelper.java b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/BundleNameHelper.java similarity index 57% rename from dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/BundleNameHelper.java rename to dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/BundleNameHelper.java index 6acbed6647b..abea50fddf8 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/BundleNameHelper.java +++ b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/BundleNameHelper.java @@ -1,12 +1,9 @@ -package datadog.trace.instrumentation.liberty20; - -import com.ibm.ws.classloading.internal.ThreadContextClassLoader; +package datadog.trace.instrumentation.liberty; public class BundleNameHelper { private BundleNameHelper() {} - public static String extractDeploymentName(final ThreadContextClassLoader classLoader) { - final String id = classLoader.getKey(); + public static String extractDeploymentName(final String id) { // id is something like :name#somethingelse final int head = id.indexOf(':'); if (head < 0) { diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/GetPartsInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/GetPartsInstrumentation.java similarity index 93% rename from dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/GetPartsInstrumentation.java rename to dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/GetPartsInstrumentation.java index 102c70acd98..358d6a23a8d 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/GetPartsInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/GetPartsInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.liberty20; +package datadog.trace.instrumentation.liberty; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.api.gateway.Events.EVENTS; @@ -33,6 +33,7 @@ public GetPartsInstrumentation() { @Override public String[] knownMatchingTypes() { + // These IBM request implementations are shared by the javax and jakarta Liberty generations. return new String[] { "com.ibm.ws.webcontainer.srt.SRTServletRequest", "com.ibm.ws.webcontainer31.srt.SRTServletRequest31", @@ -41,7 +42,7 @@ public String[] knownMatchingTypes() { @Override public String[] helperClassNames() { - return new String[] {"datadog.trace.instrumentation.liberty20.PartHelper"}; + return new String[] {"datadog.trace.instrumentation.liberty.PartHelper"}; } @Override diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/PartHelper.java b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/PartHelper.java similarity index 97% rename from dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/PartHelper.java rename to dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/PartHelper.java index 5fb6e4403dc..f9ee703ab02 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/PartHelper.java +++ b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/PartHelper.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.liberty20; +package datadog.trace.instrumentation.liberty; import de.thetaphi.forbiddenapis.SuppressForbidden; import java.lang.reflect.Method; diff --git a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/ThreadContextClassloaderInstrumentation.java similarity index 58% rename from dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java rename to dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/ThreadContextClassloaderInstrumentation.java index 33f1641afb5..fed6048a221 100644 --- a/dd-java-agent/instrumentation/liberty/liberty-20.0/src/main/java/datadog/trace/instrumentation/liberty20/ThreadContextClassloaderInstrumentation.java +++ b/dd-java-agent/instrumentation/liberty/liberty-common/src/main/java/datadog/trace/instrumentation/liberty/ThreadContextClassloaderInstrumentation.java @@ -1,17 +1,23 @@ -package datadog.trace.instrumentation.liberty20; +package datadog.trace.instrumentation.liberty; +import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.declaresField; +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.fieldType; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import com.google.auto.service.AutoService; -import com.ibm.ws.classloading.internal.ThreadContextClassLoader; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; import datadog.trace.api.ClassloaderConfigurationOverrides; import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumenterModule.class) public class ThreadContextClassloaderInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + implements Instrumenter.ForSingleType, + Instrumenter.WithTypeStructure, + Instrumenter.HasMethodAdvice { private static final String LIBERTY = "liberty"; @@ -24,6 +30,12 @@ public String instrumentedType() { return "com.ibm.ws.classloading.internal.ThreadContextClassLoader"; } + @Override + public ElementMatcher structureMatcher() { + // The class name and deployment key are shared by both supported Liberty generations. + return declaresField(fieldType(String.class).and(named("key"))); + } + @Override public String[] helperClassNames() { return new String[] { @@ -39,8 +51,10 @@ public void methodAdvice(MethodTransformer transformer) { public static class ThreadContextClassloaderAdvice { @Advice.OnMethodExit(suppress = Throwable.class) - public static void afterConstruct(@Advice.This ThreadContextClassLoader self) { - final String name = BundleNameHelper.extractDeploymentName(self); + public static void afterConstruct( + @Advice.This ClassLoader self, @Advice.FieldValue("key") String key) { + // Bind the stable field instead of an OpenLiberty type so this module stays version-neutral. + final String name = BundleNameHelper.extractDeploymentName(key); if (name != null && !name.isEmpty()) { ClassloaderConfigurationOverrides.withPinnedServiceName(self, name); } diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/build.gradle b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/build.gradle index 1728cde9b91..d394e9b4ab8 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/build.gradle +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/build.gradle @@ -23,12 +23,14 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:okhttp:okhttp-3.0') - // Exclude the conflicting dependency to avoid NoSuchFieldError: Class okhttp3.MediaType does not have member field 'okhttp3.MediaType$Companion Companion' + // The Datadog forks have different Maven coordinates but retain the okhttp3 and + // okio packages, so they can shadow the newer upstream classes at test runtime. configurations.testRuntimeClasspath { exclude group: 'com.datadoghq.okhttp3' + exclude group: 'com.datadoghq.okio' } configurations.latestDepTestRuntimeClasspath { exclude group: 'com.datadoghq.okhttp3' + exclude group: 'com.datadoghq.okio' } } - diff --git a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/gradle.lockfile b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/gradle.lockfile index 1985a379756..91300ef8946 100644 --- a/dd-java-agent/instrumentation/openai-java/openai-java-3.0/gradle.lockfile +++ b/dd-java-agent/instrumentation/openai-java/openai-java-3.0/gradle.lockfile @@ -8,7 +8,7 @@ ch.qos.logback:logback-classic:1.2.13=latestDepTestCompileClasspath,latestDepTes ch.qos.logback:logback-core:1.2.13=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath com.blogspot.mydailyjava:weak-lock-free:0.17=buildTimeInstrumentationPlugin,compileClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq.okhttp3:okhttp:3.12.15=latestDepTestCompileClasspath,testCompileClasspath -com.datadoghq.okio:okio:1.17.6=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=latestDepTestCompileClasspath,testCompileClasspath com.datadoghq:dd-instrument-java:0.0.4=buildTimeInstrumentationPlugin,compileClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq:dd-javac-plugin-client:0.2.2=buildTimeInstrumentationPlugin,compileClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath com.datadoghq:java-dogstatsd-client:4.4.5=latestDepTestRuntimeClasspath,testRuntimeClasspath diff --git a/dd-java-agent/instrumentation/quartz-2.0/build.gradle b/dd-java-agent/instrumentation/quartz-2.0/build.gradle index a37d16741b6..404da8bb1cd 100644 --- a/dd-java-agent/instrumentation/quartz-2.0/build.gradle +++ b/dd-java-agent/instrumentation/quartz-2.0/build.gradle @@ -21,8 +21,14 @@ dependencies { testImplementation group: 'org.quartz-scheduler', name: 'quartz', version: '2.0.0' // these dependencies are required for XML configurations when quartz version > 2.2+ + // + // Keep `quartz` pinned to 2.4.0 here. This suite exists to cover the 2.4 line between the 2.0.0 + // baseline in `test` and the floating version in `latestDepTest`; a `+` here resolves to the same + // version as `latestDepTest` and the suite stops testing anything distinct. The pin also decides + // the transaction API: quartz 2.4.0 references `javax.transaction.UserTransaction`, whereas 2.5.0 + // and later moved to `jakarta.transaction.UserTransaction`. version40TestImplementation group: 'org.quartz-scheduler', name: 'quartz-jobs', version: '2.4.0' - version40TestImplementation group: 'org.quartz-scheduler', name: 'quartz', version: '+' + version40TestImplementation group: 'org.quartz-scheduler', name: 'quartz', version: '2.4.0' version40TestImplementation group: 'javax.transaction', name: 'jta', version: '1.1' latestDepTestImplementation group: 'org.quartz-scheduler', name: 'quartz-jobs', version: '+' latestDepTestImplementation group: 'jakarta.transaction', name: 'jakarta.transaction-api', version: '2.0.1' diff --git a/dd-java-agent/instrumentation/quartz-2.0/gradle.lockfile b/dd-java-agent/instrumentation/quartz-2.0/gradle.lockfile index 299beea031e..c8be3207b03 100644 --- a/dd-java-agent/instrumentation/quartz-2.0/gradle.lockfile +++ b/dd-java-agent/instrumentation/quartz-2.0/gradle.lockfile @@ -53,9 +53,9 @@ commons-io:commons-io:2.21.0=spotbugs de.thetaphi:forbiddenapis:3.10=compileClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath io.leangen.geantyref:geantyref:1.3.16=latestDepTestRuntimeClasspath,testRuntimeClasspath,version40TestRuntimeClasspath io.sqreen:libsqreen:17.5.0=latestDepTestRuntimeClasspath,testRuntimeClasspath,version40TestRuntimeClasspath -jakarta.activation:jakarta.activation-api:2.1.4=latestDepTestRuntimeClasspath,version40TestRuntimeClasspath +jakarta.activation:jakarta.activation-api:2.1.4=latestDepTestRuntimeClasspath jakarta.transaction:jakarta.transaction-api:2.0.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath -jakarta.xml.bind:jakarta.xml.bind-api:4.0.4=latestDepTestRuntimeClasspath,version40TestRuntimeClasspath +jakarta.xml.bind:jakarta.xml.bind-api:4.0.4=latestDepTestRuntimeClasspath javax.servlet:javax.servlet-api:3.1.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath javax.transaction:jta:1.1=compileClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath jaxen:jaxen:2.0.6=spotbugs @@ -116,13 +116,15 @@ org.ow2.asm:asm:9.10.1=buildTimeInstrumentationPlugin,compileClasspath,latestDep org.quartz-scheduler:quartz-jobs:2.4.0=version40TestCompileClasspath,version40TestRuntimeClasspath org.quartz-scheduler:quartz-jobs:2.5.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.quartz-scheduler:quartz:2.0.0=compileClasspath,testCompileClasspath,testRuntimeClasspath -org.quartz-scheduler:quartz:2.5.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath +org.quartz-scheduler:quartz:2.4.0=version40TestCompileClasspath,version40TestRuntimeClasspath +org.quartz-scheduler:quartz:2.5.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.slf4j:jcl-over-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath org.slf4j:jul-to-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath org.slf4j:log4j-over-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath,version40TestRuntimeClasspath org.slf4j:slf4j-api:1.7.30=buildTimeInstrumentationPlugin,compileClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath org.slf4j:slf4j-api:1.7.32=latestDepTestCompileClasspath,testCompileClasspath,testRuntimeClasspath,version40TestCompileClasspath -org.slf4j:slf4j-api:2.0.16=latestDepTestRuntimeClasspath,version40TestRuntimeClasspath +org.slf4j:slf4j-api:1.7.36=version40TestRuntimeClasspath +org.slf4j:slf4j-api:2.0.16=latestDepTestRuntimeClasspath org.slf4j:slf4j-api:2.0.17=spotbugsSlf4j org.slf4j:slf4j-api:2.0.18=spotbugs org.slf4j:slf4j-simple:2.0.17=spotbugsSlf4j diff --git a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/build.gradle b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/build.gradle index 9f4c611b9ff..97d0f5a6df9 100644 --- a/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/build.gradle +++ b/dd-java-agent/instrumentation/sofarpc/sofarpc-5.0/build.gradle @@ -31,21 +31,25 @@ dependencies { latestDepTestImplementation group: "com.alipay.sofa", name: "sofa-rpc-all", version: "+" constraints { - // Regression fix for Gradle 9.6.0 (should be fixed in 9.7.0) + // `sofa-rpc-all:5.14.2` brings `netty-all:4.1.44.Final`, a fat jar carrying the classes of + // every netty module, while `grpc-netty:1.53.0` brings the individual `netty-*:4.1.79.Final` + // modules. Both supply `io.netty.**` under unrelated coordinates, so Gradle cannot reconcile + // them and whichever jar sorts first wins class loading. // - // The `sofa-rpc-all:5.14.2` brings `netty-all:4.1.44.Final`, which is a fat jar, - // while `grpc-netty:1.53.0` brings individual `netty-*:4.1.79.Final` modules. - // Gradle 9.6.0 introduced a regression in the classpath ordering, as they are - // working on revamping the dependency traversal. The result is that the `4.1.44` - // fat jar classes appear earlier and its classes are loaded from it ; this - // produces a `NoSuchMethodError` at runtime in netty's `AbstractReferenceCountedByteBuf`. + // Forcing 4.1.79 removes the duplicate rather than reordering it: `netty-all` has shipped zero + // classes since 4.1.75, so it becomes an empty aggregator that instead pulls in the complete, + // version-aligned 4.1.79 module set - including the dns/epoll/kqueue/sctp modules that the fat + // jar was otherwise the only source of. // - // The workaround is to force `netty-all` to `4.1.79` so the fat jar and the individual - // modules are aligned on the same version. This should be fixed in 9.7.0 and consequently - // removed from the constraints. - // See https://github.com/gradle/gradle/issues/38057 for more details. + // This is deliberately independent of ENHANCED_GRAPH_ORDERING. That preview only changes where + // the fat jar lands: without it the jar sorts between `netty-buffer` and `netty-common`, so + // `AbstractReferenceCountedByteBuf` (4.1.79) is paired with `ReferenceCountUpdater` (4.1.44) + // and fails with a `NoSuchMethodError`; with it the jar sorts ahead of every modular jar, which + // hides that symptom only because all of netty then silently loads from 4.1.44. Either way the + // classpath still holds two copies of `io.netty.**`, so do not drop this constraint on the + // grounds that the preview is enabled. testImplementation("io.netty:netty-all:4.1.79.Final") { - because "sofa-rpc-all brings netty-all:4.1.44.Final (fat jar) while grpc-netty brings individual netty-*:4.1.79.Final modules; Gradle 9.6.0 classpath ordering regression causes 4.1.44 classes to shadow 4.1.79, producing NoSuchMethodError" + because "netty-all:4.1.44 is a fat jar whose io.netty classes shadow the individual netty-*:4.1.79 modules; netty-all:4.1.79 is class-free and pulls in the aligned module set instead" } } } diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle index 3e3af47ee95..429f6398bd1 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle @@ -72,6 +72,9 @@ addTestSuiteForDir('latestIastTest', 'iastTest') addTestSuiteForDir('latestIast3Test', 'iastTest') configurations { + // Legacy split Hamcrest jars duplicate org.hamcrest classes from the newer hamcrest jar. + iastTestImplementation.exclude group: 'org.hamcrest', module: 'hamcrest-core' + iastTestImplementation.exclude group: 'org.hamcrest', module: 'hamcrest-library' latestIast24TestImplementation.extendsFrom(iastTestImplementation) latestIastTestImplementation.extendsFrom(iastTestImplementation) latestIast3TestImplementation.extendsFrom(iastTestImplementation) diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/gradle.lockfile b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/gradle.lockfile index cd9a707db3c..f41889f987f 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/gradle.lockfile +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/gradle.lockfile @@ -193,8 +193,8 @@ org.codehaus.groovy:groovy:3.0.25=iastTestCompileClasspath,iastTestRuntimeClassp org.codenarc:CodeNarc:3.7.0=codenarc org.dom4j:dom4j:2.2.0=spotbugs org.gmetrics:GMetrics:2.1.0=codenarc -org.hamcrest:hamcrest-core:1.3=iastTestCompileClasspath,iastTestRuntimeClasspath,latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath,latestBoot24TestRuntimeClasspath,latestBoot2LatestTestRuntimeClasspath,latestDepTestRuntimeClasspath,latestIast24TestRuntimeClasspath,latestIast3TestCompileClasspath,latestIast3TestRuntimeClasspath,latestIastTestRuntimeClasspath,testRuntimeClasspath -org.hamcrest:hamcrest-library:1.3=iastTestCompileClasspath,iastTestRuntimeClasspath,latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath,latestIast3TestCompileClasspath,latestIast3TestRuntimeClasspath +org.hamcrest:hamcrest-core:1.3=latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath,latestBoot24TestRuntimeClasspath,latestBoot2LatestTestRuntimeClasspath,latestDepTestRuntimeClasspath,testRuntimeClasspath +org.hamcrest:hamcrest-library:1.3=latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath org.hamcrest:hamcrest:3.0=iastTestCompileClasspath,iastTestRuntimeClasspath,latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath,latestBoot24TestCompileClasspath,latestBoot24TestRuntimeClasspath,latestBoot2LatestTestCompileClasspath,latestBoot2LatestTestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,latestIast24TestCompileClasspath,latestIast24TestRuntimeClasspath,latestIast3TestCompileClasspath,latestIast3TestRuntimeClasspath,latestIastTestCompileClasspath,latestIastTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.hibernate.validator:hibernate-validator:6.0.16.Final=iastTestCompileClasspath,iastTestRuntimeClasspath,latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath,latestIast3TestCompileClasspath,latestIast3TestRuntimeClasspath org.jboss.logging:jboss-logging:3.3.2.Final=iastTestCompileClasspath,iastTestRuntimeClasspath,latestBoot20TestCompileClasspath,latestBoot20TestRuntimeClasspath,latestIast3TestCompileClasspath,latestIast3TestRuntimeClasspath diff --git a/dd-smoke-tests/appsec/springboot-graphql/build.gradle b/dd-smoke-tests/appsec/springboot-graphql/build.gradle index 81f658e380e..e5f411e204b 100644 --- a/dd-smoke-tests/appsec/springboot-graphql/build.gradle +++ b/dd-smoke-tests/appsec/springboot-graphql/build.gradle @@ -1,8 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -16,27 +15,6 @@ jar { } } -shadowJar { - duplicatesStrategy = DuplicatesStrategy.INCLUDE - mergeServiceFiles() - append 'META-INF/spring.handlers' - append 'META-INF/spring.schemas' - append 'META-INF/spring.tooling' - transform(PropertiesFileTransformer) { - paths = ['META-INF/spring.factories'] - mergeStrategy = "append" - } - filesNotMatching([ - 'META-INF/services/**', - 'META-INF/spring.handlers', - 'META-INF/spring.schemas', - 'META-INF/spring.tooling', - 'META-INF/spring.factories', - ]) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - } -} - // Use Java 11 to build application tasks.withType(JavaCompile).configureEach { configureCompiler(it, 11, JavaVersion.VERSION_1_8) diff --git a/dd-smoke-tests/appsec/springboot/build.gradle b/dd-smoke-tests/appsec/springboot/build.gradle index cef43d450b5..aab81c8d4e7 100644 --- a/dd-smoke-tests/appsec/springboot/build.gradle +++ b/dd-smoke-tests/appsec/springboot/build.gradle @@ -17,6 +17,11 @@ tasks.named("jar", Jar) { dependencies { implementation project(':dd-trace-api') + // This AppSec fixture relies on the legacy first-file Spring factories behavior: merging the + // complete factory set changes its request/error handling and breaks the blocking assertions. + // Keep autoconfigure direct and ahead of spring-boot-starter-web so enhanced graph ordering + // selects the same META-INF/spring.factories file as before. + implementation group: 'org.springframework.boot', name: 'spring-boot-autoconfigure', version: '2.6.0' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.6.0' implementation(group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.6.0') implementation group: 'com.h2database', name: 'h2', version: '2.1.212' diff --git a/dd-smoke-tests/debugger-integration-tests/build.gradle b/dd-smoke-tests/debugger-integration-tests/build.gradle index 80f7715598c..1f62017225b 100644 --- a/dd-smoke-tests/debugger-integration-tests/build.gradle +++ b/dd-smoke-tests/debugger-integration-tests/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -53,4 +53,3 @@ tasks.withType(Test).configureEach { } }) } - diff --git a/dd-smoke-tests/gradle/src/test/resources/latest-tool-versions.properties b/dd-smoke-tests/gradle/src/test/resources/latest-tool-versions.properties index 0560b87f752..8529c2e4167 100644 --- a/dd-smoke-tests/gradle/src/test/resources/latest-tool-versions.properties +++ b/dd-smoke-tests/gradle/src/test/resources/latest-tool-versions.properties @@ -1,6 +1,6 @@ # Pinned latest eligible stable versions (>=48h old) for CI Visibility Gradle smoke tests. # Updated automatically by the update-smoke-test-latest-versions workflow. -gradle.latest=9.7.0 +gradle.latest=9.7.1 # Latest eligible stable patch per Gradle major release. Used to resolve the "oldest" smoke-test # Gradle version (the latest patch of the oldest major the current TestKit supports). gradle.latest.3=3.5.1 @@ -9,4 +9,4 @@ gradle.latest.5=5.6.4 gradle.latest.6=6.9.4 gradle.latest.7=7.6.6 gradle.latest.8=8.14.5 -gradle.latest.9=9.7.0 +gradle.latest.9=9.7.1 diff --git a/dd-smoke-tests/iast-propagation/build.gradle b/dd-smoke-tests/iast-propagation/build.gradle index b1b3f7fd40d..9682a5038bf 100644 --- a/dd-smoke-tests/iast-propagation/build.gradle +++ b/dd-smoke-tests/iast-propagation/build.gradle @@ -3,7 +3,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'java' id 'org.jetbrains.kotlin.jvm' id 'scala' @@ -29,10 +29,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) -} - dependencies { implementation project(':dd-trace-api') implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.5.4' diff --git a/dd-smoke-tests/spring-boot-2.3-webmvc-jetty/build.gradle b/dd-smoke-tests/spring-boot-2.3-webmvc-jetty/build.gradle index 8ffaf3c97b1..0925fd7de85 100644 --- a/dd-smoke-tests/spring-boot-2.3-webmvc-jetty/build.gradle +++ b/dd-smoke-tests/spring-boot-2.3-webmvc-jetty/build.gradle @@ -1,8 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -16,28 +15,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) - duplicatesStrategy = DuplicatesStrategy.INCLUDE - mergeServiceFiles() - append 'META-INF/spring.handlers' - append 'META-INF/spring.schemas' - append 'META-INF/spring.tooling' - transform(PropertiesFileTransformer) { - paths = ['META-INF/spring.factories'] - mergeStrategy = "append" - } - filesNotMatching([ - 'META-INF/services/**', - 'META-INF/spring.handlers', - 'META-INF/spring.schemas', - 'META-INF/spring.tooling', - 'META-INF/spring.factories', - ]) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - } -} - dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.3.1.RELEASE' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-jetty', version: '2.3.1.RELEASE' diff --git a/dd-smoke-tests/spring-boot-2.4-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.4-webflux/build.gradle index c1d8802df95..cbbd15b17f8 100644 --- a/dd-smoke-tests/spring-boot-2.4-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.4-webflux/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -15,10 +15,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) -} - dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.4.0' testImplementation project(':dd-smoke-tests') diff --git a/dd-smoke-tests/spring-boot-2.5-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.5-webflux/build.gradle index ae73ceb749a..79243d8e97b 100644 --- a/dd-smoke-tests/spring-boot-2.5-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.5-webflux/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -15,10 +15,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) -} - dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.5.0+' testImplementation project(':dd-smoke-tests') diff --git a/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle b/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle index 93dd896d51a..c86fea56bc3 100644 --- a/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle +++ b/dd-smoke-tests/spring-boot-2.6-webflux/build.gradle @@ -1,8 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -16,28 +15,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) - duplicatesStrategy = DuplicatesStrategy.INCLUDE - mergeServiceFiles() - append 'META-INF/spring.handlers' - append 'META-INF/spring.schemas' - append 'META-INF/spring.tooling' - transform(PropertiesFileTransformer) { - paths = ['META-INF/spring.factories'] - mergeStrategy = "append" - } - filesNotMatching([ - 'META-INF/services/**', - 'META-INF/spring.handlers', - 'META-INF/spring.schemas', - 'META-INF/spring.tooling', - 'META-INF/spring.factories', - ]) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - } -} - dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.6.0+' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.6.0+' diff --git a/dd-smoke-tests/spring-boot-2.6-webmvc/build.gradle b/dd-smoke-tests/spring-boot-2.6-webmvc/build.gradle index 217aa7d5f86..7fde9b0ac63 100644 --- a/dd-smoke-tests/spring-boot-2.6-webmvc/build.gradle +++ b/dd-smoke-tests/spring-boot-2.6-webmvc/build.gradle @@ -1,8 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'java-test-fixtures' id 'dd-trace-java.module.smoke-test' } @@ -17,28 +16,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) - duplicatesStrategy = DuplicatesStrategy.INCLUDE - mergeServiceFiles() - append 'META-INF/spring.handlers' - append 'META-INF/spring.schemas' - append 'META-INF/spring.tooling' - transform(PropertiesFileTransformer) { - paths = ['META-INF/spring.factories'] - mergeStrategy = "append" - } - filesNotMatching([ - 'META-INF/services/**', - 'META-INF/spring.handlers', - 'META-INF/spring.schemas', - 'META-INF/spring.tooling', - 'META-INF/spring.factories', - ]) { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - } -} - dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.6.0+' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '2.6.0+' diff --git a/dd-smoke-tests/spring-boot-rabbit/build.gradle b/dd-smoke-tests/spring-boot-rabbit/build.gradle index 0c3f554d546..3e56305f1c4 100644 --- a/dd-smoke-tests/spring-boot-rabbit/build.gradle +++ b/dd-smoke-tests/spring-boot-rabbit/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -15,10 +15,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) -} - dependencies { implementation project(':dd-trace-api') implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.5.4' diff --git a/dd-smoke-tests/springboot-grpc/build.gradle b/dd-smoke-tests/springboot-grpc/build.gradle index 626fbcff4ee..9be9349965d 100644 --- a/dd-smoke-tests/springboot-grpc/build.gradle +++ b/dd-smoke-tests/springboot-grpc/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'com.google.protobuf' version '0.10.0' id 'dd-trace-java.module.smoke-test' } @@ -39,10 +39,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) -} - dependencies { implementation 'org.springframework.boot:spring-boot-starter-web:1.5.18.RELEASE' implementation 'io.grpc:grpc-netty-shaded:1.42.2' diff --git a/dd-smoke-tests/springboot-mongo/build.gradle b/dd-smoke-tests/springboot-mongo/build.gradle index 4778f981281..a95e63d173e 100644 --- a/dd-smoke-tests/springboot-mongo/build.gradle +++ b/dd-smoke-tests/springboot-mongo/build.gradle @@ -1,7 +1,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar plugins { - id 'com.gradleup.shadow' + id 'dd-trace-java.spring-boot-shadow-jar' id 'dd-trace-java.module.smoke-test' } @@ -15,10 +15,6 @@ tasks.named("jar", Jar) { } } -tasks.named("shadowJar", ShadowJar) { - configurations.add(project.configurations.named('runtimeClasspath')) -} - dependencies { implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.4.1' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-mongodb', version: '2.4.1' diff --git a/dd-smoke-tests/springboot/build.gradle b/dd-smoke-tests/springboot/build.gradle index 8db1742158b..9c9b755e163 100644 --- a/dd-smoke-tests/springboot/build.gradle +++ b/dd-smoke-tests/springboot/build.gradle @@ -21,6 +21,10 @@ tasks.named("jar", Jar) { } dependencies { + // This legacy IAST fixture relies on first-file Spring factories behavior; merging the complete + // factory set changes its Java 8/11 runtime and leaves RIPEMD128 unavailable during requests. + // Keep autoconfigure direct so enhanced graph ordering selects the same factories file as before. + implementation group: 'org.springframework.boot', name: 'spring-boot-autoconfigure', version: '1.5.18.RELEASE' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.18.RELEASE' implementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '1.5.18.RELEASE' implementation group: 'com.auth0', name: 'java-jwt', version: '4.0.0-beta.0' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 84c5a9c661a..760c45969c4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=84fbba45c7f4c64abc77460e1c00f541e9f960e3c7ed2538f1ede19eacd873ae -distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.0-bin.zip +distributionSha256Sum=acd53f1edaf02f1a8ff99879f8a34b302661a057d9b063ae9e35b552f804d20a +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip networkTimeout=10000 retries=0 retryBackOffMs=500 diff --git a/settings.gradle.kts b/settings.gradle.kts index 14e988af3fe..fe5380a054b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,6 +33,10 @@ plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" } +// Prevent dependency constraints from changing classpath order (https://github.com/gradle/gradle/issues/38057). +// This Gradle 9.7 feature preview becomes the default in Gradle 10 and can then be removed. +enableFeaturePreview("ENHANCED_GRAPH_ORDERING") + val isCI = providers.environmentVariable("CI") val skipBuildscan = providers.environmentVariable("SKIP_BUILDSCAN").map { it.toBoolean() }.orElse(false) @@ -473,6 +477,7 @@ include( ":dd-java-agent:instrumentation:lettuce:lettuce-5.0", ":dd-java-agent:instrumentation:liberty:liberty-20.0", ":dd-java-agent:instrumentation:liberty:liberty-23.0", + ":dd-java-agent:instrumentation:liberty:liberty-common", ":dd-java-agent:instrumentation:log4j:log4j-1.2.4", ":dd-java-agent:instrumentation:log4j:log4j-2.0", ":dd-java-agent:instrumentation:log4j:log4j-2.7",