diff --git a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/aws-java-sdk-1.11.0.gradle b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/aws-java-sdk-1.11.0.gradle index 165e4c96fd..88b5219514 100644 --- a/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/aws-java-sdk-1.11.0.gradle +++ b/dd-java-agent/instrumentation/aws-java-sdk-1.11.0/aws-java-sdk-1.11.0.gradle @@ -95,13 +95,6 @@ configurations.test_1_11_106Compile { } } -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'com.amazonaws', name: 'aws-java-sdk', version: '+' - } -} - - dependencies { compileOnly group: 'com.amazonaws', name: 'aws-java-sdk-core', version: '1.11.0' diff --git a/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle b/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle index 04073f11b2..85172f0f34 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle +++ b/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle @@ -36,10 +36,6 @@ dependencies { testCompile project(':dd-java-agent:testing') testCompile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0' testCompile group: 'org.cassandraunit', name: 'cassandra-unit', version: '3.1.3.2' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '+' - } + latestDepTestCompile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '+' } diff --git a/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle b/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle index 4a3dd56584..e317f7fa7a 100644 --- a/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle +++ b/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle @@ -53,7 +53,7 @@ dependencies { testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' - latestDepTestCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '+' - latestDepTestCompile group: 'org.elasticsearch.client', name: 'transport', version: '+' - latestDepTestCompile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-client', version: '+' + // Limit tests to <6.5 as the latest versions have a breaking change for the tests. + latestDepTestCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '(6.1,6.5)' + latestDepTestCompile group: 'org.elasticsearch.client', name: 'transport', version: '(6.1,6.5)' } diff --git a/dd-java-agent/instrumentation/grpc-1.5/grpc-1.5.gradle b/dd-java-agent/instrumentation/grpc-1.5/grpc-1.5.gradle index e78bbd13d0..9b426d90e3 100644 --- a/dd-java-agent/instrumentation/grpc-1.5/grpc-1.5.gradle +++ b/dd-java-agent/instrumentation/grpc-1.5/grpc-1.5.gradle @@ -60,12 +60,7 @@ dependencies { testCompile group: 'io.grpc', name: 'grpc-stub', version: grpcVersion latestDepTestCompile sourceSets.test.output // include the protobuf generated classes -} - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'io.grpc', name: 'grpc-netty', version: '+' - force group: 'io.grpc', name: 'grpc-protobuf', version: '+' - force group: 'io.grpc', name: 'grpc-stub', version: '+' - } + latestDepTestCompile group: 'io.grpc', name: 'grpc-netty', version: '+' + latestDepTestCompile group: 'io.grpc', name: 'grpc-protobuf', version: '+' + latestDepTestCompile group: 'io.grpc', name: 'grpc-stub', version: '+' } diff --git a/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle b/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle index 3f6de12dfc..d5f49073c0 100644 --- a/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle +++ b/dd-java-agent/instrumentation/hystrix-1.4/hystrix-1.4.gradle @@ -32,10 +32,6 @@ dependencies { testCompile project(':dd-java-agent:instrumentation:java-concurrent') testCompile project(':dd-java-agent:instrumentation:trace-annotation') testCompile group: 'com.netflix.hystrix', name: 'hystrix-core', version: '1.4.0' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'com.netflix.hystrix', name: 'hystrix-core', version: '+' - } + latestDepTestCompile group: 'com.netflix.hystrix', name: 'hystrix-core', version: '+' } diff --git a/dd-java-agent/instrumentation/jdbc/jdbc.gradle b/dd-java-agent/instrumentation/jdbc/jdbc.gradle index 3f07652afe..c22577c08b 100644 --- a/dd-java-agent/instrumentation/jdbc/jdbc.gradle +++ b/dd-java-agent/instrumentation/jdbc/jdbc.gradle @@ -33,17 +33,13 @@ dependencies { testCompile group: 'org.apache.tomcat', name: 'tomcat-juli', version: '7.0.19' testCompile group: 'com.zaxxer', name: 'HikariCP', version: '2.4.0' testCompile group: 'com.mchange', name: 'c3p0', version: '0.9.5' -} + + latestDepTestCompile group: 'com.h2database', name: 'h2', version: '+' + latestDepTestCompile group: 'org.apache.derby', name: 'derby', version: '+' + latestDepTestCompile group: 'org.hsqldb', name: 'hsqldb', version: '+' -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'com.h2database', name: 'h2', version: '+' - force group: 'org.apache.derby', name: 'derby', version: '+' - force group: 'org.hsqldb', name: 'hsqldb', version: '+' - - force group: 'org.apache.tomcat', name: 'tomcat-jdbc', version: '+' - force group: 'org.apache.tomcat', name: 'tomcat-juli', version: '+' - force group: 'com.zaxxer', name: 'HikariCP', version: '+' - force group: 'com.mchange', name: 'c3p0', version: '+' - } + latestDepTestCompile group: 'org.apache.tomcat', name: 'tomcat-jdbc', version: '+' + latestDepTestCompile group: 'org.apache.tomcat', name: 'tomcat-juli', version: '+' + latestDepTestCompile group: 'com.zaxxer', name: 'HikariCP', version: '+' + latestDepTestCompile group: 'com.mchange', name: 'c3p0', version: '+' } diff --git a/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle b/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle index 0bc34e6c04..7f8db7c4b5 100644 --- a/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle +++ b/dd-java-agent/instrumentation/jedis-1.4/jedis-1.4.gradle @@ -33,9 +33,3 @@ dependencies { latestDepTestCompile group: 'redis.clients', name: 'jedis', version: '+' } - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'redis.clients', name: 'jedis', version: '+' - } -} diff --git a/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle b/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle index 131467369f..ed13d35a2e 100644 --- a/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle +++ b/dd-java-agent/instrumentation/jetty-8/jetty-8.gradle @@ -33,11 +33,9 @@ dependencies { } testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.0.0.v20110901' testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.0.0.v20110901' -} + testCompile group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '8.0.0.v20110901' -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'org.eclipse.jetty', name: 'jetty-server', version: '+' - force group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+' - } + latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '+' + latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+' + latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '+' } diff --git a/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/HandlerInstrumentation.java b/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/HandlerInstrumentation.java index 5396bd9a7e..0fed87181c 100644 --- a/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/HandlerInstrumentation.java +++ b/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/HandlerInstrumentation.java @@ -16,7 +16,6 @@ import net.bytebuddy.matcher.ElementMatcher; @AutoService(Instrumenter.class) public final class HandlerInstrumentation extends Instrumenter.Default { - public static final String SERVLET_OPERATION_NAME = "jetty.request"; public HandlerInstrumentation() { super("jetty", "jetty-8"); diff --git a/dd-java-agent/instrumentation/jetty-8/src/test/groovy/JettyHandlerTest.groovy b/dd-java-agent/instrumentation/jetty-8/src/test/groovy/JettyHandlerTest.groovy index 8d4316f049..cb6b44d601 100644 --- a/dd-java-agent/instrumentation/jetty-8/src/test/groovy/JettyHandlerTest.groovy +++ b/dd-java-agent/instrumentation/jetty-8/src/test/groovy/JettyHandlerTest.groovy @@ -1,7 +1,6 @@ import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.TestUtils import datadog.trace.agent.test.utils.OkHttpUtils -import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes import okhttp3.OkHttpClient import org.eclipse.jetty.continuation.Continuation @@ -11,9 +10,11 @@ import org.eclipse.jetty.server.Request import org.eclipse.jetty.server.Server import org.eclipse.jetty.server.handler.AbstractHandler +import javax.servlet.DispatcherType import javax.servlet.ServletException import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse +import java.util.concurrent.atomic.AtomicBoolean class JettyHandlerTest extends AgentTestRunner { @@ -55,31 +56,30 @@ class JettyHandlerTest extends AgentTestRunner { expect: response.body().string().trim() == "Hello World" - TEST_WRITER.waitForTraces(1) - TEST_WRITER.size() == 1 - def trace = TEST_WRITER.firstTrace() - trace.size() == 1 - def context = trace[0].context() - context.serviceName == "unnamed-java-app" - context.operationName == "jetty.request" - context.resourceName == "GET ${handler.class.name}" - context.spanType == DDSpanTypes.HTTP_SERVER - !context.getErrorFlag() - context.parentId == "0" - def tags = context.tags - tags["http.url"] == "http://localhost:$port/" - tags["http.method"] == "GET" - tags["span.kind"] == "server" - tags["span.type"] == DDSpanTypes.HTTP_SERVER - tags["component"] == "jetty-handler" - tags["http.status_code"] == 200 - tags["thread.name"] != null - tags["thread.id"] != null - tags[Config.RUNTIME_ID_TAG] == Config.get().runtimeId - tags["span.origin.type"] == handler.class.name - tags.size() == 10 - } + assertTraces(1) { + trace(0, 1) { + span(0) { + serviceName "unnamed-java-app" + operationName "jetty.request" + resourceName "GET ${handler.class.name}" + spanType DDSpanTypes.HTTP_SERVER + errored false + parent() + tags { + "http.url" "http://localhost:$port/" + "http.method" "GET" + "span.kind" "server" + "component" "jetty-handler" + "span.origin.type" handler.class.name + "span.type" DDSpanTypes.HTTP_SERVER + "http.status_code" 200 + defaultTags() + } + } + } + } + } def "handler instrumentation clears state after async request"() { setup: @@ -87,7 +87,7 @@ class JettyHandlerTest extends AgentTestRunner { @Override void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { final Continuation continuation = ContinuationSupport.getContinuation(request) - continuation.suspend() + continuation.suspend(response) // By the way, this is a terrible async server new Thread() { @Override @@ -128,10 +128,16 @@ class JettyHandlerTest extends AgentTestRunner { def "call to jetty with error creates a trace"() { setup: + def errorHandlerCalled = new AtomicBoolean(false) Handler handler = new AbstractHandler() { @Override void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - throw new RuntimeException() + if (baseRequest.dispatcherType == DispatcherType.ERROR) { + errorHandlerCalled.set(true) + baseRequest.setHandled(true) + } else { + throw new RuntimeException() + } } } server.setHandler(handler) @@ -144,31 +150,52 @@ class JettyHandlerTest extends AgentTestRunner { expect: response.body().string().trim() == "" - TEST_WRITER.waitForTraces(1) - TEST_WRITER.size() == 1 - def trace = TEST_WRITER.firstTrace() - trace.size() == 1 - def context = trace[0].context() - context.serviceName == "unnamed-java-app" - context.operationName == "jetty.request" - context.resourceName == "GET ${handler.class.name}" - context.spanType == DDSpanTypes.HTTP_SERVER - context.getErrorFlag() - context.parentId == "0" - def tags = context.tags - tags["http.url"] == "http://localhost:$port/" - tags["http.method"] == "GET" - tags["span.kind"] == "server" - tags["span.type"] == DDSpanTypes.HTTP_SERVER - tags["component"] == "jetty-handler" - tags["http.status_code"] == 500 - tags["thread.name"] != null - tags["thread.id"] != null - tags[Config.RUNTIME_ID_TAG] == Config.get().runtimeId - tags["span.origin.type"] == handler.class.name - tags["error"] == true - tags["error.type"] == RuntimeException.name - tags["error.stack"] != null - tags.size() == 13 + + assertTraces(errorHandlerCalled.get() ? 2 : 1) { + trace(0, 1) { + span(0) { + serviceName "unnamed-java-app" + operationName "jetty.request" + resourceName "GET ${handler.class.name}" + spanType DDSpanTypes.HTTP_SERVER + errored true + parent() + tags { + "http.url" "http://localhost:$port/" + "http.method" "GET" + "span.kind" "server" + "component" "jetty-handler" + "span.origin.type" handler.class.name + "span.type" DDSpanTypes.HTTP_SERVER + "http.status_code" 500 + errorTags RuntimeException + defaultTags() + } + } + } + if (errorHandlerCalled.get()) { + trace(1, 1) { + span(0) { + serviceName "unnamed-java-app" + operationName "jetty.request" + resourceName "GET ${handler.class.name}" + spanType DDSpanTypes.HTTP_SERVER + errored true + parent() + tags { + "http.url" "http://localhost:$port/" + "http.method" "GET" + "span.kind" "server" + "component" "jetty-handler" + "span.origin.type" handler.class.name + "span.type" DDSpanTypes.HTTP_SERVER + "http.status_code" 500 + "error" true + defaultTags() + } + } + } + } + } } } diff --git a/dd-java-agent/instrumentation/jsp-2.3/jsp-2.3.gradle b/dd-java-agent/instrumentation/jsp-2.3/jsp-2.3.gradle index 21486fbe7c..20a917fc85 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/jsp-2.3.gradle +++ b/dd-java-agent/instrumentation/jsp-2.3/jsp-2.3.gradle @@ -38,14 +38,10 @@ dependencies { testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '7.0.37' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '7.0.37' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '7.0.37' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '+' - force group: 'javax.servlet', name: 'javax.servlet-api', version: '+' - force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+' - force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+' - force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '+' - } + latestDepTestCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '+' + latestDepTestCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '+' + latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+' + latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+' + latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '+' } diff --git a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java index 767aecbcd0..b93a63743d 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java +++ b/dd-java-agent/instrumentation/jsp-2.3/src/main/java/datadog/trace/instrumentation/jsp/JSPInstrumentation.java @@ -16,15 +16,19 @@ import io.opentracing.Scope; import io.opentracing.Span; import io.opentracing.tag.Tags; import io.opentracing.util.GlobalTracer; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Collections; import java.util.HashMap; import java.util.Map; import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.servlet.jsp.HttpJspPage; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; +import org.slf4j.LoggerFactory; @AutoService(Instrumenter.class) public final class JSPInstrumentation extends Instrumenter.Default { @@ -68,19 +72,28 @@ public final class JSPInstrumentation extends Instrumenter.Default { // get the JSP file name being rendered in an include action final Object includeServletPath = req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); String resourceName = req.getServletPath(); - if (includeServletPath != null && includeServletPath instanceof String) { + if (includeServletPath instanceof String) { resourceName = includeServletPath.toString(); } span.setTag(DDTags.RESOURCE_NAME, resourceName); final Object forwardOrigin = req.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH); - if (forwardOrigin != null && forwardOrigin instanceof String) { + if (forwardOrigin instanceof String) { span.setTag("jsp.forwardOrigin", forwardOrigin.toString()); } // add the request URL as a tag to provide better context when looking at spans produced by - // actions - span.setTag("jsp.requestURL", req.getRequestURL().toString()); + // actions. Tomcat 9 has relative path symbols in the value returned from + // HttpServletRequest#getRequestURL(), + // normalizing the URL should remove those symbols for readability and consistency + try { + span.setTag( + "jsp.requestURL", (new URI(req.getRequestURL().toString())).normalize().toString()); + } catch (final URISyntaxException uriSE) { + LoggerFactory.getLogger(HttpJspPage.class) + .warn("Failed to get and normalize request URL: " + uriSE.getMessage()); + } + Tags.COMPONENT.set(span, "jsp-http-servlet"); return scope; diff --git a/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy b/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy index 05c8dd6b0d..48b521b86c 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy +++ b/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationBasicTests.groovy @@ -45,17 +45,23 @@ class JSPInstrumentationBasicTests extends AgentTestRunner { OkHttpClient client = OkHttpUtils.client() def setupSpec() { - port = TestUtils.randomOpenPort() - tomcatServer = new Tomcat() - tomcatServer.setPort(port) - // comment to debug - tomcatServer.setSilent(true) - baseDir = Files.createTempDir() baseDir.deleteOnExit() expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir - baseUrl = "http://localhost:$port/$jspWebappContext" + + port = TestUtils.randomOpenPort() + + tomcatServer = new Tomcat() tomcatServer.setBaseDir(baseDir.getAbsolutePath()) + tomcatServer.setPort(port) + tomcatServer.getConnector() + // comment to debug + tomcatServer.setSilent(true) + // this is needed in tomcat 9, this triggers the creation of a connector, will not + // affect tomcat 7 and 8 + // https://stackoverflow.com/questions/48998387/code-works-with-embedded-apache-tomcat-8-but-not-with-9-whats-changed + tomcatServer.getConnector() + baseUrl = "http://localhost:$port/$jspWebappContext" appContext = tomcatServer.addWebapp("/$jspWebappContext", JSPInstrumentationBasicTests.getResource("/webapps/jsptest").getPath()) @@ -344,7 +350,14 @@ class JSPInstrumentationBasicTests extends AgentTestRunner { "span.origin.type" jspClassName "servlet.context" "/$jspWebappContext" "jsp.requestURL" reqUrl - errorTags(exceptionClass, errorMessage) + "error" true + "error.type" { String tagExceptionType -> + return tagExceptionType == exceptionClass.getName() || tagExceptionType.contains(exceptionClass.getSimpleName()) + } + "error.msg" { String tagErrorMsg -> + return errorMessageOptional || tagErrorMsg instanceof String + } + "error.stack" String defaultTags() } } @@ -373,10 +386,10 @@ class JSPInstrumentationBasicTests extends AgentTestRunner { res.close() where: - test | jspFileName | jspClassName | exceptionClass | errorMessage - "java runtime error" | "runtimeError.jsp" | "runtimeError_jsp" | ArithmeticException | String - "invalid write" | "invalidWrite.jsp" | "invalidWrite_jsp" | StringIndexOutOfBoundsException | String - "missing query gives null" | "getQuery.jsp" | "getQuery_jsp" | NullPointerException | null + test | jspFileName | jspClassName | exceptionClass | errorMessageOptional + "java runtime error" | "runtimeError.jsp" | "runtimeError_jsp" | ArithmeticException | false + "invalid write" | "invalidWrite.jsp" | "invalidWrite_jsp" | IndexOutOfBoundsException | true + "missing query gives null" | "getQuery.jsp" | "getQuery_jsp" | NullPointerException | true } def "non-erroneous include plain HTML GET"() { diff --git a/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy b/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy index 71abf2066d..94132aff2d 100644 --- a/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy +++ b/dd-java-agent/instrumentation/jsp-2.3/src/test/groovy/JSPInstrumentationForwardTests.groovy @@ -43,17 +43,24 @@ class JSPInstrumentationForwardTests extends AgentTestRunner { OkHttpClient client = OkHttpUtils.client() def setupSpec() { - port = TestUtils.randomOpenPort() - tomcatServer = new Tomcat() - tomcatServer.setPort(port) - // comment to debug - tomcatServer.setSilent(true) - baseDir = Files.createTempDir() baseDir.deleteOnExit() expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir - baseUrl = "http://localhost:$port/$jspWebappContext" + + port = TestUtils.randomOpenPort() + + tomcatServer = new Tomcat() tomcatServer.setBaseDir(baseDir.getAbsolutePath()) + tomcatServer.setPort(port) + tomcatServer.getConnector() + // comment to debug + tomcatServer.setSilent(true) + // this is needed in tomcat 9, this triggers the creation of a connector, will not + // affect tomcat 7 and 8 + // https://stackoverflow.com/questions/48998387/code-works-with-embedded-apache-tomcat-8-but-not-with-9-whats-changed + tomcatServer.getConnector() + + baseUrl = "http://localhost:$port/$jspWebappContext" appContext = tomcatServer.addWebapp("/$jspWebappContext", JSPInstrumentationForwardTests.getResource("/webapps/jsptest").getPath()) diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle b/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle index 367d2ec1d3..903e91ecf3 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/kafka-clients-0.11.gradle @@ -32,12 +32,9 @@ dependencies { testCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE' testCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE' testCompile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'org.apache.kafka', name: 'kafka-clients', version: '+' - force group: 'org.springframework.kafka', name: 'spring-kafka', version: '+' - force group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+' - } + latestDepTestCompile group: 'org.apache.kafka', name: 'kafka-clients', version: '+' + latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '+' + latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+' + latestDepTestCompile group: 'org.assertj', name: 'assertj-core', version: '3.+' } diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TextMapInjectAdapter.java b/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TextMapInjectAdapter.java index 2107e3cbef..e270655a3c 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TextMapInjectAdapter.java +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/TextMapInjectAdapter.java @@ -21,6 +21,6 @@ public class TextMapInjectAdapter implements TextMap { @Override public void put(final String key, final String value) { - headers.add(key, value.getBytes(StandardCharsets.UTF_8)); + headers.remove(key).add(key, value.getBytes(StandardCharsets.UTF_8)); } } diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/src/test/groovy/KafkaClientTest.groovy b/dd-java-agent/instrumentation/kafka-clients-0.11/src/test/groovy/KafkaClientTest.groovy index ce1cd9dc39..7715f98749 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/src/test/groovy/KafkaClientTest.groovy +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/src/test/groovy/KafkaClientTest.groovy @@ -7,7 +7,6 @@ import org.springframework.kafka.core.DefaultKafkaProducerFactory import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.listener.KafkaMessageListenerContainer import org.springframework.kafka.listener.MessageListener -import org.springframework.kafka.listener.config.ContainerProperties import org.springframework.kafka.test.rule.KafkaEmbedded import org.springframework.kafka.test.utils.ContainerTestUtils import org.springframework.kafka.test.utils.KafkaTestUtils @@ -36,7 +35,13 @@ class KafkaClientTest extends AgentTestRunner { def consumerFactory = new DefaultKafkaConsumerFactory(consumerProperties) // set the topic that needs to be consumed - ContainerProperties containerProperties = new ContainerProperties(SHARED_TOPIC) + def containerProperties + try { + // Different class names for test and latestDepTest. + containerProperties = Class.forName("org.springframework.kafka.listener.config.ContainerProperties").newInstance(SHARED_TOPIC) + } catch (ClassNotFoundException | NoClassDefFoundError e) { + containerProperties = Class.forName("org.springframework.kafka.listener.ContainerProperties").newInstance(SHARED_TOPIC) + } // create a Kafka MessageListenerContainer def container = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties) @@ -126,7 +131,7 @@ class KafkaClientTest extends AgentTestRunner { cleanup: producerFactory.stop() - container.stop() + container?.stop() } } diff --git a/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle b/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle index 5946bdebc6..974beb0284 100644 --- a/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle +++ b/dd-java-agent/instrumentation/kafka-streams-0.11/kafka-streams-0.11.gradle @@ -35,13 +35,10 @@ dependencies { testCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE' testCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE' testCompile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'org.apache.kafka', name: 'kafka-clients', version: '+' - force group: 'org.apache.kafka', name: 'kafka-streams', version: '+' - force group: 'org.springframework.kafka', name: 'spring-kafka', version: '+' - force group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+' - } + latestDepTestCompile group: 'org.apache.kafka', name: 'kafka-clients', version: '+' + latestDepTestCompile group: 'org.apache.kafka', name: 'kafka-streams', version: '+' + latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '+' + latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+' + latestDepTestCompile group: 'org.assertj', name: 'assertj-core', version: '3.+' } diff --git a/dd-java-agent/instrumentation/kafka-streams-0.11/src/test/groovy/KafkaStreamsTest.groovy b/dd-java-agent/instrumentation/kafka-streams-0.11/src/test/groovy/KafkaStreamsTest.groovy index 4dcc5ba50f..82336c440e 100644 --- a/dd-java-agent/instrumentation/kafka-streams-0.11/src/test/groovy/KafkaStreamsTest.groovy +++ b/dd-java-agent/instrumentation/kafka-streams-0.11/src/test/groovy/KafkaStreamsTest.groovy @@ -1,11 +1,9 @@ import datadog.trace.agent.test.AgentTestRunner -import datadog.trace.api.Config import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.common.serialization.Serdes import org.apache.kafka.streams.KafkaStreams import org.apache.kafka.streams.StreamsConfig import org.apache.kafka.streams.kstream.KStream -import org.apache.kafka.streams.kstream.KStreamBuilder import org.apache.kafka.streams.kstream.ValueMapper import org.junit.ClassRule import org.springframework.kafka.core.DefaultKafkaConsumerFactory @@ -13,7 +11,6 @@ import org.springframework.kafka.core.DefaultKafkaProducerFactory import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.listener.KafkaMessageListenerContainer import org.springframework.kafka.listener.MessageListener -import org.springframework.kafka.listener.config.ContainerProperties import org.springframework.kafka.test.rule.KafkaEmbedded import org.springframework.kafka.test.utils.ContainerTestUtils import org.springframework.kafka.test.utils.KafkaTestUtils @@ -41,7 +38,15 @@ class KafkaStreamsTest extends AgentTestRunner { // CONFIGURE CONSUMER def consumerFactory = new DefaultKafkaConsumerFactory(KafkaTestUtils.consumerProps("sender", "false", embeddedKafka)) - def consumerContainer = new KafkaMessageListenerContainer<>(consumerFactory, new ContainerProperties(STREAM_PROCESSED)) + + def containerProperties + try { + // Different class names for test and latestDepTest. + containerProperties = Class.forName("org.springframework.kafka.listener.config.ContainerProperties").newInstance(STREAM_PROCESSED) + } catch (ClassNotFoundException | NoClassDefFoundError e) { + containerProperties = Class.forName("org.springframework.kafka.listener.ContainerProperties").newInstance(STREAM_PROCESSED) + } + def consumerContainer = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties) // create a thread safe queue to store the processed message def records = new LinkedBlockingQueue>() @@ -65,9 +70,15 @@ class KafkaStreamsTest extends AgentTestRunner { ContainerTestUtils.waitForAssignment(consumerContainer, embeddedKafka.getPartitionsPerTopic()) // CONFIGURE PROCESSOR - final KStreamBuilder builder = new KStreamBuilder() + def builder + try { + // Different class names for test and latestDepTest. + builder = Class.forName("org.apache.kafka.streams.kstream.KStreamBuilder").newInstance() + } catch (ClassNotFoundException | NoClassDefFoundError e) { + builder = Class.forName("org.apache.kafka.streams.StreamsBuilder").newInstance() + } KStream textLines = builder.stream(STREAM_PENDING) - textLines + def values = textLines .mapValues(new ValueMapper() { @Override String apply(String textLine) { @@ -76,8 +87,18 @@ class KafkaStreamsTest extends AgentTestRunner { return textLine.toLowerCase() } }) - .to(Serdes.String(), Serdes.String(), STREAM_PROCESSED) - KafkaStreams streams = new KafkaStreams(builder, config) + + KafkaStreams streams + try { + // Different api for test and latestDepTest. + values.to(Serdes.String(), Serdes.String(), STREAM_PROCESSED) + streams = new KafkaStreams(builder, config) + } catch (MissingMethodException e) { + def producer = Class.forName("org.apache.kafka.streams.kstream.Produced") + .with(Serdes.String(), Serdes.String()) + values.to(STREAM_PROCESSED, producer) + streams = new KafkaStreams(builder.build(), config) + } streams.start() // CONFIGURE PRODUCER @@ -94,101 +115,89 @@ class KafkaStreamsTest extends AgentTestRunner { received.value() == greeting.toLowerCase() received.key() == null - TEST_WRITER.waitForTraces(3) - TEST_WRITER.size() == 3 + assertTraces(3) { + trace(0, 1) { + // PRODUCER span 0 + span(0) { + serviceName "kafka" + operationName "kafka.produce" + resourceName "Produce Topic $STREAM_PENDING" + spanType "queue" + errored false + parent() + tags { + "component" "java-kafka" + "span.kind" "producer" + "span.type" "queue" + defaultTags() + } + } + } + trace(1, 2) { - def t1 = TEST_WRITER.get(0) - t1.size() == 1 - def t2 = TEST_WRITER.get(1) - t2.size() == 2 - def t3 = TEST_WRITER.get(2) - t3.size() == 1 + // STREAMING span 0 + span(0) { + serviceName "kafka" + operationName "kafka.produce" + resourceName "Produce Topic $STREAM_PROCESSED" + spanType "queue" + errored false + childOf span(1) - and: // PRODUCER span 0 - def t1span1 = t1[0] + tags { + "component" "java-kafka" + "span.kind" "producer" + "span.type" "queue" + defaultTags() + } + } - t1span1.context().operationName == "kafka.produce" - t1span1.serviceName == "kafka" - t1span1.resourceName == "Produce Topic $STREAM_PENDING" - t1span1.type == "queue" - !t1span1.context().getErrorFlag() - t1span1.context().parentId == "0" + // STREAMING span 1 + span(1) { + serviceName "kafka" + operationName "kafka.consume" + resourceName "Consume Topic $STREAM_PENDING" + spanType "queue" + errored false + childOf TEST_WRITER[0][0] - def t1tags1 = t1span1.context().tags - t1tags1["component"] == "java-kafka" - t1tags1["span.kind"] == "producer" - t1tags1["span.type"] == "queue" - t1tags1["thread.name"] != null - t1tags1["thread.id"] != null - t1tags1[Config.RUNTIME_ID_TAG] == Config.get().runtimeId - t1tags1.size() == 6 - - and: // STREAMING span 0 - def t2span1 = t2[0] - - t2span1.context().operationName == "kafka.produce" - t2span1.serviceName == "kafka" - t2span1.resourceName == "Produce Topic $STREAM_PROCESSED" - t2span1.type == "queue" - !t2span1.context().getErrorFlag() - - def t2tags1 = t2span1.context().tags - t2tags1["component"] == "java-kafka" - t2tags1["span.kind"] == "producer" - t2tags1["span.type"] == "queue" - t2tags1["thread.name"] != null - t2tags1["thread.id"] != null - t2tags1.size() == 5 - - and: // STREAMING span 1 - def t2span2 = t2[1] - t2span1.context().parentId == t2span2.context().spanId - - t2span2.context().operationName == "kafka.consume" - t2span2.serviceName == "kafka" - t2span2.resourceName == "Consume Topic $STREAM_PENDING" - t2span2.type == "queue" - !t2span2.context().getErrorFlag() - t2span2.context().parentId == t1span1.context().spanId - - def t2tags2 = t2span2.context().tags - t2tags2["component"] == "java-kafka" - t2tags2["span.kind"] == "consumer" - t2tags2["span.type"] == "queue" - t2tags2["partition"] >= 0 - t2tags2["offset"] == 0 - t2tags2["thread.name"] != null - t2tags2["thread.id"] != null - t2tags2[Config.RUNTIME_ID_TAG] == Config.get().runtimeId - t2tags2["asdf"] == "testing" - t2tags2.size() == 9 - - and: // CONSUMER span 0 - def t3span1 = t3[0] - - t3span1.context().operationName == "kafka.consume" - t3span1.serviceName == "kafka" - t3span1.resourceName == "Consume Topic $STREAM_PROCESSED" - t3span1.type == "queue" - !t3span1.context().getErrorFlag() - t3span1.context().parentId == t2span1.context().spanId - - def t3tags1 = t3span1.context().tags - t3tags1["component"] == "java-kafka" - t3tags1["span.kind"] == "consumer" - t3tags1["span.type"] == "queue" - t3tags1["partition"] >= 0 - t3tags1["offset"] == 0 - t3tags1["thread.name"] != null - t3tags1["thread.id"] != null - t3tags1[Config.RUNTIME_ID_TAG] == Config.get().runtimeId - t3tags1["testing"] == 123 - t3tags1.size() == 9 + tags { + "component" "java-kafka" + "span.kind" "consumer" + "span.type" "queue" + "partition" { it >= 0 } + "offset" 0 + defaultTags(true) + "asdf" "testing" + } + } + } + trace(2, 1) { + // CONSUMER span 0 + span(0) { + serviceName "kafka" + operationName "kafka.consume" + resourceName "Consume Topic $STREAM_PROCESSED" + spanType "queue" + errored false + childOf TEST_WRITER[1][0] + tags { + "component" "java-kafka" + "span.kind" "consumer" + "span.type" "queue" + "partition" { it >= 0 } + "offset" 0 + defaultTags(true) + "testing" 123 + } + } + } + } def headers = received.headers() headers.iterator().hasNext() - new String(headers.headers("x-datadog-trace-id").iterator().next().value()) == "$t2span1.traceId" - new String(headers.headers("x-datadog-parent-id").iterator().next().value()) == "$t2span1.spanId" + new String(headers.headers("x-datadog-trace-id").iterator().next().value()) == "${TEST_WRITER[1][0].traceId}" + new String(headers.headers("x-datadog-parent-id").iterator().next().value()) == "${TEST_WRITER[1][0].spanId}" cleanup: diff --git a/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle b/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle index dccc909d2d..4c366a4f71 100644 --- a/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle +++ b/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle @@ -61,10 +61,7 @@ dependencies { testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6' testCompile group: 'io.lettuce', name: 'lettuce-core', version: '5.0.0.RELEASE' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'io.lettuce', name: 'lettuce-core', version: '+' - } + // FIXME: Tests need to be updated to support 5.1+ + latestDepTestCompile group: 'io.lettuce', name: 'lettuce-core', version: '5.0.+' } diff --git a/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle b/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle index eaaaf956c7..5fbfe85ad0 100644 --- a/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle +++ b/dd-java-agent/instrumentation/mongo-3.1/mongo-3.1.gradle @@ -29,10 +29,5 @@ dependencies { testCompile project(':dd-trace-ot') testCompile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.1.0' -} - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'org.mongodb', name: 'mongo-java-driver', version: '+' - } + latestDepTestCompile group: 'org.mongodb', name: 'mongo-java-driver', version: '+' } diff --git a/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle b/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle index 1855c509df..447724743b 100644 --- a/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle +++ b/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle @@ -44,6 +44,9 @@ dependencies { testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.0.0.Final' testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.0' + + latestDepTestCompile group: 'io.netty', name: 'netty-codec-http', version: '4.0.56.Final' + latestDepTestCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.+' } // We need to force the dependency to the earliest supported version because other libraries declare newer versions. @@ -57,11 +60,3 @@ configurations.testCompile { } } } - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'io.netty', name: 'netty-codec-http', version: '4.0.56.Final' - force group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.+' - } -} - diff --git a/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/Netty40ClientTest.groovy b/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/Netty40ClientTest.groovy index 1ff103705b..3640911e7d 100644 --- a/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/Netty40ClientTest.groovy +++ b/dd-java-agent/instrumentation/netty-4.0/src/test/groovy/Netty40ClientTest.groovy @@ -2,6 +2,7 @@ import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.TestUtils import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDTags +import io.netty.channel.AbstractChannel import io.opentracing.tag.Tags import org.asynchttpclient.AsyncHttpClient import org.asynchttpclient.DefaultAsyncHttpClientConfig @@ -105,7 +106,11 @@ class Netty40ClientTest extends AgentTestRunner { errored true tags { "$Tags.COMPONENT.key" "netty" - errorTags ConnectException, "Connection refused: localhost/127.0.0.1:$invalidPort" + try { + errorTags ConnectException, "Connection refused: localhost/127.0.0.1:$invalidPort" + } catch (AssertionError e) { + errorTags AbstractChannel.AnnotatedConnectException, "Connection refused: localhost/127.0.0.1:$invalidPort" + } defaultTags() } } diff --git a/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle b/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle index d7dcaaccf8..f490765d88 100644 --- a/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle +++ b/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle @@ -42,6 +42,10 @@ dependencies { testCompile project(':dd-java-agent:instrumentation:java-concurrent') testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.1.0.Final' testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.1.0' + + latestDepTestCompile group: 'io.netty', name: 'netty-codec-http', version: '(,5.0)' + // latest async-http-client incompatable with 5.0+ netty + latestDepTestCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '+' } // We need to force the dependency to the earliest supported version because other libraries declare newer versions. @@ -55,11 +59,3 @@ configurations.testCompile { } } } - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'io.netty', name: 'netty-codec-http', version: '+' - force group: 'org.asynchttpclient', name: 'async-http-client', version: '+' - } -} - diff --git a/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle b/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle index 1ecb7ea88d..50a5192558 100644 --- a/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle +++ b/dd-java-agent/instrumentation/okhttp-3/okhttp-3.gradle @@ -27,12 +27,10 @@ dependencies { annotationProcessor deps.autoservice implementation deps.autoservice - testCompile project(':dd-java-agent:testing') - testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.0' -} - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'com.squareup.okhttp3', name: 'okhttp', version: '+' + testCompile(project(':dd-java-agent:testing')) { + exclude module: 'okhttp' } + testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.0' + + latestDepTestCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '[3.11.0,)' } diff --git a/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle b/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle index 54ab260896..8552623785 100644 --- a/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle +++ b/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle @@ -66,10 +66,5 @@ dependencies { testCompile project(':dd-java-agent:testing') testCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.4.0' -} - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'io.ratpack', name: 'ratpack-groovy-test', version: '+' - } + latestDepTestCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '+' } diff --git a/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle b/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle index 48665c934e..16f3f0089d 100644 --- a/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle +++ b/dd-java-agent/instrumentation/servlet-3/servlet-3.gradle @@ -41,13 +41,9 @@ dependencies { testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.2.0.v20160908' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.0.41' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '8.0.41' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'org.eclipse.jetty', name: 'jetty-server', version: '+' - force group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+' - force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+' - force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+' - } + latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '+' + latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+' + latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+' + latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+' } diff --git a/dd-java-agent/instrumentation/servlet-3/src/test/groovy/JettyServlet3Test.groovy b/dd-java-agent/instrumentation/servlet-3/src/test/groovy/JettyServlet3Test.groovy index b37fd68c38..6b8a39674a 100644 --- a/dd-java-agent/instrumentation/servlet-3/src/test/groovy/JettyServlet3Test.groovy +++ b/dd-java-agent/instrumentation/servlet-3/src/test/groovy/JettyServlet3Test.groovy @@ -7,7 +7,6 @@ import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response -import org.eclipse.jetty.http.HttpHeaders import org.eclipse.jetty.security.ConstraintMapping import org.eclipse.jetty.security.ConstraintSecurityHandler import org.eclipse.jetty.security.HashLoginService @@ -16,6 +15,7 @@ import org.eclipse.jetty.security.authentication.BasicAuthenticator import org.eclipse.jetty.server.Server import org.eclipse.jetty.servlet.ServletContextHandler import org.eclipse.jetty.util.security.Constraint +import spock.lang.Shared class JettyServlet3Test extends AgentTestRunner { @@ -29,11 +29,14 @@ class JettyServlet3Test extends AgentTestRunner { }) .build() + @Shared int port + @Shared private Server jettyServer + @Shared private ServletContextHandler servletContext - def setup() { + def setupSpec() { port = TestUtils.randomOpenPort() jettyServer = new Server(port) servletContext = new ServletContextHandler() @@ -53,7 +56,7 @@ class JettyServlet3Test extends AgentTestRunner { "Jetty server: http://localhost:" + port + "/") } - def cleanup() { + def cleanupSpec() { jettyServer.stop() jettyServer.destroy() } @@ -68,7 +71,7 @@ class JettyServlet3Test extends AgentTestRunner { requestBuilder.header("x-datadog-parent-id", "456") } if (auth) { - requestBuilder.header(HttpHeaders.AUTHORIZATION, Credentials.basic("user", "password")) + requestBuilder.header("Authorization", Credentials.basic("user", "password")) } def response = client.newCall(requestBuilder.build()).execute() diff --git a/dd-java-agent/instrumentation/servlet-3/src/test/groovy/TomcatServlet3Test.groovy b/dd-java-agent/instrumentation/servlet-3/src/test/groovy/TomcatServlet3Test.groovy index a02c8816ef..d823067a11 100644 --- a/dd-java-agent/instrumentation/servlet-3/src/test/groovy/TomcatServlet3Test.groovy +++ b/dd-java-agent/instrumentation/servlet-3/src/test/groovy/TomcatServlet3Test.groovy @@ -10,19 +10,24 @@ import org.apache.catalina.core.ApplicationFilterChain import org.apache.catalina.startup.Tomcat import org.apache.tomcat.JarScanFilter import org.apache.tomcat.JarScanType +import spock.lang.Shared class TomcatServlet3Test extends AgentTestRunner { OkHttpClient client = OkHttpUtils.client() + @Shared int port + @Shared Tomcat tomcatServer + @Shared Context appContext - def setup() { + def setupSpec() { port = TestUtils.randomOpenPort() tomcatServer = new Tomcat() tomcatServer.setPort(port) + tomcatServer.getConnector() def baseDir = Files.createTempDir() baseDir.deleteOnExit() @@ -52,7 +57,7 @@ class TomcatServlet3Test extends AgentTestRunner { "Tomcat server: http://" + tomcatServer.getHost().getName() + ":" + port + "/") } - def cleanup() { + def cleanupSpec() { tomcatServer.stop() tomcatServer.destroy() } diff --git a/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle b/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle index 66d5b426eb..a34b66994d 100644 --- a/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle +++ b/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle @@ -54,9 +54,3 @@ dependencies { latestDepTestCompile group: 'com.sparkjava', name: 'spark-core', version: '+' } - -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'com.sparkjava', name: 'spark-core', version: '+' - } -} diff --git a/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle b/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle index a3f5e5c497..39f85326b9 100644 --- a/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle +++ b/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle @@ -74,12 +74,9 @@ dependencies { testCompile group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4' testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.0.RELEASE' testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '2.0.0.RELEASE' -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '+' - force group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '+' - force group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '+' - } + // FIXME: Tests need to be updated to support 2.1+ + latestDepTestCompile group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.0.+' + latestDepTestCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.+' + latestDepTestCompile group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '2.0.+' } diff --git a/dd-java-agent/instrumentation/spring-webflux/src/test/groovy/SpringWebfluxTest.groovy b/dd-java-agent/instrumentation/spring-webflux/src/test/groovy/SpringWebfluxTest.groovy index d902b430c8..c7d92578ce 100644 --- a/dd-java-agent/instrumentation/spring-webflux/src/test/groovy/SpringWebfluxTest.groovy +++ b/dd-java-agent/instrumentation/spring-webflux/src/test/groovy/SpringWebfluxTest.groovy @@ -13,7 +13,6 @@ import okhttp3.RequestBody import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.web.server.LocalServerPort import org.springframework.web.server.ResponseStatusException -import spock.lang.Unroll @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringWebFluxTestApplication) class SpringWebfluxTest extends AgentTestRunner { @@ -27,7 +26,6 @@ class SpringWebfluxTest extends AgentTestRunner { OkHttpClient client = OkHttpUtils.client() - @Unroll def "Basic GET test #testName to functional API"() { setup: String url = "http://localhost:$port/greet$urlSuffix" @@ -82,7 +80,6 @@ class SpringWebfluxTest extends AgentTestRunner { "with two parameters" | "/World/Test1" | "/{name}/{word}" | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " World Test1" } - @Unroll def "Basic GET test #testName to annotations API"() { setup: String url = "http://localhost:$port/foo$urlSuffix" @@ -417,7 +414,6 @@ class SpringWebfluxTest extends AgentTestRunner { } } - @Unroll def "Flux x#count GET test with functional API endpoint"() { setup: String expectedResponseBodyStr = FooModel.createXFooModelsStringFromArray(FooModel.createXFooModels(count)) @@ -471,7 +467,6 @@ class SpringWebfluxTest extends AgentTestRunner { count << [0, 1, 10] } - @Unroll def "Flux x#count GET test with spring annotations endpoint"() { setup: String expectedResponseBodyStr = FooModel.createXFooModelsStringFromArray(FooModel.createXFooModels(count)) diff --git a/dd-java-agent/instrumentation/spymemcached-2.12/spymemcached-2.12.gradle b/dd-java-agent/instrumentation/spymemcached-2.12/spymemcached-2.12.gradle index a7d3da67d6..fcb00654f2 100644 --- a/dd-java-agent/instrumentation/spymemcached-2.12/spymemcached-2.12.gradle +++ b/dd-java-agent/instrumentation/spymemcached-2.12/spymemcached-2.12.gradle @@ -33,11 +33,6 @@ dependencies { testCompile group: 'net.spy', name: 'spymemcached', version: '2.12.0' testCompile deps.testcontainers -} -configurations.latestDepTestCompile { - resolutionStrategy { - force group: 'net.spy', name: 'spymemcached', version: '+' - } + latestDepTestCompile group: 'net.spy', name: 'spymemcached', version: '+' } - diff --git a/dd-java-agent/instrumentation/vertx/vertx.gradle b/dd-java-agent/instrumentation/vertx/vertx.gradle index d842124209..34fe549bfe 100644 --- a/dd-java-agent/instrumentation/vertx/vertx.gradle +++ b/dd-java-agent/instrumentation/vertx/vertx.gradle @@ -20,13 +20,13 @@ muzzle { } } -apply plugin: 'org.unbroken-dome.test-sets' - -testSets { - latestDepTest { - dirName = 'test' - } -} +//apply plugin: 'org.unbroken-dome.test-sets' +// +//testSets { +// latestDepTest { +// dirName = 'test' +// } +//} sourceCompatibility = 1.8 targetCompatibility = 1.8 diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.groovy index 415e0e73ea..81a9ca13a3 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/OkHttpUtils.groovy @@ -7,10 +7,11 @@ import java.util.concurrent.TimeUnit class OkHttpUtils { static clientBuilder() { + def unit = TimeUnit.MINUTES new OkHttpClient.Builder() - .connectTimeout(1, TimeUnit.MINUTES) - .writeTimeout(1, TimeUnit.MINUTES) - .readTimeout(1, TimeUnit.MINUTES) + .connectTimeout(1, unit) + .writeTimeout(1, unit) + .readTimeout(1, unit) } static client() { diff --git a/gradle/java.gradle b/gradle/java.gradle index 66ab701016..c9ab8a867f 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -118,6 +118,18 @@ artifacts { archives javaDocJar } +project.afterEvaluate { + if (project.plugins.hasPlugin('org.unbroken-dome.test-sets') && configurations.hasProperty("latestDepTestRuntime")) { + tasks.withType(Test) { + doFirst{ + def testArtifacts = configurations.testRuntime.resolvedConfiguration.resolvedArtifacts + def latestTestArtifacts = configurations.latestDepTestRuntime.resolvedConfiguration.resolvedArtifacts + assert testArtifacts != latestTestArtifacts : "latestDepTest dependencies are identical to test" + } + } + } +} + if (project.plugins.hasPlugin('com.github.johnrengelman.shadow')) { // Remove the no-deps jar from the archives to prevent publication configurations.archives.with {