diff --git a/dd-java-agent/instrumentation/cxf-2.1/build.gradle b/dd-java-agent/instrumentation/cxf-2.1/build.gradle index 865148c39b0..25d27b028ab 100644 --- a/dd-java-agent/instrumentation/cxf-2.1/build.gradle +++ b/dd-java-agent/instrumentation/cxf-2.1/build.gradle @@ -60,6 +60,7 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-7.0') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-7.6') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-10.0') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-11.0') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-12.0') testRuntimeOnly project(':dd-java-agent:instrumentation:trace-annotation') diff --git a/dd-java-agent/instrumentation/jersey/build.gradle b/dd-java-agent/instrumentation/jersey/build.gradle index a226454bfe2..423ad5c73f1 100644 --- a/dd-java-agent/instrumentation/jersey/build.gradle +++ b/dd-java-agent/instrumentation/jersey/build.gradle @@ -53,6 +53,7 @@ dependencies { jersey2JettyTestRuntimeOnly group: 'javax.activation', name: 'javax.activation-api', version: '1.2.0' jersey2JettyTestRuntimeOnly group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' jersey2JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') + jersey2JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0.4') jersey2JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jersey-2-appsec') jersey2JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jax-rs-annotations-2') @@ -68,6 +69,7 @@ dependencies { jersey3JettyTestRuntimeOnly group: 'javax.activation', name: 'javax.activation-api', version: '1.2.0' jersey3JettyTestRuntimeOnly group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' jersey3JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') + jersey3JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-10.0') jersey3JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-11.0') jersey3JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jersey-2-appsec') jersey3JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jersey-3-appsec') diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/build.gradle new file mode 100644 index 00000000000..55e23c6fb6d --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/build.gradle @@ -0,0 +1,99 @@ +ext { + minJavaVersionForTests = JavaVersion.VERSION_11 +} + +muzzle { + pass { + name = "10_series" + group = "org.eclipse.jetty" + module = 'jetty-server' + versions = "[10,11)" + assertInverse = true + javaVersion = 11 + } + pass { + name = "after_10" + group = "org.eclipse.jetty" + module = 'jetty-server' + versions = "[10,12)" + assertInverse = true + javaVersion = 11 + } + pass { + name = 'named_dispatches' + group = 'org.eclipse.jetty' + module = 'jetty-server' + versions = "[10.0.16,11),[11.0.16,12)" + assertInverse = true + //extraDependency "javax.servlet:javax.servlet-api:3.1.0" + //extraDependency "jakarta.servlet:jakarta.servlet-api:5.0.0" + javaVersion = 11 + } +} + +apply from: "$rootDir/gradle/java.gradle" +apply plugin: "idea" + +addTestSuiteForDir("latestDepTest", "test") +addTestSuiteExtendingForDir("latestDepForkedTest", "latestDepTest", "test") + +dependencies { + main_java11Implementation project(':dd-java-agent:instrumentation:jetty:jetty-common') + main_java11Implementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') + main_java11CompileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.0.0' + + // Don't want to conflict with jetty from the test server. + testImplementation(project(':dd-java-agent:instrumentation-testing')) { + exclude group: 'org.eclipse.jetty', module: 'jetty-server' + } + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-util-9.4.31') + + testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.0.0' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '10.0.0' + testImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.0.0' + testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') + testImplementation testFixtures(project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0")) + testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + // Include all jetty-server instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-2.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') + // Include all appsec instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-7.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-8.1.3') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') + // Include all websocket instrumentation modules for testing. Only the version-compatible module will apply at runtime. + 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') + + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.+' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '10.+' + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.+' + latestDepTestImplementation project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') + latestDepTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '10.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.+' + latestDepForkedTestImplementation project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') + latestDepForkedTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) +} + +configurations.named('latestDepForkedTestRuntimeClasspath') { + resolutionStrategy { + force libs.slf4j + } +} + +tasks.withType(AbstractCompile).configureEach { + configureCompiler(it, 11, JavaVersion.VERSION_1_8) +} + +idea { + module { + jdkName = '11' + } +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/DispatchableInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/DispatchableInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/DispatchableInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/DispatchableInstrumentation.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyCommitResponseInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyCommitResponseInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyCommitResponseInstrumentation.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java index 874a618c0db..4010bfec103 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/JettyServerInstrumentation.java @@ -44,11 +44,6 @@ public JettyServerInstrumentation() { super("jetty"); } - @Override - public String muzzleDirective() { - return "10_series"; - } - @Override public String instrumentedType() { return "org.eclipse.jetty.server.HttpChannel"; @@ -90,6 +85,11 @@ public Reference[] additionalMuzzleReferences() { }; } + @Override + public String muzzleDirective() { + return "10_series"; + } + @Override public void typeAdvice(TypeTransformer transformer) { transformer.applyAdvice(new HttpChannelHandleVisitorWrapper()); diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/RequestInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/RequestInstrumentation.java similarity index 99% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/RequestInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/RequestInstrumentation.java index d2a487f37e7..8cc1645787b 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/RequestInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/RequestInstrumentation.java @@ -15,16 +15,15 @@ public RequestInstrumentation() { super("jetty"); } - @Override - public String muzzleDirective() { - return "10_series"; - } - @Override public String instrumentedType() { return "org.eclipse.jetty.server.Request"; } + public String muzzleDirective() { + return "10_series"; + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/ServerHandleInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/ServerHandleInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty10/ServerHandleInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java/datadog/trace/instrumentation/jetty10/ServerHandleInstrumentation.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/DispatchableAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/ExtractAdapter.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/ExtractAdapter.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/ExtractAdapter.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/ExtractAdapter.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/HandleAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/HandleAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleExceptionAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/HandleExceptionAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/HandleExceptionAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/HandleExceptionAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyCommitResponseHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyDecorator.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyDecorator.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyDecorator.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyDecorator.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/JettyOnCommitBlockingHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/ResetAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/ResetAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/ResetAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/ResetAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SendResponseCbAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SendResponseCbAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SendResponseCbAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SendResponseCbAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/ServerHandleAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/ServerHandleAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/ServerHandleAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/ServerHandleAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SetContextPathAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SetContextPathAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SetContextPathAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SetContextPathAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SetRequestedSessionIdAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SetRequestedSessionIdAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SetRequestedSessionIdAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SetRequestedSessionIdAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SetServletPathAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SetServletPathAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty10/datadog/trace/instrumentation/jetty10/SetServletPathAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/main/java11/datadog/trace/instrumentation/jetty10/SetServletPathAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/test/groovy/datadog/trace/instrumentation/jetty10/Jetty10InactiveAppSecTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/test/groovy/datadog/trace/instrumentation/jetty10/Jetty10InactiveAppSecTest.groovy new file mode 100644 index 00000000000..dc81a291c81 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/test/groovy/datadog/trace/instrumentation/jetty10/Jetty10InactiveAppSecTest.groovy @@ -0,0 +1,12 @@ +package datadog.trace.instrumentation.jetty10 + +import com.datadog.appsec.AppSecInactiveHttpServerTest +import datadog.trace.agent.test.base.HttpServer +import test.JettyServer +import test.TestHandler + +class Jetty10InactiveAppSecTest extends AppSecInactiveHttpServerTest { + HttpServer server() { + new JettyServer(TestHandler.INSTANCE) + } +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/test/groovy/datadog/trace/instrumentation/jetty10/Jetty10Test.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/test/groovy/datadog/trace/instrumentation/jetty10/Jetty10Test.groovy new file mode 100644 index 00000000000..7dec61c223f --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-10.0/src/test/groovy/datadog/trace/instrumentation/jetty10/Jetty10Test.groovy @@ -0,0 +1,107 @@ +package datadog.trace.instrumentation.jetty10 + +import datadog.trace.agent.test.base.HttpServer +import datadog.trace.agent.test.base.HttpServerTest +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.server.handler.AbstractHandler +import test.JettyServer +import test.TestHandler + +abstract class Jetty10Test extends HttpServerTest { + + @Override + HttpServer server() { + new JettyServer(handler(), useWebsocketPojoEndpoint()) + } + + AbstractHandler handler() { + TestHandler.INSTANCE + } + + @Override + String component() { + "jetty-server" + } + + @Override + String expectedOperationName() { + operation() + } + + protected boolean useWebsocketPojoEndpoint() { + // only supported in jetty 10+ + isLatestDepTest + } + + + @Override + protected boolean enabledFinishTimingChecks() { + true + } + + @Override + boolean testExceptionBody() { + false + } + + @Override + boolean testBodyUrlencoded() { + true + } + + @Override + boolean testRequestBody() { + true + } + + @Override + boolean testRequestBodyISVariant() { + true + } + + @Override + boolean testUserBlocking() { + true + } + + @Override + boolean testBlocking() { + true + } + + @Override + boolean testBlockingOnResponse() { + true + } + + @Override + boolean hasExtraErrorInformation() { + true + } + + @Override + boolean testBodyMultipart() { + true + } + + @Override + boolean testSessionId() { + true + } + + @Override + boolean testWebsockets() { + return super.testWebsockets() && (getServer() as JettyServer).websocketAvailable + } +} + +class Jetty10V0ForkedTest extends Jetty10Test implements TestingGenericHttpNamingConventions.ServerV0 { +} + +class Jetty10V1ForkedTest extends Jetty10Test implements TestingGenericHttpNamingConventions.ServerV1 { + @Override + protected boolean useWebsocketPojoEndpoint() { + false + } +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle index 1aea056660d..0de01c779fa 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle @@ -17,17 +17,6 @@ apply plugin: "idea" addTestSuiteForDir('latestDepTest', 'test') addTestSuiteForDir('latestDepForkedTest', 'test') -tasks.named("compileMain_java11Java") { - configureCompiler(it, 11, JavaVersion.VERSION_1_8) -} - -tasks.withType(GroovyCompile).configureEach { - javaLauncher = getJavaLauncherFor(11) -} -tasks.withType(Test).configureEach { - javaLauncher = getJavaLauncherFor(11) -} - dependencies { main_java11CompileOnly ("org.eclipse.jetty:jetty-server:11.0.0") { exclude group: 'org.slf4j', module: 'slf4j-api' @@ -40,8 +29,6 @@ dependencies { 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:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } @@ -62,6 +49,7 @@ dependencies { testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:jakarta-servlet-5.0')) testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-10.0') testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:jakarta-servlet-5.0') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0') @@ -83,6 +71,14 @@ dependencies { latestDepTestRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') } +tasks.withType(AbstractCompile).configureEach { + configureCompiler(it, 11, JavaVersion.VERSION_1_8) +} + +tasks.withType(Test).configureEach { + javaLauncher = getJavaLauncherFor(11) +} + idea { module { jdkName = '11' diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/build.gradle new file mode 100644 index 00000000000..9d174eb9b5b --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/build.gradle @@ -0,0 +1,52 @@ +muzzle { + pass { + group = "org.eclipse.jetty" + module = 'jetty-server' + versions = "[9.0.4,9.3.0.M1)" + assertInverse = true + } +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuiteForDir("latestDepTest", "test") +addTestSuiteExtendingForDir("latestDepForkedTest", "latestDepTest", "test") + +dependencies { + implementation project(':dd-java-agent:instrumentation:jetty:jetty-common') + implementation project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.0.4.v20130625' + + // Don't want to conflict with jetty from the test server. + testImplementation(project(':dd-java-agent:instrumentation-testing')) { + exclude group: 'org.eclipse.jetty', module: 'jetty-server' + } + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-util-9.4.31') + + testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.0.4.v20130625' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.0.4.v20130625' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.0.4.v20130625' + testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') + testImplementation testFixtures(project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0")) + testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + // Include all jetty-server instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-2.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') + // Include all appsec instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-7.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-8.1.3') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.2') + + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.2.30.v20200428' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.2.+' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.2.+' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.2.+' + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.2.+' + + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.2.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.2.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.2.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.2.+' +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseInstrumentation.java similarity index 97% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseInstrumentation.java index 4c6e9189333..9dbb03c9a06 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyCommitResponseInstrumentation.java @@ -17,11 +17,6 @@ public JettyCommitResponseInstrumentation() { super("jetty"); } - @Override - public String muzzleDirective() { - return "between_904_and_930"; - } - @Override public Reference[] additionalMuzzleReferences() { return new Reference[] { diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/JettyOnCommitBlockingHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/SendResponseCbAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/SendResponseCbAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty904/datadog/trace/instrumentation/jetty904/SendResponseCbAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/main/java/datadog/trace/instrumentation/jetty904/SendResponseCbAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy new file mode 100644 index 00000000000..b54000a00ec --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy @@ -0,0 +1,12 @@ +package datadog.trace.instrumentation.jetty9 + +import com.datadog.appsec.AppSecInactiveHttpServerTest +import datadog.trace.agent.test.base.HttpServer +import test.JettyServer +import test.TestHandler + +class Jetty9InactiveAppSecTest extends AppSecInactiveHttpServerTest { + HttpServer server() { + new JettyServer(TestHandler.INSTANCE) + } +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy new file mode 100644 index 00000000000..4bf688a1700 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy @@ -0,0 +1,103 @@ +package datadog.trace.instrumentation.jetty9 + +import datadog.trace.agent.test.base.HttpServer +import datadog.trace.agent.test.base.HttpServerTest +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.server.handler.AbstractHandler +import test.JettyServer +import test.TestHandler + +abstract class Jetty9Test extends HttpServerTest { + + @Override + HttpServer server() { + new JettyServer(handler(), useWebsocketPojoEndpoint()) + } + + AbstractHandler handler() { + TestHandler.INSTANCE + } + + @Override + String component() { + "jetty-server" + } + + @Override + String expectedOperationName() { + operation() + } + + protected boolean useWebsocketPojoEndpoint() { + // only supported in jetty 10+ + false + } + + + @Override + protected boolean enabledFinishTimingChecks() { + true + } + + @Override + boolean testExceptionBody() { + false + } + + @Override + boolean testBodyUrlencoded() { + true + } + + @Override + boolean testRequestBody() { + true + } + + @Override + boolean testRequestBodyISVariant() { + true + } + + @Override + boolean testUserBlocking() { + true + } + + @Override + boolean testBlocking() { + true + } + + @Override + boolean testBlockingOnResponse() { + true + } + + @Override + boolean hasExtraErrorInformation() { + true + } + + @Override + boolean testBodyMultipart() { + true + } + + @Override + boolean testSessionId() { + true + } + + @Override + boolean testWebsockets() { + return super.testWebsockets() && (getServer() as JettyServer).websocketAvailable + } +} + +class Jetty9V0Test extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV0 { +} + +class Jetty9V1ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV1 { +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy new file mode 100644 index 00000000000..a9999d16b8b --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0.4/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy @@ -0,0 +1,98 @@ +package datadog.trace.instrumentation.jetty9 + +import datadog.trace.agent.test.asserts.TraceAssert +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import datadog.trace.bootstrap.instrumentation.api.Tags +import datadog.trace.instrumentation.servlet3.AsyncDispatcherDecorator +import org.eclipse.jetty.continuation.Continuation +import org.eclipse.jetty.continuation.ContinuationSupport +import org.eclipse.jetty.server.Request +import org.eclipse.jetty.server.handler.AbstractHandler +import org.eclipse.jetty.server.session.SessionHandler + +import javax.servlet.MultipartConfigElement +import javax.servlet.ServletException +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + +import static test.TestHandler.handleRequest +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR +import static datadog.trace.instrumentation.servlet3.TestServlet3.SERVLET_TIMEOUT + +abstract class JettyContinuationHandlerTest extends Jetty9Test { + + @Override + AbstractHandler handler() { + def ret = new SessionHandler() + ret.handler = ContinuationTestHandler.INSTANCE + ret + } + + static class ContinuationTestHandler extends AbstractHandler { + private static final MultipartConfigElement MULTIPART_CONFIG_ELEMENT = new MultipartConfigElement(System.getProperty('java.io.tmpdir')) + static final ContinuationTestHandler INSTANCE = new ContinuationTestHandler() + final ExecutorService executorService = Executors.newSingleThreadExecutor() + + @Override + void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setAttribute('org.eclipse.jetty.multipartConfig', MULTIPART_CONFIG_ELEMENT) + request.setAttribute('org.eclipse.multipartConfig', MULTIPART_CONFIG_ELEMENT) + final Continuation continuation = ContinuationSupport.getContinuation(request) + // some versions of jetty (like 9.4.15.v20190215) get into a loop: + // after an exception from handleRequest, the error will be handled here again; + // calling handleRequest will cause a new exception, and the process will repeat. + // this happens in the /exception endpoint + if (!request.getAttribute('javax.servlet.error.status_code')) { + if (continuation.initial) { + continuation.suspend() + executorService.execute { + continuation.resume() + } + } else { + handleRequest(baseRequest, response) + } + } + baseRequest.handled = true + } + } + + @Override + boolean hasHandlerSpan() { + true + } + + @Override + void handlerSpan(TraceAssert trace, ServerEndpoint endpoint = SUCCESS) { + trace.span { + serviceName expectedServiceName() + operationName 'servlet.dispatch' + resourceName 'servlet.dispatch' // should this not be a path? + childOfPrevious() + errored(endpoint.throwsException || endpoint == TIMEOUT_ERROR) + tags { + "$Tags.COMPONENT" AsyncDispatcherDecorator.DECORATE.component() + if (endpoint == TIMEOUT || endpoint == TIMEOUT_ERROR) { + "timeout" SERVLET_TIMEOUT + } + if (endpoint.throwsException) { + "error.message" endpoint.body + "error.type" { it == Exception.name || it == InputMismatchException.name } + "error.stack" String + } + defaultTags() + } + } + } +} + +class JettyContinuationHandlerV0ForkedTest extends JettyContinuationHandlerTest implements TestingGenericHttpNamingConventions.ServerV0 { + +} + +class JettyContinuationHandlerV1ForkedTest extends JettyContinuationHandlerTest implements TestingGenericHttpNamingConventions.ServerV1 { + +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/build.gradle index 90ad689f9f2..3a1e9dfa6dd 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/build.gradle @@ -7,162 +7,22 @@ muzzle { assertInverse = true } pass { - name = 'before_904' + name = "before_904" group = "org.eclipse.jetty" module = 'jetty-server' versions = "[9,9.0.4)" assertInverse = true } - pass { - name = 'between_904_and_930' - group = "org.eclipse.jetty" - module = 'jetty-server' - versions = "[9.0.4,9.3.0.M1)" - assertInverse = true - } - pass { - name = 'between_930_and_9421' - group = "org.eclipse.jetty" - module = 'jetty-server' - versions = "[9.3.0.M1,9.4.21)" - assertInverse = true - } - pass { - name = 'between_9421_and_10' - group = "org.eclipse.jetty" - module = 'jetty-server' - versions = "[9.4.21,10)" - assertInverse = true - } - pass { - name = '10_series' - group = "org.eclipse.jetty" - module = 'jetty-server' - versions = "[10,11)" - assertInverse = true - javaVersion = 11 - } - pass { - name = 'named_dispatches' - group = 'org.eclipse.jetty' - module = 'jetty-server' - versions = "[10.0.16,11),[11.0.16,12)" - assertInverse = true - javaVersion = 11 - } - pass { - name = 'between_10_and_12' - group = "org.eclipse.jetty" - module = 'jetty-server' - versions = "[10,12)" - assertInverse = true - javaVersion = 11 - } } apply plugin: 'java-test-fixtures' apply from: "$rootDir/gradle/java.gradle" -sourceSets { - main_jetty904 { - java.srcDirs "${project.projectDir}/src/main/java_jetty904" - } - main_jetty93 { - java.srcDirs "${project.projectDir}/src/main/java_jetty93" - } - main_jetty9421 { - java.srcDirs "${project.projectDir}/src/main/java_jetty9421" - } - main_jetty10 { - java.srcDirs "${project.projectDir}/src/main/java_jetty10" - } -} - -jar { - from sourceSets.main_jetty904.output - from sourceSets.main_jetty93.output - from sourceSets.main_jetty9421.output - from sourceSets.main_jetty10.output -} - -List extraInstrumentJavaDirs = [] -['main_jetty904', 'main_jetty93', 'main_jetty9421', 'main_jetty10'].each { - JavaCompile compileTask = tasks["compile${it.capitalize()}Java"] - extraInstrumentJavaDirs << compileTask.destinationDirectory - compileTask.dependsOn tasks['compileJava'] - project.afterEvaluate { p -> - tasks['instrumentJava'].dependsOn compileTask - tasks["forbiddenApis${it.capitalize()}"].dependsOn("instrument${it.capitalize()}Java") - } -} - -instrument { - // the instrumenters are in main, but helpers/advice in possibly other sourceSets - // The muzzle generator of references run as part of InstrumentJava needs access to - // these extra classes. The task dependencies for instrumentJava are added above - additionalClasspath = [ - instrumentJava: extraInstrumentJavaDirs - ] -} - -tasks.named("compileMain_jetty10Java", JavaCompile) { - configureCompiler(it, 11, JavaVersion.VERSION_1_8) -} - -addTestSuiteForDir('jetty92ForkedTest', 'test') -addTestSuiteForDir('jetty94ForkedTest', 'test') -addTestSuiteForDir('latestDepJetty9ForkedTest', 'test') -addTestSuiteForDir('latestDepForkedTest', 'test') - -tasks.named("latestDepForkedTest") { - javaLauncher = getJavaLauncherFor(11) -} -tasks.named("compileLatestDepForkedTestGroovy", GroovyCompile) { - configureCompiler(it, 11) -} - dependencies { compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.0.0.v20130308' implementation project(':dd-java-agent:instrumentation:jetty:jetty-common') - main_jetty904CompileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.0.4.v20130625' - main_jetty904CompileOnly project(':internal-api') - main_jetty904CompileOnly project(':dd-java-agent:agent-tooling') - main_jetty904CompileOnly project(':dd-java-agent:agent-bootstrap') - // not pretty, but we can't depend on sourceSets.main.output; - // that would make a dependency on the classes task due to the - // intermediation of the InstrumentPlugin, creating a circular - // dependency (the instrument plugin needs all the sourceSets - // compiled to properly generate References) - main_jetty904CompileOnly files("$project.buildDir/classes/java/raw") - - main_jetty93CompileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.3.0.v20150612' - main_jetty93CompileOnly project(':internal-api') - main_jetty93CompileOnly project(':dd-java-agent:agent-tooling') - main_jetty93CompileOnly project(':dd-java-agent:agent-bootstrap') - main_jetty93CompileOnly files("$project.buildDir/classes/java/raw") { - builtBy = ['compileJava'] - } - - main_jetty9421CompileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.21.v20190926' - main_jetty9421CompileOnly project(':internal-api') - main_jetty9421CompileOnly project(':dd-java-agent:agent-tooling') - main_jetty9421CompileOnly project(':dd-java-agent:agent-bootstrap') - main_jetty9421CompileOnly files("$project.buildDir/classes/java/raw") { - builtBy = ['compileJava'] - } - - 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') - main_jetty10Implementation project(':dd-java-agent:instrumentation:jetty:jetty-common') - main_jetty10CompileOnly files("$project.buildDir/classes/java/raw") { - builtBy = ['compileJava'] - } - testFixturesImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } @@ -183,40 +43,7 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-2.2') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec: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:javax-servlet:javax-servlet-3.0')) testFixturesImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') - - jetty92TestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.2.30.v20200428' - jetty92TestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.2.30.v20200428' - jetty92TestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.2.30.v20200428' - jetty92TestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.2.30.v20200428' - jetty92TestImplementation project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.2') - jetty92TestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) - - jetty94TestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.15.v20190215' - jetty94TestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.15.v20190215' - jetty94TestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.4.15.v20190215' - jetty94TestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.4.15.v20190215' - jetty94TestImplementation project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') - jetty94TestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) - - latestDepJetty9TestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.+' - latestDepJetty9TestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.+' - latestDepJetty9TestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.+' - latestDepJetty9TestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.+' - - latestDepJetty9TestImplementation project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') - latestDepJetty9TestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) - - latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.+' - latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '10.+' - latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'websocket-javax-server', version: '10.+' - latestDepTestImplementation project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') - latestDepTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) -} -configurations.getByName('latestDepForkedTestRuntimeClasspath').resolutionStrategy { - force libs.slf4j } diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java index fb92469eaa7..8e478cad61a 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9/JettyCommitResponseInstrumentation.java @@ -30,11 +30,6 @@ public JettyCommitResponseInstrumentation() { super("jetty"); } - @Override - public String muzzleDirective() { - return "before_904"; - } - @Override public Reference[] additionalMuzzleReferences() { return new Reference[] { @@ -69,6 +64,11 @@ public String[] helperClassNames() { }; } + @Override + public String muzzleDirective() { + return "before_904"; + } + @Override public void methodAdvice(MethodTransformer transformer) { transformer.applyAdvice( diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy index 35b4b2c2e51..7ec4c03dd10 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy @@ -30,8 +30,7 @@ abstract class Jetty9Test extends HttpServerTest { } protected boolean useWebsocketPojoEndpoint() { - // only supported in jetty 10+ - isLatestDepTest + false } @@ -96,12 +95,8 @@ abstract class Jetty9Test extends HttpServerTest { } } -class Jetty9V0ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV0 { +class Jetty9V0Test extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV0 { } class Jetty9V1ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV1 { - @Override - protected boolean useWebsocketPojoEndpoint() { - false - } } diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/build.gradle new file mode 100644 index 00000000000..5d08c44f4c9 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/build.gradle @@ -0,0 +1,55 @@ +muzzle { + pass { + group = "org.eclipse.jetty" + module = 'jetty-server' + versions = "[9.3.0.M1,9.4.21)" + assertInverse = true + } +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuiteForDir('latestDepTest', 'test') +addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test') + +dependencies { + implementation project(':dd-java-agent:instrumentation:jetty:jetty-common') + implementation project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.3.0.M1' + + // Don't want to conflict with jetty from the test server. + testImplementation(project(':dd-java-agent:instrumentation-testing')) { + exclude group: 'org.eclipse.jetty', module: 'jetty-server' + } + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-util-9.4.31') + + testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.3.0.M1' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.3.0.M1' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.3.0.M1' + testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') + testImplementation testFixtures(project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0")) + testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + // Include all jetty-server instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0.4") + testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-2.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') + // Include all appsec instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-7.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-8.1.3') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') + + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.20.v20190813' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.20.v20190813' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.4.20.v20190813' + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.4.20.v20190813' + latestDepTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.20.v20190813' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.20.v20190813' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.4.20.v20190813' + latestDepForkedTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseInstrumentation.java similarity index 97% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseInstrumentation.java index f9490ab5b83..61ea4856ffe 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyCommitResponseInstrumentation.java @@ -17,11 +17,6 @@ public JettyCommitResponseInstrumentation() { super("jetty"); } - @Override - public String muzzleDirective() { - return "between_930_and_9421"; - } - @Override public Reference[] additionalMuzzleReferences() { return new Reference[] { diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyOnCommitBlockingHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/JettyOnCommitBlockingHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/JettyOnCommitBlockingHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/SendResponseCbAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/SendResponseCbAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty93/datadog/trace/instrumentation/jetty93/SendResponseCbAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/main/java/datadog/trace/instrumentation/jetty93/SendResponseCbAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy new file mode 100644 index 00000000000..b54000a00ec --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy @@ -0,0 +1,12 @@ +package datadog.trace.instrumentation.jetty9 + +import com.datadog.appsec.AppSecInactiveHttpServerTest +import datadog.trace.agent.test.base.HttpServer +import test.JettyServer +import test.TestHandler + +class Jetty9InactiveAppSecTest extends AppSecInactiveHttpServerTest { + HttpServer server() { + new JettyServer(TestHandler.INSTANCE) + } +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy new file mode 100644 index 00000000000..32a1b300c28 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy @@ -0,0 +1,102 @@ +package datadog.trace.instrumentation.jetty9 + +import datadog.trace.agent.test.base.HttpServer +import datadog.trace.agent.test.base.HttpServerTest +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.server.handler.AbstractHandler +import test.JettyServer +import test.TestHandler + +abstract class Jetty9Test extends HttpServerTest { + + @Override + HttpServer server() { + new JettyServer(handler(), useWebsocketPojoEndpoint()) + } + + AbstractHandler handler() { + TestHandler.INSTANCE + } + + @Override + String component() { + "jetty-server" + } + + @Override + String expectedOperationName() { + operation() + } + + protected boolean useWebsocketPojoEndpoint() { + false + } + + + @Override + protected boolean enabledFinishTimingChecks() { + true + } + + @Override + boolean testExceptionBody() { + false + } + + @Override + boolean testBodyUrlencoded() { + true + } + + @Override + boolean testRequestBody() { + true + } + + @Override + boolean testRequestBodyISVariant() { + true + } + + @Override + boolean testUserBlocking() { + true + } + + @Override + boolean testBlocking() { + true + } + + @Override + boolean testBlockingOnResponse() { + true + } + + @Override + boolean hasExtraErrorInformation() { + true + } + + @Override + boolean testBodyMultipart() { + true + } + + @Override + boolean testSessionId() { + true + } + + @Override + boolean testWebsockets() { + return super.testWebsockets() && (getServer() as JettyServer).websocketAvailable + } +} + +class Jetty9V0ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV0 { +} + +class Jetty9V1ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV1 { +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy new file mode 100644 index 00000000000..a9999d16b8b --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.3/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy @@ -0,0 +1,98 @@ +package datadog.trace.instrumentation.jetty9 + +import datadog.trace.agent.test.asserts.TraceAssert +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import datadog.trace.bootstrap.instrumentation.api.Tags +import datadog.trace.instrumentation.servlet3.AsyncDispatcherDecorator +import org.eclipse.jetty.continuation.Continuation +import org.eclipse.jetty.continuation.ContinuationSupport +import org.eclipse.jetty.server.Request +import org.eclipse.jetty.server.handler.AbstractHandler +import org.eclipse.jetty.server.session.SessionHandler + +import javax.servlet.MultipartConfigElement +import javax.servlet.ServletException +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + +import static test.TestHandler.handleRequest +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR +import static datadog.trace.instrumentation.servlet3.TestServlet3.SERVLET_TIMEOUT + +abstract class JettyContinuationHandlerTest extends Jetty9Test { + + @Override + AbstractHandler handler() { + def ret = new SessionHandler() + ret.handler = ContinuationTestHandler.INSTANCE + ret + } + + static class ContinuationTestHandler extends AbstractHandler { + private static final MultipartConfigElement MULTIPART_CONFIG_ELEMENT = new MultipartConfigElement(System.getProperty('java.io.tmpdir')) + static final ContinuationTestHandler INSTANCE = new ContinuationTestHandler() + final ExecutorService executorService = Executors.newSingleThreadExecutor() + + @Override + void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setAttribute('org.eclipse.jetty.multipartConfig', MULTIPART_CONFIG_ELEMENT) + request.setAttribute('org.eclipse.multipartConfig', MULTIPART_CONFIG_ELEMENT) + final Continuation continuation = ContinuationSupport.getContinuation(request) + // some versions of jetty (like 9.4.15.v20190215) get into a loop: + // after an exception from handleRequest, the error will be handled here again; + // calling handleRequest will cause a new exception, and the process will repeat. + // this happens in the /exception endpoint + if (!request.getAttribute('javax.servlet.error.status_code')) { + if (continuation.initial) { + continuation.suspend() + executorService.execute { + continuation.resume() + } + } else { + handleRequest(baseRequest, response) + } + } + baseRequest.handled = true + } + } + + @Override + boolean hasHandlerSpan() { + true + } + + @Override + void handlerSpan(TraceAssert trace, ServerEndpoint endpoint = SUCCESS) { + trace.span { + serviceName expectedServiceName() + operationName 'servlet.dispatch' + resourceName 'servlet.dispatch' // should this not be a path? + childOfPrevious() + errored(endpoint.throwsException || endpoint == TIMEOUT_ERROR) + tags { + "$Tags.COMPONENT" AsyncDispatcherDecorator.DECORATE.component() + if (endpoint == TIMEOUT || endpoint == TIMEOUT_ERROR) { + "timeout" SERVLET_TIMEOUT + } + if (endpoint.throwsException) { + "error.message" endpoint.body + "error.type" { it == Exception.name || it == InputMismatchException.name } + "error.stack" String + } + defaultTags() + } + } + } +} + +class JettyContinuationHandlerV0ForkedTest extends JettyContinuationHandlerTest implements TestingGenericHttpNamingConventions.ServerV0 { + +} + +class JettyContinuationHandlerV1ForkedTest extends JettyContinuationHandlerTest implements TestingGenericHttpNamingConventions.ServerV1 { + +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/build.gradle new file mode 100644 index 00000000000..d9ef585146e --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/build.gradle @@ -0,0 +1,57 @@ +muzzle { + pass { + name = 'between_9421_and_10' + group = "org.eclipse.jetty" + module = 'jetty-server' + versions = "[9.4.21,10)" + assertInverse = true + } +} + +apply from: "$rootDir/gradle/java.gradle" + +addTestSuiteForDir('latestDepTest', 'test') +addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test') + +dependencies { + implementation project(':dd-java-agent:instrumentation:jetty:jetty-common') + implementation project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.21.v20190926' + + // Don't want to conflict with jetty from the test server. + testImplementation(project(':dd-java-agent:instrumentation-testing')) { + exclude group: 'org.eclipse.jetty', module: 'jetty-server' + } + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-util-9.4.31') + + testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.4.21.v20190926' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.4.21.v20190926' + testImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.4.21.v20190926' + testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') + testImplementation testFixtures(project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0")) + testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + // Include all jetty-server instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0") + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0.4") + testRuntimeOnly project(":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.3") + testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-2.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') + // Include all appsec instrumentation modules for testing. Only the version-compatible module will apply at runtime. + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-7.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-8.1.3') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.2') + testRuntimeOnly project(':dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-9.3') + + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.+' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.+' + latestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.+' + latestDepTestImplementation group: 'org.eclipse.jetty.websocket', name: 'javax-websocket-server-impl', version: '9.+' + latestDepTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) + + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.+' + latestDepForkedTestImplementation group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '9.+' + latestDepForkedTestImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseInstrumentation.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseInstrumentation.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyCommitResponseInstrumentation.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/JettyOnCommitBlockingHelper.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/SendResponseCbAdvice.java b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/SendResponseCbAdvice.java similarity index 100% rename from dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.0/src/main/java_jetty9421/datadog/trace/instrumentation/jetty9421/SendResponseCbAdvice.java rename to dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/main/java/datadog/trace/instrumentation/jetty9421/SendResponseCbAdvice.java diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy new file mode 100644 index 00000000000..b54000a00ec --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9InactiveAppSecTest.groovy @@ -0,0 +1,12 @@ +package datadog.trace.instrumentation.jetty9 + +import com.datadog.appsec.AppSecInactiveHttpServerTest +import datadog.trace.agent.test.base.HttpServer +import test.JettyServer +import test.TestHandler + +class Jetty9InactiveAppSecTest extends AppSecInactiveHttpServerTest { + HttpServer server() { + new JettyServer(TestHandler.INSTANCE) + } +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy new file mode 100644 index 00000000000..38eb20340c6 --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/Jetty9Test.groovy @@ -0,0 +1,103 @@ +package datadog.trace.instrumentation.jetty9 + +import datadog.trace.agent.test.base.HttpServer +import datadog.trace.agent.test.base.HttpServerTest +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.server.handler.AbstractHandler +import test.JettyServer +import test.TestHandler + +abstract class Jetty9Test extends HttpServerTest { + + @Override + HttpServer server() { + new JettyServer(handler(), useWebsocketPojoEndpoint()) + } + + AbstractHandler handler() { + TestHandler.INSTANCE + } + + @Override + String component() { + "jetty-server" + } + + @Override + String expectedOperationName() { + operation() + } + + protected boolean useWebsocketPojoEndpoint() { + // only supported in jetty 10+ + false + } + + + @Override + protected boolean enabledFinishTimingChecks() { + true + } + + @Override + boolean testExceptionBody() { + false + } + + @Override + boolean testBodyUrlencoded() { + true + } + + @Override + boolean testRequestBody() { + true + } + + @Override + boolean testRequestBodyISVariant() { + true + } + + @Override + boolean testUserBlocking() { + true + } + + @Override + boolean testBlocking() { + true + } + + @Override + boolean testBlockingOnResponse() { + true + } + + @Override + boolean hasExtraErrorInformation() { + true + } + + @Override + boolean testBodyMultipart() { + true + } + + @Override + boolean testSessionId() { + true + } + + @Override + boolean testWebsockets() { + return super.testWebsockets() && (getServer() as JettyServer).websocketAvailable + } +} + +class Jetty9V0ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV0 { +} + +class Jetty9V1ForkedTest extends Jetty9Test implements TestingGenericHttpNamingConventions.ServerV1 { +} diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy new file mode 100644 index 00000000000..a9999d16b8b --- /dev/null +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-9.4.21/src/test/groovy/datadog/trace/instrumentation/jetty9/JettyContinuationHandlerTest.groovy @@ -0,0 +1,98 @@ +package datadog.trace.instrumentation.jetty9 + +import datadog.trace.agent.test.asserts.TraceAssert +import datadog.trace.agent.test.naming.TestingGenericHttpNamingConventions +import datadog.trace.bootstrap.instrumentation.api.Tags +import datadog.trace.instrumentation.servlet3.AsyncDispatcherDecorator +import org.eclipse.jetty.continuation.Continuation +import org.eclipse.jetty.continuation.ContinuationSupport +import org.eclipse.jetty.server.Request +import org.eclipse.jetty.server.handler.AbstractHandler +import org.eclipse.jetty.server.session.SessionHandler + +import javax.servlet.MultipartConfigElement +import javax.servlet.ServletException +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors + +import static test.TestHandler.handleRequest +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.TIMEOUT_ERROR +import static datadog.trace.instrumentation.servlet3.TestServlet3.SERVLET_TIMEOUT + +abstract class JettyContinuationHandlerTest extends Jetty9Test { + + @Override + AbstractHandler handler() { + def ret = new SessionHandler() + ret.handler = ContinuationTestHandler.INSTANCE + ret + } + + static class ContinuationTestHandler extends AbstractHandler { + private static final MultipartConfigElement MULTIPART_CONFIG_ELEMENT = new MultipartConfigElement(System.getProperty('java.io.tmpdir')) + static final ContinuationTestHandler INSTANCE = new ContinuationTestHandler() + final ExecutorService executorService = Executors.newSingleThreadExecutor() + + @Override + void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + request.setAttribute('org.eclipse.jetty.multipartConfig', MULTIPART_CONFIG_ELEMENT) + request.setAttribute('org.eclipse.multipartConfig', MULTIPART_CONFIG_ELEMENT) + final Continuation continuation = ContinuationSupport.getContinuation(request) + // some versions of jetty (like 9.4.15.v20190215) get into a loop: + // after an exception from handleRequest, the error will be handled here again; + // calling handleRequest will cause a new exception, and the process will repeat. + // this happens in the /exception endpoint + if (!request.getAttribute('javax.servlet.error.status_code')) { + if (continuation.initial) { + continuation.suspend() + executorService.execute { + continuation.resume() + } + } else { + handleRequest(baseRequest, response) + } + } + baseRequest.handled = true + } + } + + @Override + boolean hasHandlerSpan() { + true + } + + @Override + void handlerSpan(TraceAssert trace, ServerEndpoint endpoint = SUCCESS) { + trace.span { + serviceName expectedServiceName() + operationName 'servlet.dispatch' + resourceName 'servlet.dispatch' // should this not be a path? + childOfPrevious() + errored(endpoint.throwsException || endpoint == TIMEOUT_ERROR) + tags { + "$Tags.COMPONENT" AsyncDispatcherDecorator.DECORATE.component() + if (endpoint == TIMEOUT || endpoint == TIMEOUT_ERROR) { + "timeout" SERVLET_TIMEOUT + } + if (endpoint.throwsException) { + "error.message" endpoint.body + "error.type" { it == Exception.name || it == InputMismatchException.name } + "error.stack" String + } + defaultTags() + } + } + } +} + +class JettyContinuationHandlerV0ForkedTest extends JettyContinuationHandlerTest implements TestingGenericHttpNamingConventions.ServerV0 { + +} + +class JettyContinuationHandlerV1ForkedTest extends JettyContinuationHandlerTest implements TestingGenericHttpNamingConventions.ServerV1 { + +} diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle index 3333d751262..f1146605c33 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle @@ -49,6 +49,10 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-7.0') // See if there's any conflicts. testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-7.6') // See if there's any conflicts. testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0') // See if there's any conflicts. + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0.4') // See if there's any conflicts. + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.3') // See if there's any conflicts. + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.4.21') // See if there's any conflicts. + testImplementation project(':dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-10.0') // See if there's any conflicts. testImplementation project(':dd-java-agent:instrumentation:tomcat:tomcat-5.5') // See if there's any conflicts. testRuntimeOnly project(':dd-java-agent:instrumentation:tomcat:tomcat-appsec:tomcat-appsec-6.0') testRuntimeOnly project(':dd-java-agent:instrumentation:tomcat:tomcat-appsec:tomcat-appsec-7.0') diff --git a/settings.gradle.kts b/settings.gradle.kts index 62807b078f9..3f5b677ed2b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -407,6 +407,10 @@ include( ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-7.0", ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-7.6", ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0", + ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.0.4", + ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.3", + ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-9.4.21", + ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-10.0", ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-11.0", ":dd-java-agent:instrumentation:jetty:jetty-server:jetty-server-12.0", ":dd-java-agent:instrumentation:jetty:jetty-appsec:jetty-appsec-7.0",