From 66fa6de5af8fe0f40dcb1f2792ea7d522563a75d Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Mon, 10 Mar 2025 12:20:30 +0100 Subject: [PATCH 1/7] Instrument Jetty websocket pojo --- .../instrumentation/jetty-11/build.gradle | 2 + .../src/test/groovy/Jetty11Test.groovy | 9 +- .../testFixtures/groovy/JettyServer.groovy | 81 ++++-- .../instrumentation/jetty-12/build.gradle | 6 +- .../src/test/ee10/groovy/Jetty12Test.groovy | 11 +- .../src/test/ee10/groovy/JettyServer.groovy | 80 ++++-- .../src/test/ee8/groovy/Jetty12Test.groovy | 9 +- .../src/test/ee8/groovy/JettyServer.groovy | 80 ++++-- .../src/test/ee9/groovy/Jetty12Test.groovy | 12 +- .../src/test/ee9/groovy/JettyServer.groovy | 80 ++++-- .../instrumentation/jetty-9/build.gradle | 2 + .../WebSocketSessionInstrumentation.java | 8 +- .../instrumentation/jetty9/Jetty9Test.groovy | 11 +- .../groovy/test/JettyServer.groovy | 86 ++++-- .../instrumentation/websocket/gradle.lockfile | 158 +++++++++++ .../jakarta-websocket-2.0/gradle.lockfile | 184 +++++++++++++ .../src/test/groovy/WebsocketTest.groovy | 34 +-- .../javax-websocket-1.0/gradle.lockfile | 180 ++++++++++++ .../websocket/jetty-websocket/build.gradle | 1 + .../websocket/jetty-websocket/gradle.lockfile | 158 +++++++++++ .../jetty-websocket-10/build.gradle | 28 ++ .../jetty-websocket-10/gradle.lockfile | 204 ++++++++++++++ ...ketFrameHandlerFactoryInstrumentation.java | 29 ++ ...xWebSocketFrameHandlerInstrumentation.java | 39 +++ .../Jetty10JavaxPojoWebSocketModule.java | 55 ++++ .../websocket/jetty10/SyntheticEndpoint.java | 162 +++++++++++ .../websocket/jetty10/WebSocketAdvices.java | 98 +++++++ .../src/test/groovy/Endpoints.groovy | 115 ++++++++ .../src/test/groovy/WebsocketTest.groovy | 90 ++++++ .../jetty-websocket-11/build.gradle | 26 ++ .../jetty-websocket-11/gradle.lockfile | 205 ++++++++++++++ .../src/latestDepTest/groovy/Endpoints.groovy | 115 ++++++++ .../latestDepTest/groovy/WebsocketTest.groovy | 91 +++++++ .../Jetty11JakartaPojoWebsocketModule.java | 25 ++ .../src/test/groovy/Endpoints.groovy | 115 ++++++++ .../src/test/groovy/WebsocketTest.groovy | 90 ++++++ .../jetty-websocket-12/build.gradle | 32 +++ .../jetty-websocket-12/gradle.lockfile | 257 ++++++++++++++++++ ...Jetty12EE10JakartaPojoWebsocketModule.java | 25 ++ .../Jetty12EE8JavaxPojoWebsocketModule.java | 22 ++ .../Jetty12EE9JakartaPojoWebsocketModule.java | 25 ++ .../src/test/groovy/EE10WebsocketTest.groovy | 91 +++++++ .../src/test/groovy/EE8WebsocketTest.groovy | 91 +++++++ .../src/test/groovy/EE9WebsocketTest.groovy | 91 +++++++ .../src/test/groovy/JakartaEndpoints.groovy | 116 ++++++++ .../src/test/groovy/JavaxEndpoints.groovy | 115 ++++++++ settings.gradle | 4 + 47 files changed, 3410 insertions(+), 138 deletions(-) create mode 100644 dd-java-agent/instrumentation/websocket/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/javax-websocket-1.0/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/build.gradle create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerInstrumentation.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/Endpoints.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/WebsocketTest.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/Endpoints.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/WebsocketTest.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/Endpoints.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/WebsocketTest.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE10WebsocketTest.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE8WebsocketTest.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE9WebsocketTest.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JakartaEndpoints.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JavaxEndpoints.groovy diff --git a/dd-java-agent/instrumentation/jetty-11/build.gradle b/dd-java-agent/instrumentation/jetty-11/build.gradle index e4497de5156..8749dcb3dda 100644 --- a/dd-java-agent/instrumentation/jetty-11/build.gradle +++ b/dd-java-agent/instrumentation/jetty-11/build.gradle @@ -64,6 +64,8 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:request-5') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0') + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-11") latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '11.+', { exclude group: 'org.slf4j', module: 'slf4j-api' diff --git a/dd-java-agent/instrumentation/jetty-11/src/test/groovy/Jetty11Test.groovy b/dd-java-agent/instrumentation/jetty-11/src/test/groovy/Jetty11Test.groovy index 7085b71aac3..d7fb8e79b50 100644 --- a/dd-java-agent/instrumentation/jetty-11/src/test/groovy/Jetty11Test.groovy +++ b/dd-java-agent/instrumentation/jetty-11/src/test/groovy/Jetty11Test.groovy @@ -8,7 +8,7 @@ import org.eclipse.jetty.server.Server abstract class Jetty11Test extends HttpServerTest { @Override HttpServer server() { - new JettyServer(handler()) + new JettyServer(handler(), useWebsocketPojoEndpoint()) } protected Handler handler() { @@ -89,10 +89,17 @@ abstract class Jetty11Test extends HttpServerTest { boolean testSessionId() { true } + + protected boolean useWebsocketPojoEndpoint() { + false + } } class Jetty11V0ForkedTest extends Jetty11Test implements TestingGenericHttpNamingConventions.ServerV0 { } class Jetty11V1ForkedTest extends Jetty11Test implements TestingGenericHttpNamingConventions.ServerV1 { + protected boolean useWebsocketPojoEndpoint() { + true + } } diff --git a/dd-java-agent/instrumentation/jetty-11/src/testFixtures/groovy/JettyServer.groovy b/dd-java-agent/instrumentation/jetty-11/src/testFixtures/groovy/JettyServer.groovy index 67f29825fac..e033ca35713 100644 --- a/dd-java-agent/instrumentation/jetty-11/src/testFixtures/groovy/JettyServer.groovy +++ b/dd-java-agent/instrumentation/jetty-11/src/testFixtures/groovy/JettyServer.groovy @@ -11,7 +11,11 @@ import jakarta.websocket.CloseReason import jakarta.websocket.Endpoint import jakarta.websocket.EndpointConfig import jakarta.websocket.MessageHandler +import jakarta.websocket.OnClose +import jakarta.websocket.OnMessage +import jakarta.websocket.OnOpen import jakarta.websocket.Session +import jakarta.websocket.server.ServerEndpoint import jakarta.websocket.server.ServerEndpointConfig import org.eclipse.jetty.server.Handler import org.eclipse.jetty.server.Server @@ -29,13 +33,15 @@ class JettyServer implements WebsocketServer { def port = 0 final server = new Server(0) // select random open port - JettyServer(Handler handler) { + JettyServer(Handler handler, usePojoWebsocketHandler = false) { server.handler = handler server.addBean(errorHandler) + def endpointClass = usePojoWebsocketHandler ? PojoEndpoint : WsEndpoint + if (handler instanceof ServletContextHandler) { try { JakartaWebSocketServletContainerInitializer.configure(handler, (servletContext, container) -> { - container.addEndpoint(ServerEndpointConfig.Builder.create(WsEndpoint.class, "/websocket").build()) + container.addEndpoint(ServerEndpointConfig.Builder.create(endpointClass, "/websocket").build()) }) } catch (Throwable ignored) { } @@ -98,9 +104,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendText(String[] messages) { if (messages.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendText(messages[0]) + Lock.activeSession.getBasicRemote().sendText(messages[0]) } else { - def remoteEndpoint = WsEndpoint.activeSession.getBasicRemote() + def remoteEndpoint = Lock.activeSession.getBasicRemote() for (int i = 0; i < messages.length; i++) { remoteEndpoint.sendText(messages[i], i == messages.length - 1) } @@ -110,9 +116,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendBinary(byte[][] binaries) { if (binaries.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) + Lock.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) } else { - try (def stream = WsEndpoint.activeSession.getBasicRemote().getSendStream()) { + try (def stream = Lock.activeSession.getBasicRemote().getSendStream()) { binaries.each { stream.write(it) } } } @@ -120,10 +126,10 @@ class JettyServer implements WebsocketServer { @Override synchronized void awaitConnected() { - synchronized (WsEndpoint) { + synchronized (Lock) { try { - while (WsEndpoint.activeSession == null) { - WsEndpoint.wait() + while (Lock.activeSession == null) { + Lock.wait() } } catch (InterruptedException ie) { Thread.currentThread().interrupt() @@ -133,14 +139,14 @@ class JettyServer implements WebsocketServer { @Override void serverClose() { - WsEndpoint.activeSession?.close() - WsEndpoint.activeSession = null + Lock.activeSession?.close() + Lock.activeSession = null } @Override void setMaxPayloadSize(int size) { - WsEndpoint.activeSession?.setMaxTextMessageBufferSize(size) - WsEndpoint.activeSession?.setMaxBinaryMessageBufferSize(size) + Lock.activeSession?.setMaxTextMessageBufferSize(size) + Lock.activeSession?.setMaxBinaryMessageBufferSize(size) } @Override @@ -148,33 +154,64 @@ class JettyServer implements WebsocketServer { false } - static class WsEndpoint extends Endpoint { + static class Lock { static Session activeSession + } + + @ServerEndpoint("/websocket") + static class PojoEndpoint { + + @OnOpen + void onOpen(Session session) { + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() + } + } + + @OnMessage + void onText(String text, Session session, boolean last) { + runUnderTrace("onRead", {}) + + } + + @OnMessage + void onBytes(byte[] binary) { + runUnderTrace("onRead", {}) + } + + @OnClose + void onClose() { + Lock.activeSession = null + } + } + + static class WsEndpoint extends Endpoint { @Override void onOpen(Session session, EndpointConfig endpointConfig) { session.addMessageHandler(new MessageHandler.Partial() { @Override - void onMessage(String s, boolean last) { - // jetty does not respect at all limiting the payload so we have to simulate it in few tests + void onMessage(String s, boolean b) { runUnderTrace("onRead", {}) } }) - session.addMessageHandler(new MessageHandler.Partial() { + session.addMessageHandler(new MessageHandler.Whole() { + @Override - void onMessage(byte[] b, boolean last) { + void onMessage(ByteBuffer buffer) { runUnderTrace("onRead", {}) } }) - activeSession = session - synchronized (WsEndpoint) { - WsEndpoint.notifyAll() + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() } } @Override void onClose(Session session, CloseReason closeReason) { - activeSession = null + Lock.activeSession = null } } } diff --git a/dd-java-agent/instrumentation/jetty-12/build.gradle b/dd-java-agent/instrumentation/jetty-12/build.gradle index a1a1aa600bd..078c9a2f790 100644 --- a/dd-java-agent/instrumentation/jetty-12/build.gradle +++ b/dd-java-agent/instrumentation/jetty-12/build.gradle @@ -42,8 +42,7 @@ addTestSuiteExtendingForDir('ee10LatestDepTest', 'latestDepTest', 'test/ee10') forbiddenApisMain_java17 { failOnMissingClasses = false } - -compileTestGroovy { +tasks.withType(GroovyCompile).configureEach { javaLauncher = getJavaLauncherFor(17) } @@ -70,6 +69,9 @@ dependencies { testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3')) testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0') + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-11") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-12") testImplementation testFixtures(project(':dd-java-agent:appsec')) testRuntimeOnly project(':dd-java-agent:instrumentation:jetty-9') testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:request-5') diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy index f0c015dc0dd..f2ea9992f2f 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy @@ -7,7 +7,7 @@ import org.eclipse.jetty.server.Server class Jetty12Test extends HttpServerTest implements TestingGenericHttpNamingConventions.ServerV0 { @Override HttpServer server() { - new JettyServer(JettyServer.servletHandler(TestServlet5)) + new JettyServer(JettyServer.servletHandler(TestServlet5), useWebsocketPojoEndpoint()) } @Override @@ -49,4 +49,13 @@ class Jetty12Test extends HttpServerTest implements TestingGenericHttpNa boolean hasExtraErrorInformation() { true } + protected boolean useWebsocketPojoEndpoint() { + false + } +} + +class Jetty12PojoWebsocketTest extends Jetty12Test { + protected boolean useWebsocketPojoEndpoint() { + true + } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/JettyServer.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/JettyServer.groovy index 7f523f8e1bd..1aa5e81305b 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/JettyServer.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/JettyServer.groovy @@ -7,7 +7,11 @@ import jakarta.websocket.CloseReason import jakarta.websocket.Endpoint import jakarta.websocket.EndpointConfig import jakarta.websocket.MessageHandler +import jakarta.websocket.OnClose +import jakarta.websocket.OnMessage +import jakarta.websocket.OnOpen import jakarta.websocket.Session +import jakarta.websocket.server.ServerEndpoint import jakarta.websocket.server.ServerEndpointConfig import org.eclipse.jetty.ee10.servlet.ErrorHandler import org.eclipse.jetty.ee10.servlet.ServletContextHandler @@ -25,11 +29,12 @@ class JettyServer implements WebsocketServer { def port = 0 final server = new Server(0) // select random open port - JettyServer(ServletContextHandler handler) { + JettyServer(ServletContextHandler handler, usePojoWebsocketHandler = false) { server.handler = handler server.addBean(errorHandler) + def endpointClass = usePojoWebsocketHandler ? PojoEndpoint : WsEndpoint JakartaWebSocketServletContainerInitializer.configure(handler, (servletContext, container) -> { - container.addEndpoint(ServerEndpointConfig.Builder.create(WsEndpoint.class, "/websocket").build()) + container.addEndpoint(ServerEndpointConfig.Builder.create(endpointClass, "/websocket").build()) }) } @@ -82,9 +87,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendText(String[] messages) { if (messages.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendText(messages[0]) + Lock.activeSession.getBasicRemote().sendText(messages[0]) } else { - def remoteEndpoint = WsEndpoint.activeSession.getBasicRemote() + def remoteEndpoint = Lock.activeSession.getBasicRemote() for (int i = 0; i < messages.length; i++) { remoteEndpoint.sendText(messages[i], i == messages.length - 1) } @@ -94,9 +99,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendBinary(byte[][] binaries) { if (binaries.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) + Lock.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) } else { - try (def stream = WsEndpoint.activeSession.getBasicRemote().getSendStream()) { + try (def stream = Lock.activeSession.getBasicRemote().getSendStream()) { binaries.each { stream.write(it) } } } @@ -104,10 +109,10 @@ class JettyServer implements WebsocketServer { @Override synchronized void awaitConnected() { - synchronized (WsEndpoint) { + synchronized (Lock) { try { - while (WsEndpoint.activeSession == null) { - WsEndpoint.wait() + while (Lock.activeSession == null) { + Lock.wait() } } catch (InterruptedException ie) { Thread.currentThread().interrupt() @@ -117,14 +122,14 @@ class JettyServer implements WebsocketServer { @Override void serverClose() { - WsEndpoint.activeSession?.close() - WsEndpoint.activeSession = null + Lock.activeSession?.close() + Lock.activeSession = null } @Override void setMaxPayloadSize(int size) { - WsEndpoint.activeSession?.setMaxTextMessageBufferSize(size) - WsEndpoint.activeSession?.setMaxBinaryMessageBufferSize(size) + Lock.activeSession?.setMaxTextMessageBufferSize(size) + Lock.activeSession?.setMaxBinaryMessageBufferSize(size) } @Override @@ -132,33 +137,64 @@ class JettyServer implements WebsocketServer { false } - static class WsEndpoint extends Endpoint { + static class Lock { static Session activeSession + } + + @ServerEndpoint("/websocket") + static class PojoEndpoint { + + @OnOpen + void onOpen(Session session) { + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() + } + } + + @OnMessage + void onText(String text, Session session, boolean last) { + runUnderTrace("onRead", {}) + + } + + @OnMessage + void onBytes(byte[] binary) { + runUnderTrace("onRead", {}) + } + + @OnClose + void onClose() { + Lock.activeSession = null + } + } + + static class WsEndpoint extends Endpoint { @Override void onOpen(Session session, EndpointConfig endpointConfig) { session.addMessageHandler(new MessageHandler.Partial() { @Override - void onMessage(String s, boolean last) { - // jetty does not respect at all limiting the payload so we have to simulate it in few tests + void onMessage(String s, boolean b) { runUnderTrace("onRead", {}) } }) - session.addMessageHandler(new MessageHandler.Partial() { + session.addMessageHandler(new MessageHandler.Whole() { + @Override - void onMessage(byte[] b, boolean last) { + void onMessage(ByteBuffer buffer) { runUnderTrace("onRead", {}) } }) - activeSession = session - synchronized (WsEndpoint) { - WsEndpoint.notifyAll() + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() } } @Override void onClose(Session session, CloseReason closeReason) { - activeSession = null + Lock.activeSession = null } } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy index 9dc09f282c1..d47f9cad800 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy @@ -9,7 +9,7 @@ import javax.servlet.Servlet abstract class Jetty12Test extends HttpServerTest implements TestingGenericHttpNamingConventions.ServerV0 { @Override HttpServer server() { - new JettyServer(JettyServer.servletHandler(servletClass())) + new JettyServer(JettyServer.servletHandler(servletClass()), useWebsocketPojoEndpoint()) } protected abstract Class servletClass() @@ -53,6 +53,9 @@ abstract class Jetty12Test extends HttpServerTest implements TestingGene boolean testSessionId() { true } + protected boolean useWebsocketPojoEndpoint() { + false + } } class Jetty12SyncTest extends Jetty12Test { @@ -77,4 +80,8 @@ class Jetty12AsyncTest extends Jetty12Test { boolean testTimeout() { true } + @Override + protected boolean useWebsocketPojoEndpoint() { + true + } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/JettyServer.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/JettyServer.groovy index 9170a6d606c..b7f11c3238e 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/JettyServer.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/JettyServer.groovy @@ -14,7 +14,11 @@ import javax.websocket.CloseReason import javax.websocket.Endpoint import javax.websocket.EndpointConfig import javax.websocket.MessageHandler +import javax.websocket.OnClose +import javax.websocket.OnMessage +import javax.websocket.OnOpen import javax.websocket.Session +import javax.websocket.server.ServerEndpoint import javax.websocket.server.ServerEndpointConfig import java.nio.ByteBuffer @@ -26,14 +30,15 @@ class JettyServer implements WebsocketServer { def port = 0 final server = new Server(0) // select random open port - JettyServer(ServletContextHandler handler) { + JettyServer(ServletContextHandler handler, usePojoWebsocketHandler = false) { final sessionHandler = new SessionHandler() sessionHandler.handler = handler server.handler = sessionHandler server.addBean(errorHandler) server.addBean(sessionHandler.sessionIdManager, true) + def endpointClass = usePojoWebsocketHandler ? PojoEndpoint : WsEndpoint JavaxWebSocketServletContainerInitializer.configure(handler, (servletContext, container) -> { - container.addEndpoint(ServerEndpointConfig.Builder.create(WsEndpoint.class, "/websocket").build()) + container.addEndpoint(ServerEndpointConfig.Builder.create(endpointClass, "/websocket").build()) }) } @@ -87,9 +92,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendText(String[] messages) { if (messages.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendText(messages[0]) + Lock.activeSession.getBasicRemote().sendText(messages[0]) } else { - def remoteEndpoint = WsEndpoint.activeSession.getBasicRemote() + def remoteEndpoint = Lock.activeSession.getBasicRemote() for (int i = 0; i < messages.length; i++) { remoteEndpoint.sendText(messages[i], i == messages.length - 1) } @@ -99,9 +104,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendBinary(byte[][] binaries) { if (binaries.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) + Lock.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) } else { - try (def stream = WsEndpoint.activeSession.getBasicRemote().getSendStream()) { + try (def stream = Lock.activeSession.getBasicRemote().getSendStream()) { binaries.each { stream.write(it) } } } @@ -109,10 +114,10 @@ class JettyServer implements WebsocketServer { @Override synchronized void awaitConnected() { - synchronized (WsEndpoint) { + synchronized (Lock) { try { - while (WsEndpoint.activeSession == null) { - WsEndpoint.wait() + while (Lock.activeSession == null) { + Lock.wait() } } catch (InterruptedException ie) { Thread.currentThread().interrupt() @@ -122,14 +127,14 @@ class JettyServer implements WebsocketServer { @Override void serverClose() { - WsEndpoint.activeSession?.close() - WsEndpoint.activeSession = null + Lock.activeSession?.close() + Lock.activeSession = null } @Override void setMaxPayloadSize(int size) { - WsEndpoint.activeSession?.setMaxTextMessageBufferSize(size) - WsEndpoint.activeSession?.setMaxBinaryMessageBufferSize(size) + Lock.activeSession?.setMaxTextMessageBufferSize(size) + Lock.activeSession?.setMaxBinaryMessageBufferSize(size) } @Override @@ -137,33 +142,64 @@ class JettyServer implements WebsocketServer { false } - static class WsEndpoint extends Endpoint { + static class Lock { static Session activeSession + } + + @ServerEndpoint("/websocket") + static class PojoEndpoint { + + @OnOpen + void onOpen(Session session) { + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() + } + } + + @OnMessage + void onText(String text, Session session, boolean last) { + runUnderTrace("onRead", {}) + + } + + @OnMessage + void onBytes(byte[] binary) { + runUnderTrace("onRead", {}) + } + + @OnClose + void onClose() { + Lock.activeSession = null + } + } + + static class WsEndpoint extends Endpoint { @Override void onOpen(Session session, EndpointConfig endpointConfig) { session.addMessageHandler(new MessageHandler.Partial() { @Override - void onMessage(String s, boolean last) { - // jetty does not respect at all limiting the payload so we have to simulate it in few tests + void onMessage(String s, boolean b) { runUnderTrace("onRead", {}) } }) - session.addMessageHandler(new MessageHandler.Partial() { + session.addMessageHandler(new MessageHandler.Whole() { + @Override - void onMessage(byte[] b, boolean last) { + void onMessage(ByteBuffer buffer) { runUnderTrace("onRead", {}) } }) - activeSession = session - synchronized (WsEndpoint) { - WsEndpoint.notifyAll() + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() } } @Override void onClose(Session session, CloseReason closeReason) { - activeSession = null + Lock.activeSession = null } } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy index 56088d10ca8..a1977de40c8 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy @@ -7,7 +7,7 @@ import org.eclipse.jetty.server.Server class Jetty12Test extends HttpServerTest implements TestingGenericHttpNamingConventions.ServerV1 { @Override HttpServer server() { - new JettyServer(JettyServer.servletHandler(TestServlet5)) + new JettyServer(JettyServer.servletHandler(TestServlet5), useWebsocketPojoEndpoint()) } @Override @@ -49,4 +49,14 @@ class Jetty12Test extends HttpServerTest implements TestingGenericHttpNa boolean testExceptionBody() { false } + + protected boolean useWebsocketPojoEndpoint() { + false + } +} + +class Jetty12PojoWebsocketTest extends Jetty12Test { + protected boolean useWebsocketPojoEndpoint() { + true + } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/JettyServer.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/JettyServer.groovy index 5baad3db396..367bcb3da59 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/JettyServer.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/JettyServer.groovy @@ -7,7 +7,11 @@ import jakarta.websocket.CloseReason import jakarta.websocket.Endpoint import jakarta.websocket.EndpointConfig import jakarta.websocket.MessageHandler +import jakarta.websocket.OnClose +import jakarta.websocket.OnMessage +import jakarta.websocket.OnOpen import jakarta.websocket.Session +import jakarta.websocket.server.ServerEndpoint import jakarta.websocket.server.ServerEndpointConfig import org.eclipse.jetty.ee9.nested.ErrorHandler import org.eclipse.jetty.ee9.servlet.ServletContextHandler @@ -24,11 +28,12 @@ class JettyServer implements WebsocketServer { def port = 0 final server = new Server(0) // select random open port - JettyServer(ServletContextHandler handler) { + JettyServer(ServletContextHandler handler, usePojoWebsocketHandler = false) { server.handler = handler server.addBean(errorHandler) + def endpointClass = usePojoWebsocketHandler ? PojoEndpoint : WsEndpoint JakartaWebSocketServletContainerInitializer.configure(handler, (servletContext, container) -> { - container.addEndpoint(ServerEndpointConfig.Builder.create(WsEndpoint.class, "/websocket").build()) + container.addEndpoint(ServerEndpointConfig.Builder.create(endpointClass, "/websocket").build()) }) } @@ -81,9 +86,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendText(String[] messages) { if (messages.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendText(messages[0]) + Lock.activeSession.getBasicRemote().sendText(messages[0]) } else { - def remoteEndpoint = WsEndpoint.activeSession.getBasicRemote() + def remoteEndpoint = Lock.activeSession.getBasicRemote() for (int i = 0; i < messages.length; i++) { remoteEndpoint.sendText(messages[i], i == messages.length - 1) } @@ -93,9 +98,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendBinary(byte[][] binaries) { if (binaries.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) + Lock.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) } else { - try (def stream = WsEndpoint.activeSession.getBasicRemote().getSendStream()) { + try (def stream = Lock.activeSession.getBasicRemote().getSendStream()) { binaries.each { stream.write(it) } } } @@ -103,10 +108,10 @@ class JettyServer implements WebsocketServer { @Override synchronized void awaitConnected() { - synchronized (WsEndpoint) { + synchronized (Lock) { try { - while (WsEndpoint.activeSession == null) { - WsEndpoint.wait() + while (Lock.activeSession == null) { + Lock.wait() } } catch (InterruptedException ie) { Thread.currentThread().interrupt() @@ -116,14 +121,14 @@ class JettyServer implements WebsocketServer { @Override void serverClose() { - WsEndpoint.activeSession?.close() - WsEndpoint.activeSession = null + Lock.activeSession?.close() + Lock.activeSession = null } @Override void setMaxPayloadSize(int size) { - WsEndpoint.activeSession?.setMaxTextMessageBufferSize(size) - WsEndpoint.activeSession?.setMaxBinaryMessageBufferSize(size) + Lock.activeSession?.setMaxTextMessageBufferSize(size) + Lock.activeSession?.setMaxBinaryMessageBufferSize(size) } @Override @@ -131,33 +136,64 @@ class JettyServer implements WebsocketServer { false } - static class WsEndpoint extends Endpoint { + static class Lock { static Session activeSession + } + + @ServerEndpoint("/websocket") + static class PojoEndpoint { + + @OnOpen + void onOpen(Session session) { + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() + } + } + + @OnMessage + void onText(String text, Session session, boolean last) { + runUnderTrace("onRead", {}) + + } + + @OnMessage + void onBytes(byte[] binary) { + runUnderTrace("onRead", {}) + } + + @OnClose + void onClose() { + Lock.activeSession = null + } + } + + static class WsEndpoint extends Endpoint { @Override void onOpen(Session session, EndpointConfig endpointConfig) { session.addMessageHandler(new MessageHandler.Partial() { @Override - void onMessage(String s, boolean last) { - // jetty does not respect at all limiting the payload so we have to simulate it in few tests + void onMessage(String s, boolean b) { runUnderTrace("onRead", {}) } }) - session.addMessageHandler(new MessageHandler.Partial() { + session.addMessageHandler(new MessageHandler.Whole() { + @Override - void onMessage(byte[] b, boolean last) { + void onMessage(ByteBuffer buffer) { runUnderTrace("onRead", {}) } }) - activeSession = session - synchronized (WsEndpoint) { - WsEndpoint.notifyAll() + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() } } @Override void onClose(Session session, CloseReason closeReason) { - activeSession = null + Lock.activeSession = null } } } diff --git a/dd-java-agent/instrumentation/jetty-9/build.gradle b/dd-java-agent/instrumentation/jetty-9/build.gradle index 4114dc46eae..de8c939dab4 100644 --- a/dd-java-agent/instrumentation/jetty-9/build.gradle +++ b/dd-java-agent/instrumentation/jetty-9/build.gradle @@ -154,6 +154,7 @@ dependencies { } main_jetty10CompileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.0.0' + main_jetty10CompileOnly project(':internal-api') main_jetty10CompileOnly project(':dd-java-agent:agent-tooling') main_jetty10CompileOnly project(':dd-java-agent:agent-bootstrap') @@ -183,6 +184,7 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:jetty-appsec-8.1.3') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10') testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3')) testFixturesImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3')) testImplementation testFixtures(project(':dd-java-agent:appsec')) diff --git a/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java b/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java index 44024246627..9057949dc62 100644 --- a/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-9/src/main/java/datadog/trace/instrumentation/jetty9/WebSocketSessionInstrumentation.java @@ -9,6 +9,7 @@ import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.api.InstrumenterConfig; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; @@ -22,7 +23,7 @@ public class WebSocketSessionInstrumentation extends InstrumenterModule.Tracing implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { public WebSocketSessionInstrumentation() { - super("jetty", "jetty-websocket"); + super("jetty", "jetty-websocket", "websocket"); } @Override @@ -47,6 +48,11 @@ public ElementMatcher.Junction classLoaderMatcher() { return hasClassNamed("org.eclipse.jetty.websocket.jsr356.JsrSession"); } + @Override + protected boolean defaultEnabled() { + return InstrumenterConfig.get().isWebsocketTracingEnabled(); + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/jetty-9/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy b/dd-java-agent/instrumentation/jetty-9/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy index 46cb709d200..35b4b2c2e51 100644 --- a/dd-java-agent/instrumentation/jetty-9/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy +++ b/dd-java-agent/instrumentation/jetty-9/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy @@ -12,7 +12,7 @@ abstract class Jetty9Test extends HttpServerTest { @Override HttpServer server() { - new JettyServer(handler()) + new JettyServer(handler(), useWebsocketPojoEndpoint()) } AbstractHandler handler() { @@ -29,6 +29,11 @@ abstract class Jetty9Test extends HttpServerTest { operation() } + protected boolean useWebsocketPojoEndpoint() { + // only supported in jetty 10+ + isLatestDepTest + } + @Override protected boolean enabledFinishTimingChecks() { @@ -95,4 +100,8 @@ class Jetty9V0ForkedTest extends Jetty9Test implements TestingGenericHttpNamingC } class Jetty9V1ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV1 { + @Override + protected boolean useWebsocketPojoEndpoint() { + false + } } diff --git a/dd-java-agent/instrumentation/jetty-9/src/testFixtures/groovy/test/JettyServer.groovy b/dd-java-agent/instrumentation/jetty-9/src/testFixtures/groovy/test/JettyServer.groovy index 21034f45255..24922c6d5dd 100644 --- a/dd-java-agent/instrumentation/jetty-9/src/testFixtures/groovy/test/JettyServer.groovy +++ b/dd-java-agent/instrumentation/jetty-9/src/testFixtures/groovy/test/JettyServer.groovy @@ -8,7 +8,11 @@ import javax.websocket.CloseReason import javax.websocket.Endpoint import javax.websocket.EndpointConfig import javax.websocket.MessageHandler +import javax.websocket.OnClose +import javax.websocket.OnMessage +import javax.websocket.OnOpen import javax.websocket.Session +import javax.websocket.server.ServerEndpoint import javax.websocket.server.ServerEndpointConfig import java.nio.ByteBuffer @@ -19,19 +23,20 @@ class JettyServer implements WebsocketServer { final server = new Server(0) // select random open port def websocketAvailable = true - JettyServer(AbstractHandler handler) { + JettyServer(AbstractHandler handler, final boolean usePojoWebsocketHandler = false) { server.setHandler(handler) + def endpointClass = usePojoWebsocketHandler ? PojoEndpoint : WsEndpoint try { def container = ("org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer" as Class)."configureContext"(handler) - container."addEndpoint"(ServerEndpointConfig.Builder.create(WsEndpoint.class, "/websocket").build()) + container."addEndpoint"(ServerEndpointConfig.Builder.create(endpointClass, "/websocket").build()) - } catch (Throwable t) { + } catch (Throwable ignored) { try { ("org.eclipse.jetty.websocket.javax.server.config.JavaxWebSocketServletContainerInitializer" as Class)."configure"(handler, { servletContext, container -> - container.addEndpoint(ServerEndpointConfig.Builder.create(WsEndpoint.class, "/websocket").build()) + container.addEndpoint(ServerEndpointConfig.Builder.create(endpointClass, "/websocket").build()) }) - } catch (Throwable tt) { + } catch (Throwable ignored2) { websocketAvailable = false } } @@ -62,9 +67,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendText(String[] messages) { if (messages.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendText(messages[0]) + Lock.activeSession.getBasicRemote().sendText(messages[0]) } else { - def remoteEndpoint = WsEndpoint.activeSession.getBasicRemote() + def remoteEndpoint = Lock.activeSession.getBasicRemote() for (int i = 0; i < messages.length; i++) { remoteEndpoint.sendText(messages[i], i == messages.length - 1) } @@ -74,9 +79,9 @@ class JettyServer implements WebsocketServer { @Override void serverSendBinary(byte[][] binaries) { if (binaries.length == 1) { - WsEndpoint.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) + Lock.activeSession.getBasicRemote().sendBinary(ByteBuffer.wrap(binaries[0])) } else { - try (def stream = WsEndpoint.activeSession.getBasicRemote().getSendStream()) { + try (def stream = Lock.activeSession.getBasicRemote().getSendStream()) { binaries.each { stream.write(it) } } } @@ -84,10 +89,10 @@ class JettyServer implements WebsocketServer { @Override synchronized void awaitConnected() { - synchronized (WsEndpoint) { + synchronized (Lock) { try { - while (WsEndpoint.activeSession == null) { - WsEndpoint.wait() + while (Lock.activeSession == null) { + Lock.wait() } } catch (InterruptedException ie) { Thread.currentThread().interrupt() @@ -97,14 +102,14 @@ class JettyServer implements WebsocketServer { @Override void serverClose() { - WsEndpoint.activeSession?.close() - WsEndpoint.activeSession = null + Lock.activeSession?.close() + Lock.activeSession = null } @Override void setMaxPayloadSize(int size) { - WsEndpoint.activeSession?.setMaxTextMessageBufferSize(size) - WsEndpoint.activeSession?.setMaxBinaryMessageBufferSize(size) + Lock.activeSession?.setMaxTextMessageBufferSize(size) + Lock.activeSession?.setMaxBinaryMessageBufferSize(size) } @Override @@ -112,33 +117,64 @@ class JettyServer implements WebsocketServer { false } - static class WsEndpoint extends Endpoint { + static class Lock { static Session activeSession + } + + @ServerEndpoint("/websocket") + static class PojoEndpoint { + + @OnOpen + void onOpen(Session session) { + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() + } + } + + @OnMessage + void onText(String text, Session session, boolean last) { + runUnderTrace("onRead", {}) + + } + + @OnMessage + void onBytes(byte[] binary) { + runUnderTrace("onRead", {}) + } + + @OnClose + void onClose() { + Lock.activeSession = null + } + } + + static class WsEndpoint extends Endpoint { @Override void onOpen(Session session, EndpointConfig endpointConfig) { session.addMessageHandler(new MessageHandler.Partial() { @Override - void onMessage(String s, boolean last) { - // jetty does not respect at all limiting the payload so we have to simulate it in few tests + void onMessage(String s, boolean b) { runUnderTrace("onRead", {}) } }) - session.addMessageHandler(new MessageHandler.Partial() { + session.addMessageHandler(new MessageHandler.Whole() { + @Override - void onMessage(byte[] b, boolean last) { + void onMessage(ByteBuffer buffer) { runUnderTrace("onRead", {}) } }) - activeSession = session - synchronized (WsEndpoint) { - WsEndpoint.notifyAll() + Lock.activeSession = session + synchronized (Lock) { + Lock.notifyAll() } } @Override void onClose(Session session, CloseReason closeReason) { - activeSession = null + Lock.activeSession = null } } } diff --git a/dd-java-agent/instrumentation/websocket/gradle.lockfile b/dd-java-agent/instrumentation/websocket/gradle.lockfile new file mode 100644 index 00000000000..a4c954676d8 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/gradle.lockfile @@ -0,0 +1,158 @@ +# 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,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +ch.qos.logback:logback-classic:1.2.3=testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-core:1.2.3=testCompileClasspath,testRuntimeClasspath +com.beust:jcommander:1.78=testRuntimeClasspath +com.blogspot.mydailyjava:weak-lock-free:0.17=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=compileClasspath,instrumentPluginClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.2.0=compileClasspath,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=testCompileClasspath,testRuntimeClasspath +com.google.auto.service:auto-service-annotations:1.0-rc7=annotationProcessor,compileClasspath,testAnnotationProcessor,testCompileClasspath +com.google.auto.service:auto-service:1.0-rc7=annotationProcessor,testAnnotationProcessor +com.google.auto:auto-common:0.10=annotationProcessor,testAnnotationProcessor +com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,spotbugs,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath +com.google.code.gson:gson:2.9.1=spotbugs +com.google.errorprone:error_prone_annotations:2.2.0=annotationProcessor,testAnnotationProcessor +com.google.guava:failureaccess:1.0.1=annotationProcessor,testAnnotationProcessor +com.google.guava:guava:20.0=testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:27.0.1-jre=annotationProcessor,testAnnotationProcessor +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,testAnnotationProcessor +com.google.j2objc:j2objc-annotations:1.1=annotationProcessor,testAnnotationProcessor +com.google.re2j:re2j:1.7=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,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=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.thoughtworks.qdox:qdox:1.12.1=testRuntimeClasspath +commons-codec:commons-codec:1.15=spotbugs +commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testRuntimeClasspath +commons-io:commons-io:2.11.0=testCompileClasspath,testRuntimeClasspath +de.thetaphi:forbiddenapis:3.8=compileClasspath +info.picocli:picocli:4.6.3=testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=testRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=testCompileClasspath,testRuntimeClasspath +jaxen:jaxen:1.2.0=spotbugs +jline:jline:2.14.6=testRuntimeClasspath +junit:junit-dep:4.11=testCompileClasspath,testRuntimeClasspath +junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.14.18=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.jcip:jcip-annotations:1.0=compileClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +net.sf.saxon:Saxon-HE:11.4=spotbugs +org.apache.ant:ant-antlr:1.10.12=testRuntimeClasspath +org.apache.ant:ant-antlr:1.9.15=codenarc +org.apache.ant:ant-junit:1.10.12=testRuntimeClasspath +org.apache.ant:ant-junit:1.9.15=codenarc +org.apache.ant:ant-launcher:1.10.12=testRuntimeClasspath +org.apache.ant:ant:1.10.12=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=testCompileClasspath,testRuntimeClasspath +org.checkerframework:checker-qual:2.5.2=annotationProcessor,testAnnotationProcessor +org.codehaus.groovy:groovy-all:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-ant:2.5.14=codenarc +org.codehaus.groovy:groovy-ant:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-astbuilder:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-cli-picocli:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-console:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-datetime:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-docgenerator:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovydoc:2.5.14=codenarc +org.codehaus.groovy:groovy-groovydoc:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovysh:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jmx:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-json:2.5.14=codenarc +org.codehaus.groovy:groovy-json:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jsr223:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-macro:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-nio:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-servlet:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-sql:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-swing:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-templates:2.5.14=codenarc +org.codehaus.groovy:groovy-templates:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test-junit5:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-testng:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-xml:2.5.14=codenarc +org.codehaus.groovy:groovy-xml:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy:2.5.14=codenarc +org.codehaus.groovy:groovy:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.mojo:animal-sniffer-annotations:1.17=annotationProcessor,testAnnotationProcessor +org.codenarc:CodeNarc:2.2.0=codenarc +org.dom4j:dom4j:2.1.3=spotbugs +org.eclipse.jetty:jetty-http:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.gmetrics:GMetrics:1.1=codenarc +org.hamcrest:hamcrest-core:1.3=testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest:2.2=testCompileClasspath,testRuntimeClasspath +org.jctools:jctools-core:3.3.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.9.2=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.9.0=testCompileClasspath +org.junit.platform:junit-platform-commons:1.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.9.0=testCompileClasspath +org.junit.platform:junit-platform-engine:1.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-runner:1.9.0=testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=testRuntimeClasspath +org.junit:junit-bom:5.9.0=testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +org.objenesis:objenesis:3.3=testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.7.1=testRuntimeClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.7.1=testRuntimeClasspath +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.7.1=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=compileClasspath,instrumentPluginClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath +org.slf4j:slf4j-api:1.7.32=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=testCompileClasspath,testRuntimeClasspath +org.spockframework:spock-junit4:2.2-groovy-3.0=testCompileClasspath,testRuntimeClasspath +org.testng:testng:7.5=testRuntimeClasspath +org.webjars:jquery:3.5.1=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/websocket/jakarta-websocket-2.0/gradle.lockfile b/dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/gradle.lockfile new file mode 100644 index 00000000000..d691308bf02 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/gradle.lockfile @@ -0,0 +1,184 @@ +# 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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,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,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.sun.activation:jakarta.activation:2.0.0=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.8=compileClasspath +info.picocli:picocli:4.6.3=latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +jakarta.activation:jakarta.activation-api:2.1.3=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.websocket:jakarta.websocket-api:2.0.0=testCompileClasspath,testRuntimeClasspath +jakarta.websocket:jakarta.websocket-api:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.websocket:jakarta.websocket-client-api:2.0.0=compileClasspath +jakarta.websocket:jakarta.websocket-client-api:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.xml.bind:jakarta.xml.bind-api:3.0.0=testCompileClasspath,testRuntimeClasspath +jakarta.xml.bind:jakarta.xml.bind-api:4.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +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.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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-http:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-framework:3.0.0-M1=testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-framework:4.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.grizzly:grizzly-http-server:3.0.0-M1=testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-http-server:4.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.grizzly:grizzly-http:3.0.0-M1=testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-http:4.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-client:2.0.0=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-client:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-container-grizzly-client:2.0.0=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-container-grizzly-client:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-container-inmemory:2.0.0=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-container-inmemory:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-core:2.0.0=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-core:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-server:2.0.0=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-server:2.2.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-spi:2.0.0=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-spi:2.2.0=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,main_java11RuntimeClasspath,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.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +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,main_java11CompileClasspath,main_java11RuntimeClasspath,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=main_java11AnnotationProcessor,spotbugsPlugins diff --git a/dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/src/test/groovy/WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/src/test/groovy/WebsocketTest.groovy index a2644fab0d5..49d90933609 100644 --- a/dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/src/test/groovy/WebsocketTest.groovy +++ b/dd-java-agent/instrumentation/websocket/jakarta-websocket-2.0/src/test/groovy/WebsocketTest.groovy @@ -1,34 +1,34 @@ -import static datadog.trace.agent.test.base.HttpServerTest.someBytes -import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan -import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan -import static datadog.trace.agent.test.base.HttpServerTest.websocketSendSpan -import static datadog.trace.agent.test.utils.TraceUtils.basicSpan -import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_CLASSES_EXCLUDE -import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED -import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING -import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES -import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_TAG_SESSION_ID -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan - import datadog.trace.agent.test.AgentTestRunner import datadog.trace.api.DDTags import datadog.trace.bootstrap.instrumentation.api.AgentSpan import datadog.trace.bootstrap.instrumentation.api.InstrumentationTags import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.core.DDSpan -import net.bytebuddy.utility.RandomString -import org.glassfish.tyrus.container.inmemory.InMemoryClientContainer -import org.glassfish.tyrus.server.TyrusServerConfiguration - import jakarta.websocket.ClientEndpointConfig import jakarta.websocket.CloseReason import jakarta.websocket.ContainerProvider import jakarta.websocket.Endpoint import jakarta.websocket.server.ServerApplicationConfig import jakarta.websocket.server.ServerEndpointConfig +import net.bytebuddy.utility.RandomString +import org.glassfish.tyrus.container.inmemory.InMemoryClientContainer +import org.glassfish.tyrus.server.TyrusServerConfiguration + import java.nio.ByteBuffer +import static datadog.trace.agent.test.base.HttpServerTest.someBytes +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketSendSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_CLASSES_EXCLUDE +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_INHERIT_SAMPLING +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_SEPARATE_TRACES +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_TAG_SESSION_ID +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan + class WebsocketTest extends AgentTestRunner { @Override diff --git a/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/gradle.lockfile b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/gradle.lockfile new file mode 100644 index 00000000000..be30b3b3456 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/javax-websocket-1.0/gradle.lockfile @@ -0,0 +1,180 @@ +# 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.2.2=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=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.17=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=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.8=compileClasspath +info.picocli:picocli:4.6.3=latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +jakarta.websocket:jakarta.websocket-api:1.1.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +javax.websocket:javax.websocket-api:1.0=testCompileClasspath,testRuntimeClasspath +javax.websocket:javax.websocket-api:1.0-rc1=compileClasspath +javax.websocket:javax.websocket-client-api:1.0-rc1=compileClasspath +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.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=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-http:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:9.4.56.v20240826=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-framework:2.3.7=testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-framework:2.4.4=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.grizzly:grizzly-http-server:2.3.7=testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-http-server:2.4.4=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.grizzly:grizzly-http:2.3.7=testCompileClasspath,testRuntimeClasspath +org.glassfish.grizzly:grizzly-http:2.4.4=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-client:1.21=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-client:1.3.1=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-container-grizzly-client:1.21=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-container-grizzly-client:1.3.1=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-container-inmemory:1.21=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-container-inmemory:1.3.1=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-core:1.21=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-core:1.3.1=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-server:1.21=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-server:1.3.1=testCompileClasspath,testRuntimeClasspath +org.glassfish.tyrus:tyrus-spi:1.21=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.glassfish.tyrus:tyrus-spi:1.3.1=testCompileClasspath,testRuntimeClasspath +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.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +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,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +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,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +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/websocket/jetty-websocket/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/build.gradle new file mode 100644 index 00000000000..5e69c67bd78 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/build.gradle @@ -0,0 +1 @@ +apply from: "$rootDir/gradle/java.gradle" diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/gradle.lockfile b/dd-java-agent/instrumentation/websocket/jetty-websocket/gradle.lockfile new file mode 100644 index 00000000000..a4c954676d8 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/gradle.lockfile @@ -0,0 +1,158 @@ +# 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,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +ch.qos.logback:logback-classic:1.2.3=testCompileClasspath,testRuntimeClasspath +ch.qos.logback:logback-core:1.2.3=testCompileClasspath,testRuntimeClasspath +com.beust:jcommander:1.78=testRuntimeClasspath +com.blogspot.mydailyjava:weak-lock-free:0.17=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=compileClasspath,instrumentPluginClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.spotbugs:spotbugs-annotations:4.2.0=compileClasspath,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=testCompileClasspath,testRuntimeClasspath +com.google.auto.service:auto-service-annotations:1.0-rc7=annotationProcessor,compileClasspath,testAnnotationProcessor,testCompileClasspath +com.google.auto.service:auto-service:1.0-rc7=annotationProcessor,testAnnotationProcessor +com.google.auto:auto-common:0.10=annotationProcessor,testAnnotationProcessor +com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,spotbugs,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath +com.google.code.gson:gson:2.9.1=spotbugs +com.google.errorprone:error_prone_annotations:2.2.0=annotationProcessor,testAnnotationProcessor +com.google.guava:failureaccess:1.0.1=annotationProcessor,testAnnotationProcessor +com.google.guava:guava:20.0=testCompileClasspath,testRuntimeClasspath +com.google.guava:guava:27.0.1-jre=annotationProcessor,testAnnotationProcessor +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,testAnnotationProcessor +com.google.j2objc:j2objc-annotations:1.1=annotationProcessor,testAnnotationProcessor +com.google.re2j:re2j:1.7=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,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=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.thoughtworks.qdox:qdox:1.12.1=testRuntimeClasspath +commons-codec:commons-codec:1.15=spotbugs +commons-fileupload:commons-fileupload:1.5=testCompileClasspath,testRuntimeClasspath +commons-io:commons-io:2.11.0=testCompileClasspath,testRuntimeClasspath +de.thetaphi:forbiddenapis:3.8=compileClasspath +info.picocli:picocli:4.6.3=testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=testRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=testCompileClasspath,testRuntimeClasspath +jaxen:jaxen:1.2.0=spotbugs +jline:jline:2.14.6=testRuntimeClasspath +junit:junit-dep:4.11=testCompileClasspath,testRuntimeClasspath +junit:junit:4.13.2=testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.14.18=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=compileClasspath,instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.jcip:jcip-annotations:1.0=compileClasspath,spotbugs,testCompileClasspath,testRuntimeClasspath +net.sf.saxon:Saxon-HE:11.4=spotbugs +org.apache.ant:ant-antlr:1.10.12=testRuntimeClasspath +org.apache.ant:ant-antlr:1.9.15=codenarc +org.apache.ant:ant-junit:1.10.12=testRuntimeClasspath +org.apache.ant:ant-junit:1.9.15=codenarc +org.apache.ant:ant-launcher:1.10.12=testRuntimeClasspath +org.apache.ant:ant:1.10.12=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=testCompileClasspath,testRuntimeClasspath +org.checkerframework:checker-qual:2.5.2=annotationProcessor,testAnnotationProcessor +org.codehaus.groovy:groovy-all:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-ant:2.5.14=codenarc +org.codehaus.groovy:groovy-ant:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-astbuilder:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-cli-picocli:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-console:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-datetime:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-docgenerator:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovydoc:2.5.14=codenarc +org.codehaus.groovy:groovy-groovydoc:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-groovysh:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jmx:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-json:2.5.14=codenarc +org.codehaus.groovy:groovy-json:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-jsr223:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-macro:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-nio:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-servlet:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-sql:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-swing:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-templates:2.5.14=codenarc +org.codehaus.groovy:groovy-templates:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test-junit5:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-test:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-testng:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy-xml:2.5.14=codenarc +org.codehaus.groovy:groovy-xml:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.groovy:groovy:2.5.14=codenarc +org.codehaus.groovy:groovy:3.0.17=testCompileClasspath,testRuntimeClasspath +org.codehaus.mojo:animal-sniffer-annotations:1.17=annotationProcessor,testAnnotationProcessor +org.codenarc:CodeNarc:2.2.0=codenarc +org.dom4j:dom4j:2.1.3=spotbugs +org.eclipse.jetty:jetty-http:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:9.4.56.v20240826=testCompileClasspath,testRuntimeClasspath +org.gmetrics:GMetrics:1.1=codenarc +org.hamcrest:hamcrest-core:1.3=testCompileClasspath,testRuntimeClasspath +org.hamcrest:hamcrest:2.2=testCompileClasspath,testRuntimeClasspath +org.jctools:jctools-core:3.3.0=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.9.2=testCompileClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.9.0=testCompileClasspath +org.junit.platform:junit-platform-commons:1.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.9.0=testCompileClasspath +org.junit.platform:junit-platform-engine:1.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.9.2=testRuntimeClasspath +org.junit.platform:junit-platform-runner:1.9.0=testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=testRuntimeClasspath +org.junit:junit-bom:5.9.0=testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +org.objenesis:objenesis:3.3=testCompileClasspath,testRuntimeClasspath +org.opentest4j:opentest4j:1.2.0=testCompileClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.7.1=testRuntimeClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.7.1=testRuntimeClasspath +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.2=instrumentPluginClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.7.1=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=compileClasspath,instrumentPluginClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath +org.slf4j:slf4j-api:1.7.32=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=testCompileClasspath,testRuntimeClasspath +org.spockframework:spock-junit4:2.2-groovy-3.0=testCompileClasspath,testRuntimeClasspath +org.testng:testng:7.5=testRuntimeClasspath +org.webjars:jquery:3.5.1=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/websocket/jetty-websocket/jetty-websocket-10/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle new file mode 100644 index 00000000000..7aa6be1465a --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle @@ -0,0 +1,28 @@ +ext { + minJavaVersionForTests = JavaVersion.VERSION_11 +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuiteForDir("latestDepTest", "test") + +compileMain_java11Java.configure { + setJavaVersion(it, 11) +} +[compileTestGroovy, compileLatestDepTestGroovy].each { + it.javaLauncher = getJavaLauncherFor(11) +} + +dependencies { + main_java11CompileOnly group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' + + testImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.+' + + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:javax-websocket-1.0") + configurations.all { + it.resolutionStrategy { + force libs.slf4j + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/gradle.lockfile b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/gradle.lockfile new file mode 100644 index 00000000000..30bc8c9a686 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/gradle.lockfile @@ -0,0 +1,204 @@ +# 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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,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,main_java11CompileClasspath,main_java11RuntimeClasspath,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.8=compileClasspath +info.picocli:picocli:4.6.3=latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:1.3.5=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.transaction:jakarta.transaction-api:1.3.2=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.transaction:jakarta.transaction-api:1.3.3=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +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.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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.toolchain:jetty-javax-websocket-api:1.1.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.5=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-client:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-client:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-common:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-common:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-server:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-server:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-javax-client:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-javax-client:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-javax-common:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-javax-common:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-javax-server:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-javax-server:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-servlet:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-servlet:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-annotations:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-annotations:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-client:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-client:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-http:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-http:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-io:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-jndi:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-jndi:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-plus:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-plus:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-security:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-security:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-server:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-servlet:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-servlet:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-util:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-webapp:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-webapp:10.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-xml:10.0.0=main_java11CompileClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-xml:10.0.24=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,main_java11RuntimeClasspath,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.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +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.0=main_java11CompileClasspath,testCompileClasspath +org.ow2.asm:asm-analysis:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.0=main_java11CompileClasspath,testCompileClasspath +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.7=latestDepTestCompileClasspath +org.ow2.asm:asm-commons:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.0=main_java11CompileClasspath,testCompileClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.7=latestDepTestCompileClasspath +org.ow2.asm:asm-tree:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.0=main_java11CompileClasspath,testCompileClasspath +org.ow2.asm:asm:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.7=latestDepTestCompileClasspath +org.ow2.asm:asm:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +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,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,spotbugs,spotbugsSlf4j,testCompileClasspath,testRuntimeClasspath +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=main_java11AnnotationProcessor,spotbugsPlugins diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java new file mode 100644 index 00000000000..c45733ba8a3 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java @@ -0,0 +1,29 @@ +package datadog.trace.instrumentation.websocket.jetty10; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import datadog.trace.agent.tooling.Instrumenter; + +public class JavaxWebSocketFrameHandlerFactoryInstrumentation + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + private final String namespace; + + public JavaxWebSocketFrameHandlerFactoryInstrumentation(final String namespace) { + this.namespace = namespace; + } + + @Override + public String instrumentedType() { + return namespace + "WebSocketFrameHandlerFactory"; + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + named("createMessageSink") + .and(takesArgument(0, named(namespace + "WebSocketSession"))) + .and(takesArgument(1, named(namespace + "WebSocketMessageMetadata"))), + "datadog.trace.instrumentation.websocket.jetty10.WebsocketAdvices$MessageSinkAdvice"); + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerInstrumentation.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerInstrumentation.java new file mode 100644 index 00000000000..596a4c3d447 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerInstrumentation.java @@ -0,0 +1,39 @@ +package datadog.trace.instrumentation.websocket.jetty10; + +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import datadog.trace.agent.tooling.Instrumenter; +import java.lang.invoke.MethodHandle; + +public class JavaxWebSocketFrameHandlerInstrumentation + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + private final String namespace; + + public JavaxWebSocketFrameHandlerInstrumentation(final String namespace) { + this.namespace = namespace; + } + + @Override + public String instrumentedType() { + return namespace + "WebSocketFrameHandler"; + } + + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + isConstructor() + .and(takesArguments(9)) + .and(takesArgument(1, Object.class)) + .and(takesArgument(2, MethodHandle.class)) + .and(takesArgument(3, MethodHandle.class)), + "datadog.trace.instrumentation.websocket.jetty10.WebSocketAdvices$OpenClose9Advice"); + transformer.applyAdvice( + isConstructor() + .and(takesArguments(10)) + .and(takesArgument(2, Object.class)) + .and(takesArgument(3, MethodHandle.class)) + .and(takesArgument(4, MethodHandle.class)), + "datadog.trace.instrumentation.websocket.jetty10.WebSocketAdvices$OpenClose10Advice"); + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java new file mode 100644 index 00000000000..896c225fe2b --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java @@ -0,0 +1,55 @@ +package datadog.trace.instrumentation.websocket.jetty10; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.api.InstrumenterConfig; +import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class Jetty10JavaxPojoWebSocketModule extends InstrumenterModule.Tracing { + private final String jsrNamespace; + private final String jettyNamespace; + + public Jetty10JavaxPojoWebSocketModule() { + this("javax", "org.eclipse.jetty.websocket.javax.common.Javax"); + } + + protected Jetty10JavaxPojoWebSocketModule( + final String jsrNamespace, final String jettyNamespace) { + super("jetty", "jetty-websocket", jsrNamespace + "-websocket", "websocket"); + this.jsrNamespace = jsrNamespace; + this.jettyNamespace = jettyNamespace; + } + + @Override + protected boolean defaultEnabled() { + return InstrumenterConfig.get().isWebsocketTracingEnabled(); + } + + @Override + public Map contextStore() { + final Map map = new HashMap<>(); + map.put(jettyNamespace + "WebSocketSession", Boolean.class.getName()); + map.put(jsrNamespace + ".websocket.Session", HandlerContext.Sender.class.getName()); + return map; + } + + @Override + public String[] helperClassNames() { + return new String[] { + "datadog.trace.instrumentation.websocket.jetty10.SyntheticEndpoint", + }; + } + + @Override + public List typeInstrumentations() { + return Arrays.asList( + new JavaxWebSocketFrameHandlerFactoryInstrumentation(jettyNamespace), + new JavaxWebSocketFrameHandlerInstrumentation(jettyNamespace)); + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java new file mode 100644 index 00000000000..81bde95fbc2 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java @@ -0,0 +1,162 @@ +package datadog.trace.instrumentation.websocket.jetty10; + +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.bootstrap.instrumentation.decorator.WebsocketDecorator.DECORATE; + +import datadog.trace.api.Config; +import datadog.trace.bootstrap.CallDepthThreadLocalMap; +import datadog.trace.bootstrap.ContextStore; +import datadog.trace.bootstrap.ExceptionLogger; +import datadog.trace.bootstrap.instrumentation.api.AgentScope; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentTracer; +import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; +import datadog.trace.util.MethodHandles; +import java.lang.invoke.MethodHandle; +import javax.websocket.CloseReason; +import javax.websocket.EndpointConfig; +import javax.websocket.MessageHandler; +import javax.websocket.Session; +import org.eclipse.jetty.websocket.javax.common.JavaxWebSocketSession; + +/** + * This class contains advices for method annotated with OnOpen, OnClose and OnMessage. Unlikely + * other instrumentation, jetty is using method handles to do direct call to these methods. For this + * reason, we need to swap the original handle with those allowing to instrument around method + * invocations. Jetty is also doing argument permutations that ensure that arguments will come in + * the expected order. Jetty is also always bind the Session as argument that is required to look up + * the handshake span. Instrumenting directly @OnMessage methods won't have in all case guarantee to + * have that information since the Session parameter is optional. + */ +public class SyntheticEndpoint { + public static final MethodHandle OPEN_METHOD_HANDLE = + new MethodHandles(SyntheticEndpoint.class.getClassLoader()) + .method( + SyntheticEndpoint.class, + "onOpen", + MethodHandle.class, + ContextStore.class, + ContextStore.class, + JavaxWebSocketSession.class, + EndpointConfig.class); + public static final MethodHandle CLOSE_METHOD_HANDLE = + new MethodHandles(SyntheticEndpoint.class.getClassLoader()) + .method( + SyntheticEndpoint.class, + "onClose", + MethodHandle.class, + ContextStore.class, + Session.class, + CloseReason.class); + public static final MethodHandle MESSAGE_METHOD_HANDLE = + new MethodHandles(SyntheticEndpoint.class.getClassLoader()) + .method( + SyntheticEndpoint.class, + "onMessage", + MethodHandle.class, + JavaxWebSocketSession.class, + HandlerContext.Receiver.class, + ContextStore.class, + Object[].class); + + public static void onOpen( + MethodHandle delegate, + ContextStore sessionStore, + ContextStore specificStore, + JavaxWebSocketSession session, + EndpointConfig config) + throws Throwable { + try { + specificStore.put(session, true); + + final AgentSpan current = AgentTracer.get().activeSpan(); + + if (current != null) { + // we need to force the sampling decision in case the span is linked + if (Config.get().isWebsocketMessagesInheritSampling()) { + current.forceSamplingDecision(); + } + sessionStore.putIfAbsent( + session, new HandlerContext.Sender(current.getLocalRootSpan(), session.getId())); + } + } catch (Throwable t) { + ExceptionLogger.LOGGER.debug("Unforeseen error instrumenting jetty websocket POJO", t); + } finally { + delegate.invoke(session, config); + } + } + + public static void onClose( + MethodHandle delegate, + ContextStore contextStore, + Session session, + CloseReason closeReason) + throws Throwable { + HandlerContext.Sender handlerContext = + contextStore != null && session != null ? contextStore.get(session) : null; + if (handlerContext != null) { + final HandlerContext.Receiver closeContext = + new HandlerContext.Receiver(handlerContext.getHandshakeSpan(), session.getId()); + try (AgentScope ignored = + activateSpan( + DECORATE.onSessionCloseReceived( + closeContext, + closeReason.getReasonPhrase(), + closeReason.getCloseCode().getCode()))) { + delegate.invoke(session, closeReason); + } finally { + DECORATE.onFrameEnd(closeContext); + } + } else { + delegate.invoke(session, closeReason); + } + } + + public static Object onMessage( + MethodHandle delegate, + JavaxWebSocketSession session, + HandlerContext.Receiver handlerContext, + ContextStore contextStore, + Object[] args) + throws Throwable { + AgentSpan wsSpan = null; + if (!Boolean.TRUE.equals(contextStore.get(session))) { + return delegate.invokeWithArguments(args); + } + boolean instrument; + boolean finishSpan = true; + try { + instrument = + handlerContext != null + && args != null + && args.length > 0 + && CallDepthThreadLocalMap.incrementCallDepth(MessageHandler.class) == 0; + boolean partialDelivery; + if (instrument) { + partialDelivery = args.length > 1 && (args[1] instanceof Boolean); + if (partialDelivery) { + finishSpan = (boolean) args[1]; + } + wsSpan = DECORATE.onReceiveFrameStart(handlerContext, args[0], partialDelivery); + } + } catch (Throwable t) { + ExceptionLogger.LOGGER.debug("Unforeseen error instrumenting jetty websocket POJO", t); + } + if (wsSpan != null) { + try (AgentScope ignored = activateSpan(wsSpan)) { + return delegate.invokeWithArguments(args); + } catch (Throwable t) { + finishSpan = true; + DECORATE.onError(wsSpan, t); + + throw t; + } finally { + CallDepthThreadLocalMap.reset(MessageHandler.class); + if (finishSpan) { + DECORATE.onFrameEnd(handlerContext); + } + } + } + return delegate.invokeWithArguments(args); + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java new file mode 100644 index 00000000000..3023deb6630 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java @@ -0,0 +1,98 @@ +package datadog.trace.instrumentation.websocket.jetty10; + +import datadog.trace.bootstrap.ExceptionLogger; +import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentTracer; +import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import javax.websocket.Endpoint; +import javax.websocket.Session; +import net.bytebuddy.asm.Advice; +import org.eclipse.jetty.websocket.javax.common.JavaxWebSocketMessageMetadata; +import org.eclipse.jetty.websocket.javax.common.JavaxWebSocketSession; + +public class WebSocketAdvices { + public static class OpenClose9Advice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Argument(value = 2, readOnly = false) MethodHandle openHandle, + @Advice.Argument(value = 3, readOnly = false) MethodHandle closeHandle, + @Advice.Argument(value = 1) final Object origin) { + + if (origin == null || origin instanceof Endpoint) { + return; + } + openHandle = + MethodHandles.insertArguments( + SyntheticEndpoint.OPEN_METHOD_HANDLE, + 0, + openHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class), + InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); + closeHandle = + MethodHandles.insertArguments( + SyntheticEndpoint.CLOSE_METHOD_HANDLE, + 0, + closeHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); + } + } + + public static class OpenClose10Advice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Argument(value = 3, readOnly = false) MethodHandle openHandle, + @Advice.Argument(value = 4, readOnly = false) MethodHandle closeHandle, + @Advice.Argument(value = 2) final Object origin) { + + if (origin == null || origin instanceof Endpoint) { + return; + } + openHandle = + MethodHandles.insertArguments( + SyntheticEndpoint.OPEN_METHOD_HANDLE, + 0, + openHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class), + InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); + closeHandle = + MethodHandles.insertArguments( + SyntheticEndpoint.CLOSE_METHOD_HANDLE, + 0, + closeHandle, + InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); + } + } + + public static class MessageSinkAdvice { + @Advice.OnMethodEnter(suppress = Throwable.class) + public static void onEnter( + @Advice.Argument(0) final JavaxWebSocketSession session, + @Advice.Argument(1) final JavaxWebSocketMessageMetadata metadata) { + if (metadata == null || metadata.getMethodHandle() == null) { + return; + } + final AgentSpan current = AgentTracer.get().activeSpan(); + + if (current == null) { + return; + } + try { + metadata.setMethodHandle( + MethodHandles.insertArguments( + SyntheticEndpoint.MESSAGE_METHOD_HANDLE, + 0, + metadata.getMethodHandle(), + session, + new HandlerContext.Receiver(current, session.getId()), + InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)) + .asVarargsCollector(Object[].class)); + } catch (Throwable t) { + // log it + ExceptionLogger.LOGGER.debug("Error while mutating MessageSink ", t); + } + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/Endpoints.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/Endpoints.groovy new file mode 100644 index 00000000000..5b15b444baf --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/Endpoints.groovy @@ -0,0 +1,115 @@ +import javax.websocket.CloseReason +import javax.websocket.Endpoint +import javax.websocket.EndpointConfig +import javax.websocket.MessageHandler +import javax.websocket.OnClose +import javax.websocket.OnMessage +import javax.websocket.OnOpen +import javax.websocket.Session +import javax.websocket.server.PathParam +import javax.websocket.server.ServerEndpoint +import java.nio.ByteBuffer + +class Endpoints { + static class TestEndpoint extends Endpoint { + final MessageHandler handler + + TestEndpoint(final MessageHandler handler) { + this.handler = handler + } + + @Override + void onOpen(Session session, EndpointConfig endpointConfig) { + session.addMessageHandler(handler) + } + } + + // Full handlers + static class FullStringHandler implements MessageHandler.Whole { + @Override + void onMessage(String s) { + assert s != null + } + } + + static class FullBytesHandler implements MessageHandler.Whole { + @Override + void onMessage(byte[] b) { + assert b != null + } + } + + static class FullByteBufferHandler implements MessageHandler.Whole { + @Override + void onMessage(ByteBuffer b) { + assert b != null + } + } + + // Partial Handlers + static class PartialStringHandler implements MessageHandler.Partial { + @Override + void onMessage(String s, boolean last) { + assert s != null && last + } + } + + static class PartialBytesHandler implements MessageHandler.Partial { + @Override + void onMessage(byte[] b, boolean last) { + assert b != null && last + } + } + + static class PartialByteBufferHandler implements MessageHandler.Partial { + @Override + void onMessage(ByteBuffer b, boolean last) { + assert b != null && last + } + } + + @ServerEndpoint("/test/{p}") + static class PojoFullEndpoint { + @OnOpen + void onOpen(Session s) { + assert s != null + } + + @OnMessage + void onText(Session s, String payload, @PathParam("p") String param) { + assert s != null && payload != null && param == "param" + } + + @OnMessage + void onBinary(ByteBuffer payload, @PathParam("p") String param) { + assert payload != null && param == "param" + } + + @OnClose + void onClose() { + } + } + + @ServerEndpoint("/test/{p}") + static class PojoPartialEndpoint { + @OnOpen + void onOpen(EndpointConfig cfg, @PathParam("p") String param) { + assert param == "param" && cfg != null + } + + @OnMessage + void onText(Session s, String payload, boolean last) { + assert s != null && payload != null && last + } + + @OnMessage + void onBinary(ByteBuffer payload, boolean last, @PathParam("p") String param) { + assert payload != null && param == "param" && last + } + + @OnClose + void onClose(CloseReason cr, @PathParam("p") String param) { + assert cr != null && param == "param" + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/WebsocketTest.groovy new file mode 100644 index 00000000000..32e1403b0c3 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/test/groovy/WebsocketTest.groovy @@ -0,0 +1,90 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.server.WebSocketMappings +import org.eclipse.jetty.websocket.javax.common.UpgradeRequest +import org.eclipse.jetty.websocket.javax.server.internal.JavaxWebSocketServerContainer +import org.eclipse.jetty.websocket.javax.server.internal.JavaxWebSocketServerFrameHandlerFactory + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JavaxWebSocketServerFrameHandlerFactory factory = new JavaxWebSocketServerFrameHandlerFactory(new JavaxWebSocketServerContainer(new WebSocketMappings())) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJavaxWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new Endpoints.TestEndpoint(new Endpoints.FullStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.PartialStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.FullBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.FullByteBufferHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialByteBufferHandler()) | "binary" + new Endpoints.PojoFullEndpoint() | "text" + new Endpoints.PojoFullEndpoint() | "binary" + new Endpoints.PojoPartialEndpoint() | "text" + new Endpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle new file mode 100644 index 00000000000..8aef2a97bef --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle @@ -0,0 +1,26 @@ +ext { + minJavaVersionForTests = JavaVersion.VERSION_11 +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuite("latestDepTest") + +[compileTestGroovy, compileLatestDepTestGroovy].each { + it.javaLauncher = getJavaLauncherFor(11) +} + +dependencies { + implementation project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") + testImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-jakarta-server', version: '11.0.0' + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-jakarta-server', version: '11.+' + + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0") + + configurations.all { + it.resolutionStrategy { + force libs.slf4j + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/gradle.lockfile b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/gradle.lockfile new file mode 100644 index 00000000000..9a365d93752 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/gradle.lockfile @@ -0,0 +1,205 @@ +# 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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,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,main_java11CompileClasspath,main_java11RuntimeClasspath,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.8=compileClasspath +info.picocli:picocli:4.6.3=latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:2.0.0=testCompileClasspath,testRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:2.1.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.transaction:jakarta.transaction-api:2.0.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.transaction:jakarta.transaction-api:2.0.0-RC1=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.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,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.toolchain:jetty-jakarta-servlet-api:5.0.1=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-client:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-client:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-common:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-common:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-server:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-core-server:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-jakarta-client:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-jakarta-client:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-jakarta-common:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-jakarta-common:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-jakarta-server:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-jakarta-server:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:websocket-servlet:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:websocket-servlet:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-annotations:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-annotations:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-client:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-client:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-http:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-http:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-io:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-jndi:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-jndi:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-plus:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-plus:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-security:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-security:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-server:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-servlet:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-servlet:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-util:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-webapp:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-webapp:11.0.24=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-xml:11.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-xml:11.0.24=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,main_java11RuntimeClasspath,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.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +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.0=testCompileClasspath +org.ow2.asm:asm-analysis:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.0=testCompileClasspath +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.7=latestDepTestCompileClasspath +org.ow2.asm:asm-commons:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.0=testCompileClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.7=latestDepTestCompileClasspath +org.ow2.asm:asm-tree:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.0=testCompileClasspath +org.ow2.asm:asm:9.2=instrumentPluginClasspath,main_java11RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.7=latestDepTestCompileClasspath +org.ow2.asm:asm:9.7.1=latestDepTestRuntimeClasspath,testRuntimeClasspath +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,latestDepTestRuntimeClasspath,main_java11CompileClasspath,main_java11RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,spotbugs,spotbugsSlf4j,testCompileClasspath,testRuntimeClasspath +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=main_java11AnnotationProcessor,spotbugsPlugins diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/Endpoints.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/Endpoints.groovy new file mode 100644 index 00000000000..11f04328750 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/Endpoints.groovy @@ -0,0 +1,115 @@ +import jakarta.websocket.CloseReason +import jakarta.websocket.Endpoint +import jakarta.websocket.EndpointConfig +import jakarta.websocket.MessageHandler +import jakarta.websocket.OnClose +import jakarta.websocket.OnMessage +import jakarta.websocket.OnOpen +import jakarta.websocket.Session +import jakarta.websocket.server.PathParam +import jakarta.websocket.server.ServerEndpoint +import java.nio.ByteBuffer + +class Endpoints { + static class TestEndpoint extends Endpoint { + final MessageHandler handler + + TestEndpoint(final MessageHandler handler) { + this.handler = handler + } + + @Override + void onOpen(Session session, EndpointConfig endpointConfig) { + session.addMessageHandler(handler) + } + } + + // Full handlers + static class FullStringHandler implements MessageHandler.Whole { + @Override + void onMessage(String s) { + assert s != null + } + } + + static class FullBytesHandler implements MessageHandler.Whole { + @Override + void onMessage(byte[] b) { + assert b != null + } + } + + static class FullByteBufferHandler implements MessageHandler.Whole { + @Override + void onMessage(ByteBuffer b) { + assert b != null + } + } + + // Partial Handlers + static class PartialStringHandler implements MessageHandler.Partial { + @Override + void onMessage(String s, boolean last) { + assert s != null && last + } + } + + static class PartialBytesHandler implements MessageHandler.Partial { + @Override + void onMessage(byte[] b, boolean last) { + assert b != null && last + } + } + + static class PartialByteBufferHandler implements MessageHandler.Partial { + @Override + void onMessage(ByteBuffer b, boolean last) { + assert b != null && last + } + } + + @ServerEndpoint("/test/{p}") + static class PojoFullEndpoint { + @OnOpen + void onOpen(Session s) { + assert s != null + } + + @OnMessage + void onText(Session s, String payload, @PathParam("p") String param) { + assert s != null && payload != null && param == "param" + } + + @OnMessage + void onBinary(ByteBuffer payload, @PathParam("p") String param) { + assert payload != null && param == "param" + } + + @OnClose + void onClose() { + } + } + + @ServerEndpoint("/test/{p}") + static class PojoPartialEndpoint { + @OnOpen + void onOpen(EndpointConfig cfg, @PathParam("p") String param) { + assert param == "param" && cfg != null + } + + @OnMessage + void onText(Session s, String payload, boolean last) { + assert s != null && payload != null && last + } + + @OnMessage + void onBinary(ByteBuffer payload, boolean last, @PathParam("p") String param) { + assert payload != null && param == "param" && last + } + + @OnClose + void onClose(CloseReason cr, @PathParam("p") String param) { + assert cr != null && param == "param" + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/WebsocketTest.groovy new file mode 100644 index 00000000000..bdef5203b49 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/latestDepTest/groovy/WebsocketTest.groovy @@ -0,0 +1,91 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.WebSocketComponents +import org.eclipse.jetty.websocket.core.server.WebSocketMappings +import org.eclipse.jetty.websocket.jakarta.common.UpgradeRequest +import org.eclipse.jetty.websocket.jakarta.server.internal.JakartaWebSocketServerContainer +import org.eclipse.jetty.websocket.jakarta.server.internal.JakartaWebSocketServerFrameHandlerFactory + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JakartaWebSocketServerFrameHandlerFactory factory = new JakartaWebSocketServerFrameHandlerFactory(new JakartaWebSocketServerContainer(new WebSocketMappings(), new WebSocketComponents(), null)) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJakartaWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new Endpoints.TestEndpoint(new Endpoints.FullStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.PartialStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.FullBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.FullByteBufferHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialByteBufferHandler()) | "binary" + new Endpoints.PojoFullEndpoint() | "text" + new Endpoints.PojoFullEndpoint() | "binary" + new Endpoints.PojoPartialEndpoint() | "text" + new Endpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java new file mode 100644 index 00000000000..91ef11fa1e6 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java @@ -0,0 +1,25 @@ +package datadog.trace.instrumentation.websocket.jetty11; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.instrumentation.websocket.jetty10.Jetty10JavaxPojoWebSocketModule; +import java.util.HashMap; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class Jetty11JakartaPojoWebsocketModule extends Jetty10JavaxPojoWebSocketModule { + + public Jetty11JakartaPojoWebsocketModule() { + super("jakarta", "org.eclipse.jetty.websocket.jakarta.common.Jakarta"); + } + + @Override + public Map adviceShading() { + final Map map = new HashMap<>(); + map.put("javax", "jakarta"); + map.put( + "org.eclipse.jetty.websocket.javax.common.Javax", + "org.eclipse.jetty.websocket.jakarta.common.Jakarta"); + return map; + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/Endpoints.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/Endpoints.groovy new file mode 100644 index 00000000000..11f04328750 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/Endpoints.groovy @@ -0,0 +1,115 @@ +import jakarta.websocket.CloseReason +import jakarta.websocket.Endpoint +import jakarta.websocket.EndpointConfig +import jakarta.websocket.MessageHandler +import jakarta.websocket.OnClose +import jakarta.websocket.OnMessage +import jakarta.websocket.OnOpen +import jakarta.websocket.Session +import jakarta.websocket.server.PathParam +import jakarta.websocket.server.ServerEndpoint +import java.nio.ByteBuffer + +class Endpoints { + static class TestEndpoint extends Endpoint { + final MessageHandler handler + + TestEndpoint(final MessageHandler handler) { + this.handler = handler + } + + @Override + void onOpen(Session session, EndpointConfig endpointConfig) { + session.addMessageHandler(handler) + } + } + + // Full handlers + static class FullStringHandler implements MessageHandler.Whole { + @Override + void onMessage(String s) { + assert s != null + } + } + + static class FullBytesHandler implements MessageHandler.Whole { + @Override + void onMessage(byte[] b) { + assert b != null + } + } + + static class FullByteBufferHandler implements MessageHandler.Whole { + @Override + void onMessage(ByteBuffer b) { + assert b != null + } + } + + // Partial Handlers + static class PartialStringHandler implements MessageHandler.Partial { + @Override + void onMessage(String s, boolean last) { + assert s != null && last + } + } + + static class PartialBytesHandler implements MessageHandler.Partial { + @Override + void onMessage(byte[] b, boolean last) { + assert b != null && last + } + } + + static class PartialByteBufferHandler implements MessageHandler.Partial { + @Override + void onMessage(ByteBuffer b, boolean last) { + assert b != null && last + } + } + + @ServerEndpoint("/test/{p}") + static class PojoFullEndpoint { + @OnOpen + void onOpen(Session s) { + assert s != null + } + + @OnMessage + void onText(Session s, String payload, @PathParam("p") String param) { + assert s != null && payload != null && param == "param" + } + + @OnMessage + void onBinary(ByteBuffer payload, @PathParam("p") String param) { + assert payload != null && param == "param" + } + + @OnClose + void onClose() { + } + } + + @ServerEndpoint("/test/{p}") + static class PojoPartialEndpoint { + @OnOpen + void onOpen(EndpointConfig cfg, @PathParam("p") String param) { + assert param == "param" && cfg != null + } + + @OnMessage + void onText(Session s, String payload, boolean last) { + assert s != null && payload != null && last + } + + @OnMessage + void onBinary(ByteBuffer payload, boolean last, @PathParam("p") String param) { + assert payload != null && param == "param" && last + } + + @OnClose + void onClose(CloseReason cr, @PathParam("p") String param) { + assert cr != null && param == "param" + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/WebsocketTest.groovy new file mode 100644 index 00000000000..6677e1fde83 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/test/groovy/WebsocketTest.groovy @@ -0,0 +1,90 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.server.WebSocketMappings +import org.eclipse.jetty.websocket.jakarta.common.UpgradeRequest +import org.eclipse.jetty.websocket.jakarta.server.internal.JakartaWebSocketServerContainer +import org.eclipse.jetty.websocket.jakarta.server.internal.JakartaWebSocketServerFrameHandlerFactory + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JakartaWebSocketServerFrameHandlerFactory factory = new JakartaWebSocketServerFrameHandlerFactory(new JakartaWebSocketServerContainer(new WebSocketMappings())) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJakartaWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new Endpoints.TestEndpoint(new Endpoints.FullStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.PartialStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.FullBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.FullByteBufferHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialByteBufferHandler()) | "binary" + new Endpoints.PojoFullEndpoint() | "text" + new Endpoints.PojoFullEndpoint() | "binary" + new Endpoints.PojoPartialEndpoint() | "text" + new Endpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle new file mode 100644 index 00000000000..41afe760d10 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle @@ -0,0 +1,32 @@ +ext { + minJavaVersionForTests = JavaVersion.VERSION_17 +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuiteForDir("latestDepTest", "test") + +[compileTestGroovy, compileLatestDepTestGroovy].each { + it.javaLauncher = getJavaLauncherFor(17) +} + +dependencies { + implementation project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") + testImplementation group: 'org.eclipse.jetty.ee8.websocket', name: 'jetty-ee8-websocket-javax-server', version: '12.0.0' + testImplementation group: 'org.eclipse.jetty.ee9.websocket', name: 'jetty-ee9-websocket-jakarta-server', version: '12.0.0' + testImplementation group: 'org.eclipse.jetty.ee10.websocket', name: 'jetty-ee10-websocket-jakarta-server', version: '12.0.0' + latestDepTestImplementation group: 'org.eclipse.jetty.ee8.websocket', name: 'jetty-ee8-websocket-javax-server', version: '12.+' + latestDepTestImplementation group: 'org.eclipse.jetty.ee9.websocket', name: 'jetty-ee9-websocket-jakarta-server', version: '12.+' + latestDepTestImplementation group: 'org.eclipse.jetty.ee10.websocket', name: 'jetty-ee10-websocket-jakarta-server', version: '12.+' + + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-11") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:javax-websocket-1.0") + testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0") + + configurations.all { + it.resolutionStrategy { + force libs.slf4j + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile new file mode 100644 index 00000000000..18f3f556f08 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile @@ -0,0 +1,257 @@ +# 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,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,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,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.javaparser:javaparser-core:3.25.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.13=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.17=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.16=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.19=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.22=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,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,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,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,main_java17CompileClasspath,main_java17RuntimeClasspath,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.8=compileClasspath +info.picocli:picocli:4.6.3=latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:12.0.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +jakarta.annotation:jakarta.annotation-api:2.1.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.el:jakarta.el-api:4.0.0=testCompileClasspath,testRuntimeClasspath +jakarta.el:jakarta.el-api:5.0.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.enterprise:jakarta.enterprise.cdi-api:3.0.1=testCompileClasspath,testRuntimeClasspath +jakarta.enterprise:jakarta.enterprise.cdi-api:4.0.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.enterprise:jakarta.enterprise.lang-model:4.0.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.inject:jakarta.inject-api:2.0.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.interceptor:jakarta.interceptor-api:2.0.1=testCompileClasspath,testRuntimeClasspath +jakarta.interceptor:jakarta.interceptor-api:2.1.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +jakarta.servlet:jakarta.servlet-api:6.0.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.transaction:jakarta.transaction-api:2.0.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.websocket:jakarta.websocket-api:2.1.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +jakarta.websocket:jakarta.websocket-client-api:2.1.1=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.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.14.18=compileClasspath,instrumentPluginClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,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.compression:jetty-compression-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.compression:jetty-compression-gzip:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-annotations:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-annotations:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-plus:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-webapp:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-webapp:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-client:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-common:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-server:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-annotations:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-annotations:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-nested:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-nested:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-plus:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-security:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-security:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-webapp:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-webapp:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-common:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-server:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-annotations:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-annotations:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-nested:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-nested:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-plus:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-security:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-security:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-webapp:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-webapp:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-javax-websocket-api:1.1.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-client:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-common:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-server:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-client:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-ee:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-http:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-http:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-io:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-io:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-jndi:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-jndi:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-security:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-security:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-server:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-session:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-session:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-util:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-util:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-xml:12.0.0=testCompileClasspath,testRuntimeClasspath +org.eclipse.jetty:jetty-xml:12.1.0.alpha1=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,main_java17RuntimeClasspath,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.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.9.0=latestDepTestRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath +org.junit:junit-bom:5.9.1=spotbugs +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,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.4=spotbugs +org.ow2.asm:asm-commons:9.2=instrumentPluginClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-commons:9.4=spotbugs +org.ow2.asm:asm-commons:9.5=testCompileClasspath +org.ow2.asm:asm-commons:9.7.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.2=instrumentPluginClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm-tree:9.4=spotbugs +org.ow2.asm:asm-tree:9.5=testCompileClasspath +org.ow2.asm:asm-tree:9.7.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.2=instrumentPluginClasspath,latestDepTestRuntimeClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-util:9.4=spotbugs +org.ow2.asm:asm:9.2=instrumentPluginClasspath,main_java17RuntimeClasspath,muzzleTooling,runtimeClasspath +org.ow2.asm:asm:9.4=spotbugs +org.ow2.asm:asm:9.5=testCompileClasspath +org.ow2.asm:asm:9.7.1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testRuntimeClasspath +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,latestDepTestRuntimeClasspath,main_java17CompileClasspath,main_java17RuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,spotbugs,spotbugsSlf4j,testCompileClasspath,testRuntimeClasspath +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=main_java17AnnotationProcessor,spotbugsPlugins diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java new file mode 100644 index 00000000000..acacb9ee8b2 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java @@ -0,0 +1,25 @@ +package datadog.trace.instrumentation.websocket.jetty12; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.instrumentation.websocket.jetty10.Jetty10JavaxPojoWebSocketModule; +import java.util.HashMap; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class Jetty12EE10JakartaPojoWebsocketModule extends Jetty10JavaxPojoWebSocketModule { + + public Jetty12EE10JakartaPojoWebsocketModule() { + super("jakarta", "org.eclipse.jetty.ee10.websocket.jakarta.common.Jakarta"); + } + + @Override + public Map adviceShading() { + final Map ret = new HashMap<>(); + ret.put("javax", "jakarta"); + ret.put( + "org.eclipse.jetty.websocket.javax.common.Javax", + "org.eclipse.jetty.ee10.websocket.jakarta.common.Jakarta"); + return ret; + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java new file mode 100644 index 00000000000..4b0f967b4c3 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java @@ -0,0 +1,22 @@ +package datadog.trace.instrumentation.websocket.jetty12; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.instrumentation.websocket.jetty10.Jetty10JavaxPojoWebSocketModule; +import java.util.Collections; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class Jetty12EE8JavaxPojoWebsocketModule extends Jetty10JavaxPojoWebSocketModule { + + public Jetty12EE8JavaxPojoWebsocketModule() { + super("javax", "org.eclipse.jetty.ee8.websocket.javax.common.Javax"); + } + + @Override + public Map adviceShading() { + return Collections.singletonMap( + "org.eclipse.jetty.websocket.javax.common.Javax", + "org.eclipse.jetty.ee8.websocket.javax.common.Javax"); + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java new file mode 100644 index 00000000000..b64d8b94ee9 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java @@ -0,0 +1,25 @@ +package datadog.trace.instrumentation.websocket.jetty12; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.instrumentation.websocket.jetty10.Jetty10JavaxPojoWebSocketModule; +import java.util.HashMap; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class Jetty12EE9JakartaPojoWebsocketModule extends Jetty10JavaxPojoWebSocketModule { + + public Jetty12EE9JakartaPojoWebsocketModule() { + super("jakarta", "org.eclipse.jetty.ee9.websocket.jakarta.common.Jakarta"); + } + + @Override + public Map adviceShading() { + final Map ret = new HashMap<>(); + ret.put("javax", "jakarta"); + ret.put( + "org.eclipse.jetty.websocket.javax.common.Javax", + "org.eclipse.jetty.ee9.websocket.jakarta.common.Jakarta"); + return ret; + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE10WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE10WebsocketTest.groovy new file mode 100644 index 00000000000..984e3af421a --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE10WebsocketTest.groovy @@ -0,0 +1,91 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.ee10.websocket.jakarta.common.UpgradeRequest +import org.eclipse.jetty.ee10.websocket.jakarta.server.JakartaWebSocketServerContainer +import org.eclipse.jetty.ee10.websocket.jakarta.server.JakartaWebSocketServerFrameHandlerFactory +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.WebSocketComponents +import org.eclipse.jetty.websocket.core.server.WebSocketMappings + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class EE10WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JakartaWebSocketServerFrameHandlerFactory factory = new JakartaWebSocketServerFrameHandlerFactory(new JakartaWebSocketServerContainer(new WebSocketMappings(), new WebSocketComponents(), null)) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJakartaWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.FullStringHandler()) | "text" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.PartialStringHandler()) | "text" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.FullBytesHandler()) | "binary" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.FullByteBufferHandler()) | "binary" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.PartialBytesHandler()) | "binary" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.PartialByteBufferHandler()) | "binary" + new JakartaEndpoints.PojoFullEndpoint() | "text" + new JakartaEndpoints.PojoFullEndpoint() | "binary" + new JakartaEndpoints.PojoPartialEndpoint() | "text" + new JakartaEndpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE8WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE8WebsocketTest.groovy new file mode 100644 index 00000000000..1cfa2eeab30 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE8WebsocketTest.groovy @@ -0,0 +1,91 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.ee8.websocket.javax.common.UpgradeRequest +import org.eclipse.jetty.ee8.websocket.javax.server.JavaxWebSocketServerContainer +import org.eclipse.jetty.ee8.websocket.javax.server.JavaxWebSocketServerFrameHandlerFactory +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.WebSocketComponents +import org.eclipse.jetty.websocket.core.server.WebSocketMappings + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class EE8WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JavaxWebSocketServerFrameHandlerFactory factory = new JavaxWebSocketServerFrameHandlerFactory(new JavaxWebSocketServerContainer(new WebSocketMappings(), new WebSocketComponents(), null)) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJakartaWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new JavaxEndpoints.TestEndpoint(new JavaxEndpoints.FullStringHandler()) | "text" + new JavaxEndpoints.TestEndpoint(new JavaxEndpoints.PartialStringHandler()) | "text" + new JavaxEndpoints.TestEndpoint(new JavaxEndpoints.FullBytesHandler()) | "binary" + new JavaxEndpoints.TestEndpoint(new JavaxEndpoints.FullByteBufferHandler()) | "binary" + new JavaxEndpoints.TestEndpoint(new JavaxEndpoints.PartialBytesHandler()) | "binary" + new JavaxEndpoints.TestEndpoint(new JavaxEndpoints.PartialByteBufferHandler()) | "binary" + new JavaxEndpoints.PojoFullEndpoint() | "text" + new JavaxEndpoints.PojoFullEndpoint() | "binary" + new JavaxEndpoints.PojoPartialEndpoint() | "text" + new JavaxEndpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE9WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE9WebsocketTest.groovy new file mode 100644 index 00000000000..f3b42925309 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/EE9WebsocketTest.groovy @@ -0,0 +1,91 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.ee9.websocket.jakarta.common.UpgradeRequest +import org.eclipse.jetty.ee9.websocket.jakarta.server.JakartaWebSocketServerContainer +import org.eclipse.jetty.ee9.websocket.jakarta.server.JakartaWebSocketServerFrameHandlerFactory +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.WebSocketComponents +import org.eclipse.jetty.websocket.core.server.WebSocketMappings + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class EE9WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JakartaWebSocketServerFrameHandlerFactory factory = new JakartaWebSocketServerFrameHandlerFactory(new JakartaWebSocketServerContainer(new WebSocketMappings(), new WebSocketComponents(), null)) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJakartaWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.FullStringHandler()) | "text" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.PartialStringHandler()) | "text" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.FullBytesHandler()) | "binary" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.FullByteBufferHandler()) | "binary" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.PartialBytesHandler()) | "binary" + new JakartaEndpoints.TestEndpoint(new JakartaEndpoints.PartialByteBufferHandler()) | "binary" + new JakartaEndpoints.PojoFullEndpoint() | "text" + new JakartaEndpoints.PojoFullEndpoint() | "binary" + new JakartaEndpoints.PojoPartialEndpoint() | "text" + new JakartaEndpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JakartaEndpoints.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JakartaEndpoints.groovy new file mode 100644 index 00000000000..7b43067d841 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JakartaEndpoints.groovy @@ -0,0 +1,116 @@ +import jakarta.websocket.CloseReason +import jakarta.websocket.Endpoint +import jakarta.websocket.EndpointConfig +import jakarta.websocket.MessageHandler +import jakarta.websocket.OnClose +import jakarta.websocket.OnMessage +import jakarta.websocket.OnOpen +import jakarta.websocket.Session +import jakarta.websocket.server.PathParam +import jakarta.websocket.server.ServerEndpoint + +import java.nio.ByteBuffer + +class JakartaEndpoints { + static class TestEndpoint extends Endpoint { + final MessageHandler handler + + TestEndpoint(final MessageHandler handler) { + this.handler = handler + } + + @Override + void onOpen(Session session, EndpointConfig endpointConfig) { + session.addMessageHandler(handler) + } + } + + // Full handlers + static class FullStringHandler implements MessageHandler.Whole { + @Override + void onMessage(String s) { + assert s != null + } + } + + static class FullBytesHandler implements MessageHandler.Whole { + @Override + void onMessage(byte[] b) { + assert b != null + } + } + + static class FullByteBufferHandler implements MessageHandler.Whole { + @Override + void onMessage(ByteBuffer b) { + assert b != null + } + } + + // Partial Handlers + static class PartialStringHandler implements MessageHandler.Partial { + @Override + void onMessage(String s, boolean last) { + assert s != null && last + } + } + + static class PartialBytesHandler implements MessageHandler.Partial { + @Override + void onMessage(byte[] b, boolean last) { + assert b != null && last + } + } + + static class PartialByteBufferHandler implements MessageHandler.Partial { + @Override + void onMessage(ByteBuffer b, boolean last) { + assert b != null && last + } + } + + @ServerEndpoint("/test/{p}") + static class PojoFullEndpoint { + @OnOpen + void onOpen(Session s) { + assert s != null + } + + @OnMessage + void onText(Session s, String payload, @PathParam("p") String param) { + assert s != null && payload != null && param == "param" + } + + @OnMessage + void onBinary(ByteBuffer payload, @PathParam("p") String param) { + assert payload != null && param == "param" + } + + @OnClose + void onClose() { + } + } + + @ServerEndpoint("/test/{p}") + static class PojoPartialEndpoint { + @OnOpen + void onOpen(EndpointConfig cfg, @PathParam("p") String param) { + assert param == "param" && cfg != null + } + + @OnMessage + void onText(Session s, String payload, boolean last) { + assert s != null && payload != null && last + } + + @OnMessage + void onBinary(ByteBuffer payload, boolean last, @PathParam("p") String param) { + assert payload != null && param == "param" && last + } + + @OnClose + void onClose(CloseReason cr, @PathParam("p") String param) { + assert cr != null && param == "param" + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JavaxEndpoints.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JavaxEndpoints.groovy new file mode 100644 index 00000000000..8365dc27114 --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/test/groovy/JavaxEndpoints.groovy @@ -0,0 +1,115 @@ +import javax.websocket.CloseReason +import javax.websocket.Endpoint +import javax.websocket.EndpointConfig +import javax.websocket.MessageHandler +import javax.websocket.OnClose +import javax.websocket.OnMessage +import javax.websocket.OnOpen +import javax.websocket.Session +import javax.websocket.server.PathParam +import javax.websocket.server.ServerEndpoint +import java.nio.ByteBuffer + +class JavaxEndpoints { + static class TestEndpoint extends Endpoint { + final MessageHandler handler + + TestEndpoint(final MessageHandler handler) { + this.handler = handler + } + + @Override + void onOpen(Session session, EndpointConfig endpointConfig) { + session.addMessageHandler(handler) + } + } + + // Full handlers + static class FullStringHandler implements MessageHandler.Whole { + @Override + void onMessage(String s) { + assert s != null + } + } + + static class FullBytesHandler implements MessageHandler.Whole { + @Override + void onMessage(byte[] b) { + assert b != null + } + } + + static class FullByteBufferHandler implements MessageHandler.Whole { + @Override + void onMessage(ByteBuffer b) { + assert b != null + } + } + + // Partial Handlers + static class PartialStringHandler implements MessageHandler.Partial { + @Override + void onMessage(String s, boolean last) { + assert s != null && last + } + } + + static class PartialBytesHandler implements MessageHandler.Partial { + @Override + void onMessage(byte[] b, boolean last) { + assert b != null && last + } + } + + static class PartialByteBufferHandler implements MessageHandler.Partial { + @Override + void onMessage(ByteBuffer b, boolean last) { + assert b != null && last + } + } + + @ServerEndpoint("/test/{p}") + static class PojoFullEndpoint { + @OnOpen + void onOpen(Session s) { + assert s != null + } + + @OnMessage + void onText(Session s, String payload, @PathParam("p") String param) { + assert s != null && payload != null && param == "param" + } + + @OnMessage + void onBinary(ByteBuffer payload, @PathParam("p") String param) { + assert payload != null && param == "param" + } + + @OnClose + void onClose() { + } + } + + @ServerEndpoint("/test/{p}") + static class PojoPartialEndpoint { + @OnOpen + void onOpen(EndpointConfig cfg, @PathParam("p") String param) { + assert param == "param" && cfg != null + } + + @OnMessage + void onText(Session s, String payload, boolean last) { + assert s != null && payload != null && last + } + + @OnMessage + void onBinary(ByteBuffer payload, boolean last, @PathParam("p") String param) { + assert payload != null && param == "param" && last + } + + @OnClose + void onClose(CloseReason cr, @PathParam("p") String param) { + assert cr != null && param == "param" + } + } +} diff --git a/settings.gradle b/settings.gradle index 4df68ccfc00..b78e2287dda 100644 --- a/settings.gradle +++ b/settings.gradle @@ -524,6 +524,10 @@ include ':dd-java-agent:instrumentation:weaver' include ':dd-java-agent:instrumentation:websocket' include ':dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0' include ':dd-java-agent:instrumentation:websocket:javax-websocket-1.0' +include ':dd-java-agent:instrumentation:websocket:jetty-websocket' +include ':dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10' +include ':dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-11' +include ':dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-12' include ':dd-java-agent:instrumentation:websphere-jmx' include ':dd-java-agent:instrumentation:wildfly-9' include ':dd-java-agent:instrumentation:zio' From 77a318c2c32099a0fa97cb0f6a06172c0ff3528d Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 14 Mar 2025 16:53:46 +0100 Subject: [PATCH 2/7] spotbugs and muzzle --- .../websocket/jetty-websocket/jetty-websocket-10/build.gradle | 3 +++ .../instrumentation/websocket/jetty10/WebSocketAdvices.java | 2 ++ 2 files changed, 5 insertions(+) diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle index 7aa6be1465a..ff1653a8244 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle @@ -8,6 +8,8 @@ addTestSuiteForDir("latestDepTest", "test") compileMain_java11Java.configure { setJavaVersion(it, 11) + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } [compileTestGroovy, compileLatestDepTestGroovy].each { it.javaLauncher = getJavaLauncherFor(11) @@ -15,6 +17,7 @@ compileMain_java11Java.configure { dependencies { main_java11CompileOnly group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' + main_java11CompileOnly group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.2.0' testImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.+' diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java index 3023deb6630..018e71464dc 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java @@ -5,6 +5,7 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import javax.websocket.Endpoint; @@ -13,6 +14,7 @@ import org.eclipse.jetty.websocket.javax.common.JavaxWebSocketMessageMetadata; import org.eclipse.jetty.websocket.javax.common.JavaxWebSocketSession; +@SuppressFBWarnings("UC_USELESS_OBJECT_STACK") public class WebSocketAdvices { public static class OpenClose9Advice { @Advice.OnMethodEnter(suppress = Throwable.class) From 47430cc282b4e2f29f028c5d765c6326983ab45e Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Mon, 17 Mar 2025 10:05:21 +0100 Subject: [PATCH 3/7] fix muzzle and other tests --- .../instrumentation/jetty-11/build.gradle | 2 + .../jetty-websocket-10/build.gradle | 13 +- .../src/latestDepTest/groovy/Endpoints.groovy | 115 ++++++++++++++++++ .../latestDepTest/groovy/WebsocketTest.groovy | 91 ++++++++++++++ .../Jetty10JavaxPojoWebSocketModule.java | 5 + .../jetty-websocket-11/build.gradle | 11 ++ .../Jetty11JakartaPojoWebsocketModule.java | 5 + .../jetty-websocket-12/build.gradle | 24 ++++ ...Jetty12EE10JakartaPojoWebsocketModule.java | 5 + .../Jetty12EE8JavaxPojoWebsocketModule.java | 5 + .../Jetty12EE9JakartaPojoWebsocketModule.java | 5 + 11 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/Endpoints.groovy create mode 100644 dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/WebsocketTest.groovy diff --git a/dd-java-agent/instrumentation/jetty-11/build.gradle b/dd-java-agent/instrumentation/jetty-11/build.gradle index 8749dcb3dda..12f5dc77c96 100644 --- a/dd-java-agent/instrumentation/jetty-11/build.gradle +++ b/dd-java-agent/instrumentation/jetty-11/build.gradle @@ -39,6 +39,8 @@ dependencies { testFixturesCompileOnly "org.eclipse.jetty:jetty-server:11.0.0" testFixturesCompileOnly "org.eclipse.jetty:jetty-servlet:11.0.0" testFixturesCompileOnly "org.eclipse.jetty.websocket:websocket-jakarta-server:11.0.0" + testFixturesImplementation group: 'jakarta.websocket', name: 'jakarta.websocket-client-api', version: '2.0.0' + testFixturesImplementation(project(':dd-java-agent:testing')) { diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle index ff1653a8244..da1d669a662 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/build.gradle @@ -2,9 +2,20 @@ ext { minJavaVersionForTests = JavaVersion.VERSION_11 } +muzzle { + pass { + name = 'jetty-websocket-10' + group = 'org.eclipse.jetty.websocket' + module = 'websocket-javax-server' + versions = "[10,11)" + javaVersion = "11" + assertInverse = true + } +} + apply from: "$rootDir/gradle/java.gradle" -addTestSuiteForDir("latestDepTest", "test") +addTestSuite("latestDepTest") compileMain_java11Java.configure { setJavaVersion(it, 11) diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/Endpoints.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/Endpoints.groovy new file mode 100644 index 00000000000..5b15b444baf --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/Endpoints.groovy @@ -0,0 +1,115 @@ +import javax.websocket.CloseReason +import javax.websocket.Endpoint +import javax.websocket.EndpointConfig +import javax.websocket.MessageHandler +import javax.websocket.OnClose +import javax.websocket.OnMessage +import javax.websocket.OnOpen +import javax.websocket.Session +import javax.websocket.server.PathParam +import javax.websocket.server.ServerEndpoint +import java.nio.ByteBuffer + +class Endpoints { + static class TestEndpoint extends Endpoint { + final MessageHandler handler + + TestEndpoint(final MessageHandler handler) { + this.handler = handler + } + + @Override + void onOpen(Session session, EndpointConfig endpointConfig) { + session.addMessageHandler(handler) + } + } + + // Full handlers + static class FullStringHandler implements MessageHandler.Whole { + @Override + void onMessage(String s) { + assert s != null + } + } + + static class FullBytesHandler implements MessageHandler.Whole { + @Override + void onMessage(byte[] b) { + assert b != null + } + } + + static class FullByteBufferHandler implements MessageHandler.Whole { + @Override + void onMessage(ByteBuffer b) { + assert b != null + } + } + + // Partial Handlers + static class PartialStringHandler implements MessageHandler.Partial { + @Override + void onMessage(String s, boolean last) { + assert s != null && last + } + } + + static class PartialBytesHandler implements MessageHandler.Partial { + @Override + void onMessage(byte[] b, boolean last) { + assert b != null && last + } + } + + static class PartialByteBufferHandler implements MessageHandler.Partial { + @Override + void onMessage(ByteBuffer b, boolean last) { + assert b != null && last + } + } + + @ServerEndpoint("/test/{p}") + static class PojoFullEndpoint { + @OnOpen + void onOpen(Session s) { + assert s != null + } + + @OnMessage + void onText(Session s, String payload, @PathParam("p") String param) { + assert s != null && payload != null && param == "param" + } + + @OnMessage + void onBinary(ByteBuffer payload, @PathParam("p") String param) { + assert payload != null && param == "param" + } + + @OnClose + void onClose() { + } + } + + @ServerEndpoint("/test/{p}") + static class PojoPartialEndpoint { + @OnOpen + void onOpen(EndpointConfig cfg, @PathParam("p") String param) { + assert param == "param" && cfg != null + } + + @OnMessage + void onText(Session s, String payload, boolean last) { + assert s != null && payload != null && last + } + + @OnMessage + void onBinary(ByteBuffer payload, boolean last, @PathParam("p") String param) { + assert payload != null && param == "param" && last + } + + @OnClose + void onClose(CloseReason cr, @PathParam("p") String param) { + assert cr != null && param == "param" + } + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/WebsocketTest.groovy b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/WebsocketTest.groovy new file mode 100644 index 00000000000..b3155ddacdf --- /dev/null +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/latestDepTest/groovy/WebsocketTest.groovy @@ -0,0 +1,91 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.core.DDSpan +import org.eclipse.jetty.util.Callback +import org.eclipse.jetty.websocket.core.CloseStatus +import org.eclipse.jetty.websocket.core.CoreSession +import org.eclipse.jetty.websocket.core.Frame +import org.eclipse.jetty.websocket.core.OpCode +import org.eclipse.jetty.websocket.core.WebSocketComponents +import org.eclipse.jetty.websocket.core.server.WebSocketMappings +import org.eclipse.jetty.websocket.javax.common.UpgradeRequest +import org.eclipse.jetty.websocket.javax.server.internal.JavaxWebSocketServerContainer +import org.eclipse.jetty.websocket.javax.server.internal.JavaxWebSocketServerFrameHandlerFactory + +import java.security.Principal + +import static datadog.trace.agent.test.base.HttpServerTest.websocketCloseSpan +import static datadog.trace.agent.test.base.HttpServerTest.websocketReceiveSpan +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.api.config.TraceInstrumentationConfig.TRACE_WEBSOCKET_MESSAGES_ENABLED +import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan +import static datadog.trace.bootstrap.instrumentation.api.Tags.HTTP_URL + +class WebsocketTest extends AgentTestRunner { + + @Override + protected void configurePreAgent() { + super.configurePreAgent() + injectSysConfig(TRACE_WEBSOCKET_MESSAGES_ENABLED, "true") + } + + def "test jetty advices with endpoint class #endpoint.class and message type #msgType"() { + setup: + def url = "ws://inmemory/test/param" + JavaxWebSocketServerFrameHandlerFactory factory = new JavaxWebSocketServerFrameHandlerFactory(new JavaxWebSocketServerContainer(new WebSocketMappings(), new WebSocketComponents(), null)) + UpgradeRequest request = new UpgradeRequest() { + + @Override + Principal getUserPrincipal() { + return null + } + + @Override + URI getRequestURI() { + return URI.create(url) + } + + @Override + String getPathInContext() { + return "/test/param" + } + } + def frameHandler = factory.newJavaxWebSocketFrameHandler(endpoint, request) + def session = new CoreSession.Empty() + when: + runUnderTrace("parent") { + + activeSpan().setTag(HTTP_URL, url) + frameHandler.onOpen(session, Callback.NOOP) + } + frameHandler.onFrame(new Frame(msgType == "text" ? OpCode.TEXT : OpCode.BINARY, "hello world"), Callback.NOOP) + frameHandler.onClose(CloseStatus.toFrame(CloseStatus.NORMAL, "bye"), Callback.NOOP) + + then: + assertTraces(3) { + DDSpan handshake + trace(1) { + handshake = span(0) + basicSpan(it, "parent", "/test/param", null, null, [(HTTP_URL): url]) + } + trace(1) { + websocketReceiveSpan(it, handshake, msgType, 11) + } + trace(1) { + websocketCloseSpan(it, handshake, false, 1000, "bye") + } + } + where: + endpoint | msgType + new Endpoints.TestEndpoint(new Endpoints.FullStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.PartialStringHandler()) | "text" + new Endpoints.TestEndpoint(new Endpoints.FullBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.FullByteBufferHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialBytesHandler()) | "binary" + new Endpoints.TestEndpoint(new Endpoints.PartialByteBufferHandler()) | "binary" + new Endpoints.PojoFullEndpoint() | "text" + new Endpoints.PojoFullEndpoint() | "binary" + new Endpoints.PojoPartialEndpoint() | "text" + new Endpoints.PojoPartialEndpoint() | "binary" + } +} diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java index 896c225fe2b..81f7de37455 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java @@ -46,6 +46,11 @@ public String[] helperClassNames() { }; } + @Override + public String muzzleDirective() { + return "jetty-websocket-10"; + } + @Override public List typeInstrumentations() { return Arrays.asList( diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle index 8aef2a97bef..b77f99a12c0 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/build.gradle @@ -2,6 +2,17 @@ ext { minJavaVersionForTests = JavaVersion.VERSION_11 } +muzzle { + pass { + name = 'jetty-websocket-11' + group = 'org.eclipse.jetty.websocket' + module = 'websocket-jakarta-server' + versions = "[11,12)" + javaVersion = "11" + assertInverse = true + } +} + apply from: "$rootDir/gradle/java.gradle" addTestSuite("latestDepTest") diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java index 91ef11fa1e6..bf28fe650c1 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-11/src/main/java/datadog/trace/instrumentation/websocket/jetty11/Jetty11JakartaPojoWebsocketModule.java @@ -13,6 +13,11 @@ public Jetty11JakartaPojoWebsocketModule() { super("jakarta", "org.eclipse.jetty.websocket.jakarta.common.Jakarta"); } + @Override + public String muzzleDirective() { + return "jetty-websocket-11"; + } + @Override public Map adviceShading() { final Map map = new HashMap<>(); diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle index 41afe760d10..527035632ef 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle @@ -2,6 +2,30 @@ ext { minJavaVersionForTests = JavaVersion.VERSION_17 } +muzzle { + pass { + name = 'jetty-websocket-12ee8' + group = 'org.eclipse.jetty.ee8.websocket' + module = 'jetty-ee8-websocket-javax-server' + versions = "[12,)" + javaVersion = "17" + } + pass { + name = 'jetty-websocket-12ee9' + group = 'org.eclipse.jetty.ee9.websocket' + module = 'jetty-ee9-websocket-jakarta-server' + versions = "[12,)" + javaVersion = "17" + } + pass { + name = 'jetty-websocket-12ee10' + group = 'org.eclipse.jetty.ee10.websocket' + module = 'jetty-ee10-websocket-jakarta-server' + versions = "[12,)" + javaVersion = "17" + } +} + apply from: "$rootDir/gradle/java.gradle" addTestSuiteForDir("latestDepTest", "test") diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java index acacb9ee8b2..e3c2742f394 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE10JakartaPojoWebsocketModule.java @@ -13,6 +13,11 @@ public Jetty12EE10JakartaPojoWebsocketModule() { super("jakarta", "org.eclipse.jetty.ee10.websocket.jakarta.common.Jakarta"); } + @Override + public String muzzleDirective() { + return "jetty-websocket-12ee10"; + } + @Override public Map adviceShading() { final Map ret = new HashMap<>(); diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java index 4b0f967b4c3..21a3b093bc0 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE8JavaxPojoWebsocketModule.java @@ -13,6 +13,11 @@ public Jetty12EE8JavaxPojoWebsocketModule() { super("javax", "org.eclipse.jetty.ee8.websocket.javax.common.Javax"); } + @Override + public String muzzleDirective() { + return "jetty-websocket-12ee8"; + } + @Override public Map adviceShading() { return Collections.singletonMap( diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java index b64d8b94ee9..cf55ba3af4d 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/src/main/java/datadog/trace/instrumentation/websocket/jetty12/Jetty12EE9JakartaPojoWebsocketModule.java @@ -13,6 +13,11 @@ public Jetty12EE9JakartaPojoWebsocketModule() { super("jakarta", "org.eclipse.jetty.ee9.websocket.jakarta.common.Jakarta"); } + @Override + public String muzzleDirective() { + return "jetty-websocket-12e9"; + } + @Override public Map adviceShading() { final Map ret = new HashMap<>(); From f628ebde563518030a84eb6786c299476c2acb51 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Mon, 17 Mar 2025 10:56:43 +0100 Subject: [PATCH 4/7] capital S --- .../JavaxWebSocketFrameHandlerFactoryInstrumentation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java index c45733ba8a3..d58d757f39f 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/JavaxWebSocketFrameHandlerFactoryInstrumentation.java @@ -24,6 +24,6 @@ public void methodAdvice(MethodTransformer transformer) { named("createMessageSink") .and(takesArgument(0, named(namespace + "WebSocketSession"))) .and(takesArgument(1, named(namespace + "WebSocketMessageMetadata"))), - "datadog.trace.instrumentation.websocket.jetty10.WebsocketAdvices$MessageSinkAdvice"); + "datadog.trace.instrumentation.websocket.jetty10.WebSocketAdvices$MessageSinkAdvice"); } } From 049b1b043d14e57e796fe3cdb6a32e9580ad416d Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Mon, 17 Mar 2025 12:40:40 +0100 Subject: [PATCH 5/7] exclude jetty 12.1 because of api changes --- .../src/test/ee10/groovy/Jetty12Test.groovy | 4 +- .../src/test/ee8/groovy/Jetty12Test.groovy | 3 +- .../src/test/ee9/groovy/Jetty12Test.groovy | 3 +- .../Jetty10JavaxPojoWebSocketModule.java | 17 ++++ .../jetty-websocket-12/build.gradle | 14 +-- .../jetty-websocket-12/gradle.lockfile | 90 +++++++++---------- 6 files changed, 77 insertions(+), 54 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy index f2ea9992f2f..8134ef2a8cd 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee10/groovy/Jetty12Test.groovy @@ -49,6 +49,7 @@ class Jetty12Test extends HttpServerTest implements TestingGenericHttpNa boolean hasExtraErrorInformation() { true } + protected boolean useWebsocketPojoEndpoint() { false } @@ -56,6 +57,7 @@ class Jetty12Test extends HttpServerTest implements TestingGenericHttpNa class Jetty12PojoWebsocketTest extends Jetty12Test { protected boolean useWebsocketPojoEndpoint() { - true + // advices for pojo won't apply for latest alpha 12.1.+. It has to be adapted once jetty codebase will be stable + !isLatestDepTest } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy index d47f9cad800..4a7e5c37122 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee8/groovy/Jetty12Test.groovy @@ -82,6 +82,7 @@ class Jetty12AsyncTest extends Jetty12Test { } @Override protected boolean useWebsocketPojoEndpoint() { - true + // advices for pojo won't apply for latest alpha 12.1.+. It has to be adapted once jetty codebase will be stable + !isLatestDepTest } } diff --git a/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy b/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy index a1977de40c8..b770c8c7b6d 100644 --- a/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy +++ b/dd-java-agent/instrumentation/jetty-12/src/test/ee9/groovy/Jetty12Test.groovy @@ -57,6 +57,7 @@ class Jetty12Test extends HttpServerTest implements TestingGenericHttpNa class Jetty12PojoWebsocketTest extends Jetty12Test { protected boolean useWebsocketPojoEndpoint() { - true + // advices for pojo won't apply for latest alpha 12.1.+. It has to be adapted once jetty codebase will be stable + !isLatestDepTest } } diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java index 81f7de37455..12c7fd92458 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java @@ -1,8 +1,12 @@ package datadog.trace.instrumentation.websocket.jetty10; +import static datadog.trace.agent.tooling.muzzle.Reference.EXPECTS_NON_STATIC; +import static datadog.trace.agent.tooling.muzzle.Reference.EXPECTS_PUBLIC; + import com.google.auto.service.AutoService; import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.agent.tooling.muzzle.Reference; import datadog.trace.api.InstrumenterConfig; import datadog.trace.bootstrap.instrumentation.websocket.HandlerContext; import java.util.Arrays; @@ -39,6 +43,19 @@ public Map contextStore() { return map; } + @Override + public Reference[] additionalMuzzleReferences() { + return new Reference[] { + new Reference.Builder(jettyNamespace + "WebSocketMessageMetadata") + .withMethod( + new String[0], + EXPECTS_NON_STATIC | EXPECTS_PUBLIC, + "getMethodHandle", + "Ljava/lang/invoke/MethodHandle;") + .build(), + }; + } + @Override public String[] helperClassNames() { return new String[] { diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle index 527035632ef..c3dbc7e52b1 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/build.gradle @@ -7,21 +7,21 @@ muzzle { name = 'jetty-websocket-12ee8' group = 'org.eclipse.jetty.ee8.websocket' module = 'jetty-ee8-websocket-javax-server' - versions = "[12,)" + versions = "[12,12.0.17]" javaVersion = "17" } pass { name = 'jetty-websocket-12ee9' group = 'org.eclipse.jetty.ee9.websocket' module = 'jetty-ee9-websocket-jakarta-server' - versions = "[12,)" + versions = "[12,12.0.17]" javaVersion = "17" } pass { name = 'jetty-websocket-12ee10' group = 'org.eclipse.jetty.ee10.websocket' module = 'jetty-ee10-websocket-jakarta-server' - versions = "[12,)" + versions = "[12,12.0.17]" javaVersion = "17" } } @@ -39,9 +39,11 @@ dependencies { testImplementation group: 'org.eclipse.jetty.ee8.websocket', name: 'jetty-ee8-websocket-javax-server', version: '12.0.0' testImplementation group: 'org.eclipse.jetty.ee9.websocket', name: 'jetty-ee9-websocket-jakarta-server', version: '12.0.0' testImplementation group: 'org.eclipse.jetty.ee10.websocket', name: 'jetty-ee10-websocket-jakarta-server', version: '12.0.0' - latestDepTestImplementation group: 'org.eclipse.jetty.ee8.websocket', name: 'jetty-ee8-websocket-javax-server', version: '12.+' - latestDepTestImplementation group: 'org.eclipse.jetty.ee9.websocket', name: 'jetty-ee9-websocket-jakarta-server', version: '12.+' - latestDepTestImplementation group: 'org.eclipse.jetty.ee10.websocket', name: 'jetty-ee10-websocket-jakarta-server', version: '12.+' + //TODO: jetty-12.1.0 is still alpha but wraps MethodHandle class into a MethodHolder class. + // Today that is not stable but we'll need to port those advices to support that once the code base will be a bit more stable + latestDepTestImplementation group: 'org.eclipse.jetty.ee8.websocket', name: 'jetty-ee8-websocket-javax-server', version: '12.0.17' + latestDepTestImplementation group: 'org.eclipse.jetty.ee9.websocket', name: 'jetty-ee9-websocket-jakarta-server', version: '12.0.17' + latestDepTestImplementation group: 'org.eclipse.jetty.ee10.websocket', name: 'jetty-ee10-websocket-jakarta-server', version: '12.0.17' testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-11") diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile index 18f3f556f08..1c1b0c40c3d 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-12/gradle.lockfile @@ -119,96 +119,96 @@ org.codehaus.groovy:groovy:3.0.17=latestDepTestCompileClasspath,latestDepTestRun 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.compression:jetty-compression-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath -org.eclipse.jetty.compression:jetty-compression-gzip:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.compression:jetty-compression-common:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.compression:jetty-compression-gzip:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10:jetty-ee10-annotations:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10:jetty-ee10-annotations:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-annotations:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10:jetty-ee10-plus:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10:jetty-ee10-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-plus:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10:jetty-ee10-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10:jetty-ee10-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-servlet:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee10:jetty-ee10-webapp:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee10:jetty-ee10-webapp:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee10:jetty-ee10-webapp:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-client:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-client:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-common:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-common:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-server:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-javax-server:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8.websocket:jetty-ee8-websocket-servlet:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8:jetty-ee8-annotations:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8:jetty-ee8-annotations:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-annotations:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8:jetty-ee8-nested:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8:jetty-ee8-nested:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-nested:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8:jetty-ee8-plus:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8:jetty-ee8-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-plus:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8:jetty-ee8-security:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8:jetty-ee8-security:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-security:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8:jetty-ee8-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8:jetty-ee8-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-servlet:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee8:jetty-ee8-webapp:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee8:jetty-ee8-webapp:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee8:jetty-ee8-webapp:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-client:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-common:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-common:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-server:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-jakarta-server:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9.websocket:jetty-ee9-websocket-servlet:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9:jetty-ee9-annotations:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9:jetty-ee9-annotations:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-annotations:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9:jetty-ee9-nested:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9:jetty-ee9-nested:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-nested:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9:jetty-ee9-plus:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9:jetty-ee9-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-plus:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9:jetty-ee9-security:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9:jetty-ee9-security:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-security:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9:jetty-ee9-servlet:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9:jetty-ee9-servlet:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-servlet:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.ee9:jetty-ee9-webapp:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.ee9:jetty-ee9-webapp:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.ee9:jetty-ee9-webapp:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.toolchain:jetty-jakarta-servlet-api:5.0.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.eclipse.jetty.toolchain:jetty-jakarta-websocket-api:2.0.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.eclipse.jetty.toolchain:jetty-javax-websocket-api:1.1.2=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.eclipse.jetty.toolchain:jetty-servlet-api:4.0.6=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath,testCompileClasspath,testRuntimeClasspath org.eclipse.jetty.websocket:jetty-websocket-core-client:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.websocket:jetty-websocket-core-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-client:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.websocket:jetty-websocket-core-common:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.websocket:jetty-websocket-core-common:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-common:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty.websocket:jetty-websocket-core-server:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty.websocket:jetty-websocket-core-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty.websocket:jetty-websocket-core-server:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-alpn-client:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-alpn-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-alpn-client:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-client:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-client:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath -org.eclipse.jetty:jetty-ee:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-client:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-ee:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-http:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-http:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-http:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-io:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-io:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-io:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-jndi:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-jndi:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath -org.eclipse.jetty:jetty-plus:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-jndi:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-plus:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-security:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-security:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-security:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-server:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-server:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-server:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-session:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-session:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-session:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-util:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-util:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-util:12.0.17=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath org.eclipse.jetty:jetty-xml:12.0.0=testCompileClasspath,testRuntimeClasspath -org.eclipse.jetty:jetty-xml:12.1.0.alpha1=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.eclipse.jetty:jetty-xml:12.0.17=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 From cc3d6a65414f6ec0e4c99b2ffcabb36c3d5c4f8f Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Mon, 17 Mar 2025 14:29:09 +0100 Subject: [PATCH 6/7] add isLatestTest for all latest tests --- dd-java-agent/instrumentation/jetty-12/build.gradle | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/jetty-12/build.gradle b/dd-java-agent/instrumentation/jetty-12/build.gradle index 078c9a2f790..374c30a3753 100644 --- a/dd-java-agent/instrumentation/jetty-12/build.gradle +++ b/dd-java-agent/instrumentation/jetty-12/build.gradle @@ -38,7 +38,11 @@ addTestSuiteExtendingForDir('ee10LatestDepTest', 'latestDepTest', 'test/ee10') targetCompatibility = JavaVersion.VERSION_1_8 } } - +[ee8LatestDepTest, ee9LatestDepTest, ee10LatestDepTest].each { + it.configure { + it.jvmArgs += ['-Dtest.dd.latestDepTest=true'] + } +} forbiddenApisMain_java17 { failOnMissingClasses = false } From 03a01afa7b832e0b2cd55fbbaf6a1c4f31936db5 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 21 Mar 2025 09:59:19 +0100 Subject: [PATCH 7/7] Code review comments --- .../Jetty10JavaxPojoWebSocketModule.java | 2 +- ...ndpoint.java => MethodHandleWrappers.java} | 34 +++++++++++++++---- .../websocket/jetty10/WebSocketAdvices.java | 28 ++++++++++++--- 3 files changed, 51 insertions(+), 13 deletions(-) rename dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/{SyntheticEndpoint.java => MethodHandleWrappers.java} (80%) diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java index 12c7fd92458..911e0992d32 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java/datadog/trace/instrumentation/websocket/jetty10/Jetty10JavaxPojoWebSocketModule.java @@ -59,7 +59,7 @@ public Reference[] additionalMuzzleReferences() { @Override public String[] helperClassNames() { return new String[] { - "datadog.trace.instrumentation.websocket.jetty10.SyntheticEndpoint", + "datadog.trace.instrumentation.websocket.jetty10.MethodHandleWrappers", }; } diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java similarity index 80% rename from dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java rename to dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java index 81bde95fbc2..7896b2eb5a6 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/SyntheticEndpoint.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/MethodHandleWrappers.java @@ -28,30 +28,50 @@ * the handshake span. Instrumenting directly @OnMessage methods won't have in all case guarantee to * have that information since the Session parameter is optional. */ -public class SyntheticEndpoint { +public class MethodHandleWrappers { + /** + * OnOpen method handles that takes more arguments comparing to the original. We inject at the + * beginning the original to delegate the call, the context stores we need to lookup the handler + * context and the original parameter jetty is already binding (the session and the endpoint + * config) + */ public static final MethodHandle OPEN_METHOD_HANDLE = - new MethodHandles(SyntheticEndpoint.class.getClassLoader()) + new MethodHandles(MethodHandleWrappers.class.getClassLoader()) .method( - SyntheticEndpoint.class, + MethodHandleWrappers.class, "onOpen", MethodHandle.class, ContextStore.class, ContextStore.class, JavaxWebSocketSession.class, EndpointConfig.class); + + /** + * OnClose method handles that takes more arguments comparing to the original. We inject at the + * beginning the origin alto delegate the call, the context stores we need to lookup the handler + * context and the original parameter jetty is already binding (the session and the close reason) + */ public static final MethodHandle CLOSE_METHOD_HANDLE = - new MethodHandles(SyntheticEndpoint.class.getClassLoader()) + new MethodHandles(MethodHandleWrappers.class.getClassLoader()) .method( - SyntheticEndpoint.class, + MethodHandleWrappers.class, "onClose", MethodHandle.class, ContextStore.class, Session.class, CloseReason.class); + + /** + * OnMessage method handles that takes more arguments comparing to the original. We inject at the + * beginning the origin alto delegate the call, the context stores we need to lookup the handler + * context, the session and the receiver handler context we create when the jetty message sink are + * instrumented. At the end we also accept the original method arguments as an object varargs + * since we cannot know in advance the one that will be passed. + */ public static final MethodHandle MESSAGE_METHOD_HANDLE = - new MethodHandles(SyntheticEndpoint.class.getClassLoader()) + new MethodHandles(MethodHandleWrappers.class.getClassLoader()) .method( - SyntheticEndpoint.class, + MethodHandleWrappers.class, "onMessage", MethodHandle.class, JavaxWebSocketSession.class, diff --git a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java index 018e71464dc..eb41bd9b346 100644 --- a/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java +++ b/dd-java-agent/instrumentation/websocket/jetty-websocket/jetty-websocket-10/src/main/java11/datadog/trace/instrumentation/websocket/jetty10/WebSocketAdvices.java @@ -23,19 +23,25 @@ public static void onEnter( @Advice.Argument(value = 3, readOnly = false) MethodHandle closeHandle, @Advice.Argument(value = 1) final Object origin) { + // we skip wrapping the method handle in case the origin is already an Enpoint since this will + // be already handled by the jsr356 instrumentation if (origin == null || origin instanceof Endpoint) { return; } + // we need then to wrap those two method handles jetty is calling when the websocket is opened + // and closed since jetty is directly calling them. + // We also insert other arguments at the beginning in order to provide data we need. Inserting + // at the beginning won't break bind and invoke jetty will do. openHandle = MethodHandles.insertArguments( - SyntheticEndpoint.OPEN_METHOD_HANDLE, + MethodHandleWrappers.OPEN_METHOD_HANDLE, 0, openHandle, InstrumentationContext.get(Session.class, HandlerContext.Sender.class), InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); closeHandle = MethodHandles.insertArguments( - SyntheticEndpoint.CLOSE_METHOD_HANDLE, + MethodHandleWrappers.CLOSE_METHOD_HANDLE, 0, closeHandle, InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); @@ -49,19 +55,25 @@ public static void onEnter( @Advice.Argument(value = 4, readOnly = false) MethodHandle closeHandle, @Advice.Argument(value = 2) final Object origin) { + // we skip wrapping the method handle in case the origin is already an Enpoint since this will + // be already handled by the jsr356 instrumentation if (origin == null || origin instanceof Endpoint) { return; } + // we need then to wrap those two method handles jetty is calling when the websocket is opened + // and closed since jetty is directly calling them. + // We also insert other arguments at the beginning in order to provide data we need. Inserting + // at the beginning won't break bind and invoke jetty will do. openHandle = MethodHandles.insertArguments( - SyntheticEndpoint.OPEN_METHOD_HANDLE, + MethodHandleWrappers.OPEN_METHOD_HANDLE, 0, openHandle, InstrumentationContext.get(Session.class, HandlerContext.Sender.class), InstrumentationContext.get(JavaxWebSocketSession.class, Boolean.class)); closeHandle = MethodHandles.insertArguments( - SyntheticEndpoint.CLOSE_METHOD_HANDLE, + MethodHandleWrappers.CLOSE_METHOD_HANDLE, 0, closeHandle, InstrumentationContext.get(Session.class, HandlerContext.Sender.class)); @@ -82,9 +94,15 @@ public static void onEnter( return; } try { + // we need to manipulate this method handle after jetty already bound template variables and + // arguments otherwise the call will mismatch. + // we insert arguments at the beginning to inject our own data and make the method as vararg + // to collect arguments since we need to call the original and we cannot know which one will + // be provided. In fact, it will depend on the data used (i.e. byte[], String, etc...) and + // if partial delivery is handled (so it will also accept a boolean for the fin bit signal). metadata.setMethodHandle( MethodHandles.insertArguments( - SyntheticEndpoint.MESSAGE_METHOD_HANDLE, + MethodHandleWrappers.MESSAGE_METHOD_HANDLE, 0, metadata.getMethodHandle(), session,