diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2KinesisDataStreamsTest.groovy b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2KinesisDataStreamsTest.groovy index 29c5f654d15..1a785b89d96 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2KinesisDataStreamsTest.groovy +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2KinesisDataStreamsTest.groovy @@ -4,12 +4,12 @@ import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDTags import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.core.datastreams.StatsGroup -import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory -import org.eclipse.jetty.server.HttpConfiguration -import org.eclipse.jetty.server.HttpConnectionFactory -import org.eclipse.jetty.server.Server -import org.eclipse.jetty.server.ServerConnector -import org.eclipse.jetty.server.SslConnectionFactory +import datadog.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory +import datadog.eclipse.jetty.server.HttpConfiguration +import datadog.eclipse.jetty.server.HttpConnectionFactory +import datadog.eclipse.jetty.server.Server +import datadog.eclipse.jetty.server.ServerConnector +import datadog.eclipse.jetty.server.SslConnectionFactory import software.amazon.awssdk.auth.credentials.AwsBasicCredentials import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider import software.amazon.awssdk.core.ResponseInputStream diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2SnsDataStreamsTest.groovy b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2SnsDataStreamsTest.groovy index f5b21944651..d8d69c5ed67 100644 --- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2SnsDataStreamsTest.groovy +++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/dsmTest/groovy/Aws2SnsDataStreamsTest.groovy @@ -5,12 +5,12 @@ import datadog.trace.api.DDTags import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.core.datastreams.StatsGroup import datadog.trace.instrumentation.aws.ExpectedQueryParams -import org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory -import org.eclipse.jetty.server.HttpConfiguration -import org.eclipse.jetty.server.HttpConnectionFactory -import org.eclipse.jetty.server.Server -import org.eclipse.jetty.server.ServerConnector -import org.eclipse.jetty.server.SslConnectionFactory +import datadog.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory +import datadog.eclipse.jetty.server.HttpConfiguration +import datadog.eclipse.jetty.server.HttpConnectionFactory +import datadog.eclipse.jetty.server.Server +import datadog.eclipse.jetty.server.ServerConnector +import datadog.eclipse.jetty.server.SslConnectionFactory import software.amazon.awssdk.auth.credentials.AwsBasicCredentials import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider import software.amazon.awssdk.core.ResponseInputStream diff --git a/dd-java-agent/testing/build.gradle b/dd-java-agent/testing/build.gradle index ed8937cda2b..41dd106e264 100644 --- a/dd-java-agent/testing/build.gradle +++ b/dd-java-agent/testing/build.gradle @@ -43,6 +43,8 @@ dependencies { // Note: 9.4 last to support java 8 compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.56.v20240826' runtimeOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.56.v20240826' + compileOnly group: 'org.eclipse.jetty.http2', name: 'http2-server', version: '9.4.56.v20240826' + runtimeOnly group: 'org.eclipse.jetty.http2', name: 'http2-server', version: '9.4.56.v20240826' // Since jetty-server is shadowed, it is needed to exports the servlet api as well. api group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' @@ -65,7 +67,7 @@ tasks.named("shadowJar", ShadowJar) { // All other dependencies remain as transitive dependencies dependencies { include(dependency { - it.moduleGroup == 'org.eclipse.jetty' + it.moduleGroup == 'org.eclipse.jetty' || it.moduleGroup == 'org.eclipse.jetty.http2' }) } @@ -83,11 +85,13 @@ configurations { outgoing.artifacts.clear() outgoing.artifact(tasks.named('shadowJar')) exclude group: 'org.eclipse.jetty' + exclude group: 'org.eclipse.jetty.http2' } named('runtimeElements') { outgoing.artifacts.clear() outgoing.artifact(tasks.named('shadowJar')) exclude group: 'org.eclipse.jetty' + exclude group: 'org.eclipse.jetty.http2' } } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy index a346410db64..30ee20fb1ef 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy @@ -130,6 +130,18 @@ class TestHttpServer implements AutoCloseable { https.setPort(0) internalServer.addConnector(https) + // Guard against shading mismatch: test code may use non-shaded Jetty types + // while TestHttpServer uses shaded Jetty (datadog.eclipse.jetty.*) + if (customizer.maximumNumberOfParameters > 0) { + def expectedType = customizer.parameterTypes[0] + def actualType = internalServer.getClass() + if (expectedType != Object && !expectedType.isAssignableFrom(actualType)) { + throw new IllegalArgumentException( + "Customizer closure expects '${expectedType.name}' but TestHttpServer uses shaded Jetty '${actualType.name}'. " + + "Update your test imports to use 'datadog.eclipse.jetty.*' instead of 'org.eclipse.jetty.*'." + ) + } + } customizer.call(internalServer) internalServer.start() // set after starting, otherwise two callbacks get added.