diff --git a/dd-java-agent/instrumentation/jetty-client/build.gradle b/dd-java-agent/instrumentation/jetty-client/build.gradle new file mode 100644 index 00000000000..5e69c67bd78 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/build.gradle @@ -0,0 +1 @@ +apply from: "$rootDir/gradle/java.gradle" diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle new file mode 100644 index 00000000000..bef44b496ae --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle @@ -0,0 +1,50 @@ +ext { + minJavaVersionForTests = JavaVersion.VERSION_11 +} +muzzle { + pass { + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[10,12)" + javaVersion = "11" + } + fail { + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[,10)" + } + fail { + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[12,)" + javaVersion = "17" + } +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuiteForDir('latestDepTest', 'test') +addTestSuiteForDir('jetty11Test', 'test') +addTestSuiteForDir('jetty10LatestDepTest', 'test') +compileMain_java11Java.configure { + it.sourceCompatibility = JavaVersion.VERSION_1_8 + it.targetCompatibility = JavaVersion.VERSION_1_8 + setJavaVersion(it, 11) +} +dependencies { + main_java11CompileOnly group: 'org.eclipse.jetty', name: 'jetty-client', version: '10.0.0' + main_java11Implementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-common')) { + transitive = false + } + //because contains some instrumentation that still apply + testImplementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-9.1')) + testImplementation(project(path:':dd-java-agent:testing', configuration:'shadow')) { + // explicitly declared below. + exclude group: 'org.eclipse.jetty' + } + testImplementation project(':dd-java-agent:instrumentation:jetty-util') + testImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '10.0.0' + jetty10LatestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '10.+' + jetty11TestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '11.0.0' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '11.+' +} diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java new file mode 100644 index 00000000000..4a279e71eaa --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java/datadog/trace/instrumentation/jetty_client10/JettyClientInstrumentation.java @@ -0,0 +1,66 @@ +package datadog.trace.instrumentation.jetty_client10; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; +import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.isMethod; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.ExcludeFilterProvider; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +@AutoService(Instrumenter.class) +public class JettyClientInstrumentation extends Instrumenter.Tracing + implements Instrumenter.ForSingleType, ExcludeFilterProvider { + public JettyClientInstrumentation() { + super("jetty-client"); + } + + @Override + public String instrumentedType() { + return "org.eclipse.jetty.client.HttpClient"; + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".JettyClientDecorator", + "datadog.trace.instrumentation.jetty_client.HeadersInjectAdapter", + "datadog.trace.instrumentation.jetty_client.CallbackWrapper", + packageName + ".SpanFinishingCompleteListener" + }; + } + + @Override + public Map contextStore() { + return singletonMap("org.eclipse.jetty.client.api.Request", AgentSpan.class.getName()); + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + isMethod() + .and(named("send")) + .and( + takesArgument( + 0, + namedOneOf( + "org.eclipse.jetty.client.api.Request", + "org.eclipse.jetty.client.HttpRequest"))) + .and(takesArgument(1, List.class)), + packageName + ".SendAdvice"); + } + + @Override + public Map> excludedClasses() { + return singletonMap(RUNNABLE, singletonList("org.eclipse.jetty.util.SocketAddressResolver$1")); + } +} diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyClientDecorator.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/JettyClientDecorator.java similarity index 96% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyClientDecorator.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/JettyClientDecorator.java index c52ece9e6fe..494ff08937b 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyClientDecorator.java +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/JettyClientDecorator.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.jetty_client; +package datadog.trace.instrumentation.jetty_client10; import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator; diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendAdvice.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendAdvice.java new file mode 100644 index 00000000000..fb6073f9c40 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SendAdvice.java @@ -0,0 +1,43 @@ +package datadog.trace.instrumentation.jetty_client10; + +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate; +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.instrumentation.jetty_client.HeadersInjectAdapter.SETTER; +import static datadog.trace.instrumentation.jetty_client10.JettyClientDecorator.DECORATE; +import static datadog.trace.instrumentation.jetty_client10.JettyClientDecorator.HTTP_REQUEST; + +import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator; +import java.util.List; +import net.bytebuddy.asm.Advice; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.client.api.Response; + +public class SendAdvice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static AgentSpan methodEnter( + @Advice.Argument(0) Request request, + @Advice.Argument(1) List responseListeners) { + AgentSpan span = startSpan(HTTP_REQUEST); + InstrumentationContext.get(Request.class, AgentSpan.class).put(request, span); + // make sure the span is finished before onComplete callbacks execute + responseListeners.add(0, new SpanFinishingCompleteListener(span)); + DECORATE.afterStart(span); + DECORATE.onRequest(span, request); + propagate().inject(span, request, SETTER); + propagate() + .injectPathwayContext(span, request, SETTER, HttpClientDecorator.CLIENT_PATHWAY_EDGE_TAGS); + return span; + } + + @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) + public static void methodExit( + @Advice.Enter final AgentSpan span, @Advice.Thrown final Throwable throwable) { + if (throwable != null) { + DECORATE.onError(span, throwable); + DECORATE.beforeFinish(span); + span.finish(); + } + } +} diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/SpanFinishingCompleteListener.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SpanFinishingCompleteListener.java similarity index 81% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/SpanFinishingCompleteListener.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SpanFinishingCompleteListener.java index 5878486adc8..685c903816e 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/SpanFinishingCompleteListener.java +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/main/java11/datadog/trace/instrumentation/jetty_client10/SpanFinishingCompleteListener.java @@ -1,6 +1,6 @@ -package datadog.trace.instrumentation.jetty_client; +package datadog.trace.instrumentation.jetty_client10; -import static datadog.trace.instrumentation.jetty_client.JettyClientDecorator.DECORATE; +import static datadog.trace.instrumentation.jetty_client10.JettyClientDecorator.DECORATE; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import org.eclipse.jetty.client.api.Response; diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/test/groovy/JettyClientTest.groovy b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/test/groovy/JettyClientTest.groovy new file mode 100644 index 00000000000..4b4cf055765 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/src/test/groovy/JettyClientTest.groovy @@ -0,0 +1,107 @@ +import datadog.trace.agent.test.base.HttpClientTest +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import org.eclipse.jetty.client.HttpClient +import org.eclipse.jetty.client.HttpProxy +import org.eclipse.jetty.client.HttpResponseException +import org.eclipse.jetty.client.api.Request +import org.eclipse.jetty.client.api.Response +import org.eclipse.jetty.client.api.Result +import org.eclipse.jetty.client.dynamic.HttpClientTransportDynamic +import org.eclipse.jetty.client.util.StringContentProvider +import org.eclipse.jetty.io.ClientConnector +import org.eclipse.jetty.util.ssl.SslContextFactory +import spock.lang.Shared +import spock.lang.Subject + +import java.util.concurrent.ExecutionException + +abstract class JettyClientTest extends HttpClientTest { + + @Shared + @Subject + HttpClient client = createHttpClient() + + @Shared + HttpClient proxiedClient = createHttpClient() + + def createHttpClient() { + SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(true) + ClientConnector clientConnector = new ClientConnector() + clientConnector.setSslContextFactory(sslContextFactory) + return new HttpClient(new HttpClientTransportDynamic(clientConnector)) + } + + def setupSpec() { + client.connectTimeout = CONNECT_TIMEOUT_MS + client.addressResolutionTimeout = CONNECT_TIMEOUT_MS + client.idleTimeout = READ_TIMEOUT_MS + client.start() + + proxiedClient.proxyConfiguration.proxies.add(new HttpProxy("localhost", proxy.port)) + proxiedClient.connectTimeout = CONNECT_TIMEOUT_MS + proxiedClient.addressResolutionTimeout = CONNECT_TIMEOUT_MS + proxiedClient.idleTimeout = READ_TIMEOUT_MS + proxiedClient.start() + } + + @Override + int doRequest(String method, URI uri, Map headers, String body, Closure callback) { + def proxy = uri.fragment != null && uri.fragment.equals("proxy") + Request req = (proxy ? proxiedClient : client).newRequest(uri).method(method) + headers.entrySet().each { + req.header(it.key, it.value) + } + if (body) { + req.content(new StringContentProvider(body)) + } + if (callback) { + req.onComplete(new Response.CompleteListener() { + @Override + void onComplete(Result result) { + callback.call() + } + }) + } + try { + def resp = req.send() + blockUntilChildSpansFinished(1) + return resp.status + } catch (ExecutionException ex) { + if (ex.cause instanceof HttpResponseException) { + return (ex.cause as HttpResponseException).response.status + } + throw ex + } + } + + @Override + CharSequence component() { + return "jetty-client" + } + + @Override + boolean testRedirects() { + false + } + + @Override + boolean testRemoteConnection() { + false + } + + @Override + boolean testSecure() { + true + } + + @Override + boolean testProxy() { + false // doesn't produce CONNECT span. + } +} + +class JettyClientV0Test extends JettyClientTest implements TestingGenericHttpNamingConventions.ClientV0 { +} + +class JettyClientV1ForkedTest extends JettyClientTest implements TestingGenericHttpNamingConventions.ClientV1 { +} diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/build.gradle b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle similarity index 60% rename from dd-java-agent/instrumentation/jetty-client-9.1/build.gradle rename to dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle index 27fea9a0472..0b606c3bc8b 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/build.gradle +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle @@ -4,35 +4,60 @@ muzzle { * is compiled with Java 11, so we can't validate with muzzle which uses Java 8. */ pass { + name = "client" group = "org.eclipse.jetty" module = "jetty-client" versions = "[9.1,10)" } + pass { + name = "listener" + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[9.1,10)" + } + fail { + name = "client" + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[10,12)" + javaVersion = "11" + } + pass { + name = "listener" + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[10,12)" + javaVersion = "11" + } fail { group = "org.eclipse.jetty" module = "jetty-client" versions = "[,9.1)" } + + fail { + group = "org.eclipse.jetty" + module = "jetty-client" + versions = "[12,)" + javaVersion = "17" + } } apply from: "$rootDir/gradle/java.gradle" - addTestSuiteForDir('latestDepTest', 'test') dependencies { compileOnly group: 'org.eclipse.jetty', name: 'jetty-client', version: '9.1.0.v20131115' - + implementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-common')) { + transitive = false + } testImplementation(project(':dd-java-agent:testing')) { // explicitly declared below. - exclude module: 'jetty-server' + exclude group: 'org.eclipse.jetty' } testImplementation project(':dd-java-agent:instrumentation:jetty-util') testImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '9.1.0.v20131115' - testImplementation group: 'org.eclipse.jetty', name: 'jetty-util', version: '9.1.0.v20131115' - latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '9.+' // 10+ requires Java 11 - - // because there are shared dependencies between the client and server - // we have to be explicit about which version to use. testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.1.0.v20131115' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '9.+' latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.+' } diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/gradle.lockfile b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/gradle.lockfile similarity index 100% rename from dd-java-agent/instrumentation/jetty-client-9.1/gradle.lockfile rename to dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/gradle.lockfile diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/FutureResponseListenerInstrumentation.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java similarity index 93% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/FutureResponseListenerInstrumentation.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java index 78a513bb3c1..5ef6a448a41 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/FutureResponseListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/FutureResponseListenerInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.jetty_client; +package datadog.trace.instrumentation.jetty_client91; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; @@ -28,11 +28,6 @@ public String instrumentedType() { return "org.eclipse.jetty.client.util.FutureResponseListener"; } - @Override - public String[] helperClassNames() { - return new String[] {packageName + ".JettyClientDecorator"}; - } - @Override public Map contextStore() { Map contextStore = new HashMap<>(4); @@ -43,6 +38,11 @@ public Map contextStore() { return contextStore; } + @Override + public String muzzleDirective() { + return "listener"; + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyAddListenerInstrumentation.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java similarity index 94% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyAddListenerInstrumentation.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java index 33129b50b81..3d84805ad71 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyAddListenerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyAddListenerInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.jetty_client; +package datadog.trace.instrumentation.jetty_client91; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; @@ -11,6 +11,7 @@ import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.instrumentation.jetty_client.CallbackWrapper; import java.util.Map; import net.bytebuddy.asm.Advice; import org.eclipse.jetty.client.api.Request; @@ -35,7 +36,12 @@ public Map contextStore() { @Override public String[] helperClassNames() { - return new String[] {packageName + ".CallbackWrapper"}; + return new String[] {"datadog.trace.instrumentation.jetty_client.CallbackWrapper"}; + } + + @Override + public String muzzleDirective() { + return "listener"; } @Override diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientDecorator.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientDecorator.java new file mode 100644 index 00000000000..a4efbec88f8 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientDecorator.java @@ -0,0 +1,48 @@ +package datadog.trace.instrumentation.jetty_client91; + +import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; +import datadog.trace.bootstrap.instrumentation.decorator.HttpClientDecorator; +import java.net.URI; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.client.api.Response; + +public class JettyClientDecorator extends HttpClientDecorator { + public static final CharSequence JETTY_CLIENT = UTF8BytesString.create("jetty-client"); + public static final JettyClientDecorator DECORATE = new JettyClientDecorator(); + public static final CharSequence HTTP_REQUEST = UTF8BytesString.create(DECORATE.operationName()); + + @Override + protected String[] instrumentationNames() { + return new String[] {"jetty-client"}; + } + + @Override + protected CharSequence component() { + return JETTY_CLIENT; + } + + @Override + protected String method(final Request httpRequest) { + return httpRequest.getMethod(); + } + + @Override + protected URI url(final Request httpRequest) { + return httpRequest.getURI(); + } + + @Override + protected int status(final Response httpResponse) { + return httpResponse.getStatus(); + } + + @Override + protected String getRequestHeader(Request request, String headerName) { + return request.getHeaders().get(headerName); + } + + @Override + protected String getResponseHeader(Response response, String headerName) { + return response.getHeaders().get(headerName); + } +} diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyClientInstrumentation.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java similarity index 89% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyClientInstrumentation.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java index 180fd26e1ab..03e77c45c73 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/JettyClientInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/JettyClientInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.jetty_client; +package datadog.trace.instrumentation.jetty_client91; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.namedOneOf; @@ -6,8 +6,8 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.bootstrap.instrumentation.java.concurrent.ExcludeFilter.ExcludeType.RUNNABLE; import static datadog.trace.instrumentation.jetty_client.HeadersInjectAdapter.SETTER; -import static datadog.trace.instrumentation.jetty_client.JettyClientDecorator.DECORATE; -import static datadog.trace.instrumentation.jetty_client.JettyClientDecorator.HTTP_REQUEST; +import static datadog.trace.instrumentation.jetty_client91.JettyClientDecorator.DECORATE; +import static datadog.trace.instrumentation.jetty_client91.JettyClientDecorator.HTTP_REQUEST; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -43,12 +43,17 @@ public String instrumentedType() { public String[] helperClassNames() { return new String[] { packageName + ".JettyClientDecorator", - packageName + ".HeadersInjectAdapter", - packageName + ".CallbackWrapper", + "datadog.trace.instrumentation.jetty_client.HeadersInjectAdapter", + "datadog.trace.instrumentation.jetty_client.CallbackWrapper", packageName + ".SpanFinishingCompleteListener" }; } + @Override + public String muzzleDirective() { + return "client"; + } + @Override public Map contextStore() { return singletonMap("org.eclipse.jetty.client.api.Request", AgentSpan.class.getName()); diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/SpanFinishingCompleteListener.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/SpanFinishingCompleteListener.java new file mode 100644 index 00000000000..b71d9311b4e --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client91/SpanFinishingCompleteListener.java @@ -0,0 +1,25 @@ +package datadog.trace.instrumentation.jetty_client91; + +import static datadog.trace.instrumentation.jetty_client91.JettyClientDecorator.DECORATE; + +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.api.Result; + +public class SpanFinishingCompleteListener implements Response.CompleteListener { + private final AgentSpan span; + + public SpanFinishingCompleteListener(AgentSpan span) { + this.span = span; + } + + @Override + public void onComplete(Result result) { + if (result.getResponse().getStatus() <= 0) { + DECORATE.onError(span, result.getFailure()); + } + DECORATE.onResponse(span, result.getResponse()); + DECORATE.beforeFinish(span); + span.finish(); + } +} diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/test/groovy/JettyClientTest.groovy b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/test/groovy/JettyClientTest.groovy similarity index 96% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/test/groovy/JettyClientTest.groovy rename to dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/test/groovy/JettyClientTest.groovy index 2725c2a5a58..0556d94f1bf 100644 --- a/dd-java-agent/instrumentation/jetty-client-9.1/src/test/groovy/JettyClientTest.groovy +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/src/test/groovy/JettyClientTest.groovy @@ -93,7 +93,7 @@ abstract class JettyClientTest extends HttpClientTest { } } -class JettyClientV0ForkedTest extends JettyClientTest implements TestingGenericHttpNamingConventions.ClientV0 { +class JettyClientV0Test extends JettyClientTest implements TestingGenericHttpNamingConventions.ClientV0 { } class JettyClientV1ForkedTest extends JettyClientTest implements TestingGenericHttpNamingConventions.ClientV1 { diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-common/build.gradle b/dd-java-agent/instrumentation/jetty-client/jetty-client-common/build.gradle new file mode 100644 index 00000000000..f8761d9d9cc --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-common/build.gradle @@ -0,0 +1,5 @@ +apply from: "$rootDir/gradle/java.gradle" + +dependencies { + compileOnly group: 'org.eclipse.jetty', name: 'jetty-client', version: '9.1.0.v20131115' +} diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-common/gradle.lockfile b/dd-java-agent/instrumentation/jetty-client/jetty-client-common/gradle.lockfile new file mode 100644 index 00000000000..e16ff2a62b2 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-common/gradle.lockfile @@ -0,0 +1,162 @@ +# 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. +cafe.cryptography:curve25519-elisabeth:0.1.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +ch.qos.logback:logback-classic:1.2.3=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-core:1.2.3=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.beust:jcommander:1.78=latestDepTestRuntimeClasspath,testRuntimeClasspath +com.blogspot.mydailyjava:weak-lock-free:0.17=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.1.7=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.2.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.12=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.16=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.15=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.18=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.21=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.2.0=compileClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.7.3=spotbugs +com.github.spotbugs:spotbugs:4.7.3=spotbugs +com.github.stefanbirkner:system-rules:1.19.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.auto.service:auto-service-annotations:1.0-rc7=annotationProcessor,compileClasspath,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,testAnnotationProcessor,testCompileClasspath +com.google.auto.service:auto-service:1.0-rc7=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.auto:auto-common:0.10=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,spotbugs,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath +com.google.code.gson:gson:2.9.1=spotbugs +com.google.errorprone:error_prone_annotations:2.2.0=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.guava:failureaccess:1.0.1=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.guava:guava:20.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:27.0.1-jre=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.j2objc:j2objc-annotations:1.1=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.re2j:re2j:1.7=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:3.12.12=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.squareup.okhttp3:okhttp:3.12.12=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.squareup.okio:okio:1.17.5=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.thoughtworks.qdox:qdox:1.12.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +commons-codec:commons-codec:1.15=spotbugs +commons-fileupload:commons-fileupload:1.5=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +commons-io:commons-io:2.11.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +de.thetaphi:forbiddenapis:3.1=compileClasspath +info.picocli:picocli:4.6.3=latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:8.0.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +jaxen:jaxen:1.2.0=spotbugs +jline:jline:2.14.6=latestDepTestRuntimeClasspath,testRuntimeClasspath +junit:junit-dep:4.11=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +junit:junit:4.13.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.14.9=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.9=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.jcip:jcip-annotations:1.0=compileClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +net.sf.saxon:Saxon-HE:11.4=spotbugs +org.apache.ant:ant-antlr:1.10.12=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.apache.ant:ant-antlr:1.9.15=codenarc +org.apache.ant:ant-junit:1.10.12=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.apache.ant:ant-junit:1.9.15=codenarc +org.apache.ant:ant-launcher:1.10.12=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.apache.ant:ant:1.10.12=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.apache.bcel:bcel:6.5.0=spotbugs +org.apache.commons:commons-lang3:3.12.0=spotbugs +org.apache.commons:commons-text:1.10.0=spotbugs +org.apache.httpcomponents.client5:httpclient5:5.1.3=spotbugs +org.apache.httpcomponents.core5:httpcore5-h2:5.1.3=spotbugs +org.apache.httpcomponents.core5:httpcore5:5.1.3=spotbugs +org.apache.logging.log4j:log4j-api:2.19.0=spotbugs +org.apache.logging.log4j:log4j-core:2.19.0=spotbugs +org.apiguardian:apiguardian-api:1.1.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.checkerframework:checker-qual:2.5.2=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +org.codehaus.groovy:groovy-all:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-ant:2.5.14=codenarc +org.codehaus.groovy:groovy-ant:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-astbuilder:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-cli-picocli:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-console:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-datetime:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-docgenerator:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovydoc:2.5.14=codenarc +org.codehaus.groovy:groovy-groovydoc:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovysh:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jmx:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-json:2.5.14=codenarc +org.codehaus.groovy:groovy-json:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jsr223:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-macro:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-nio:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-servlet:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-sql:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-swing:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-templates:2.5.14=codenarc +org.codehaus.groovy:groovy-templates:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test-junit5:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-testng:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-xml:2.5.14=codenarc +org.codehaus.groovy:groovy-xml:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy:2.5.14=codenarc +org.codehaus.groovy:groovy:3.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.codehaus.mojo:animal-sniffer-annotations:1.17=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +org.codenarc:CodeNarc:2.2.0=codenarc +org.dom4j:dom4j:2.1.3=spotbugs +org.eclipse.jetty:jetty-client:9.1.0.v20131115=compileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-client:9.4.53.v20231009=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-http:9.1.0.v20131115=compileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-http:9.4.53.v20231009=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-io:9.1.0.v20131115=compileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:9.4.53.v20231009=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-server:9.1.0.v20131115=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:9.4.53.v20231009=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-util:9.1.0.v20131115=compileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:9.4.53.v20231009=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.gmetrics:GMetrics:1.1=codenarc +org.hamcrest:hamcrest-core:1.3=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest:2.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.jctools:jctools-core:3.3.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.9.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.9.0=latestDepTestCompileClasspath,testCompileClasspath +org.junit.platform:junit-platform-commons:1.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.9.0=latestDepTestCompileClasspath,testCompileClasspath +org.junit.platform:junit-platform-engine:1.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-runner:1.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.0=latestDepTestCompileClasspath,testCompileClasspath +org.junit:junit-bom:5.9.1=spotbugs +org.junit:junit-bom:5.9.2=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.objenesis:objenesis:3.3=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.slf4j:jcl-over-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.slf4j:jul-to-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.slf4j:log4j-over-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:1.7.30=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath +org.slf4j:slf4j-api:1.7.32=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.slf4j:slf4j-api:2.0.0=spotbugs,spotbugsSlf4j +org.slf4j:slf4j-simple:2.0.0=spotbugsSlf4j +org.spockframework:spock-core:2.2-groovy-3.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.spockframework:spock-junit4:2.2-groovy-3.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.testng:testng:7.5=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.webjars:jquery:3.5.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.xmlresolver:xmlresolver:4.4.3=spotbugs +xml-apis:xml-apis:1.4.01=spotbugs +empty=spotbugsPlugins diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/CallbackWrapper.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-common/src/main/java/datadog/trace/instrumentation/jetty_client/CallbackWrapper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/CallbackWrapper.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-common/src/main/java/datadog/trace/instrumentation/jetty_client/CallbackWrapper.java diff --git a/dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/HeadersInjectAdapter.java b/dd-java-agent/instrumentation/jetty-client/jetty-client-common/src/main/java/datadog/trace/instrumentation/jetty_client/HeadersInjectAdapter.java similarity index 100% rename from dd-java-agent/instrumentation/jetty-client-9.1/src/main/java/datadog/trace/instrumentation/jetty_client/HeadersInjectAdapter.java rename to dd-java-agent/instrumentation/jetty-client/jetty-client-common/src/main/java/datadog/trace/instrumentation/jetty_client/HeadersInjectAdapter.java diff --git a/dd-java-agent/testing/build.gradle b/dd-java-agent/testing/build.gradle index ffc4f6ec605..eda58dbc50d 100644 --- a/dd-java-agent/testing/build.gradle +++ b/dd-java-agent/testing/build.gradle @@ -1,3 +1,7 @@ +plugins { + id 'com.github.johnrengelman.shadow' +} + ext { // need access to sun.misc package skipSettingCompilerRelease = true @@ -75,6 +79,15 @@ dependencies { testCompileOnly deps.autoserviceAnnotation } +shadowJar { + dependencies { + include(dependency { + it.moduleGroup == 'org.eclipse.jetty' + }) + } + relocate "org.eclipse.jetty", "datadog.eclipse.jetty" +} + tasks.withType(Test).configureEach { // SpockRunner that we use to run agent tests cannot be properly ported to JUnit 5, // since the framework does not provide the hooks / extension points diff --git a/settings.gradle b/settings.gradle index 94814f806a1..576bdcdbe64 100644 --- a/settings.gradle +++ b/settings.gradle @@ -283,7 +283,9 @@ include ':dd-java-agent:instrumentation:jetty-appsec-7' include ':dd-java-agent:instrumentation:jetty-appsec-8.1.3' include ':dd-java-agent:instrumentation:jetty-appsec-9.2' include ':dd-java-agent:instrumentation:jetty-appsec-9.3' -include ':dd-java-agent:instrumentation:jetty-client-9.1' +include ':dd-java-agent:instrumentation:jetty-client:jetty-client-common' +include ':dd-java-agent:instrumentation:jetty-client:jetty-client-9.1' +include ':dd-java-agent:instrumentation:jetty-client:jetty-client-10.0' include ':dd-java-agent:instrumentation:jetty-common' include ':dd-java-agent:instrumentation:jetty-util' include ':dd-java-agent:instrumentation:jms'