From 035bfdf7812cde18ed66eb73c63b9f031edf0c78 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Thu, 16 Jan 2025 10:45:44 +0100 Subject: [PATCH 1/3] Test http server requests in parallel --- .../groovy/datadog/trace/agent/test/base/HttpServerTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index 54cc2e1a0d0..733886f00f1 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -529,7 +529,7 @@ abstract class HttpServerTest extends WithHttpServer { def "test success with #count requests"() { setup: def request = request(SUCCESS, method, body).build() - List responses = (1..count).collect { + List responses = (1..count).parallelStream().collect { return client.newCall(request).execute() } if (isDataStreamsEnabled()) { From ac67ac11e9376c8fd3df0e7cb873bccae0538fe8 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Thu, 16 Jan 2025 13:44:55 +0100 Subject: [PATCH 2/3] use executor service --- .../trace/agent/test/base/HttpServerTest.groovy | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index 733886f00f1..56482d8414f 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -47,6 +47,8 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import javax.annotation.Nonnull +import java.util.concurrent.ExecutorCompletionService +import java.util.concurrent.Executors import java.util.function.BiFunction import java.util.function.Function import java.util.function.Supplier @@ -529,9 +531,15 @@ abstract class HttpServerTest extends WithHttpServer { def "test success with #count requests"() { setup: def request = request(SUCCESS, method, body).build() - List responses = (1..count).parallelStream().collect { - return client.newCall(request).execute() + def executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) + def completionService = new ExecutorCompletionService(executor) + (1..count).each { + completionService.submit { + client.newCall(request).execute() + } } + def responses = (1..count).collect {completionService.take().get()} + if (isDataStreamsEnabled()) { TEST_DATA_STREAMS_WRITER.waitForGroups(1) } From adf899d34f15d7d61266d13ae95b81e75443b099 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Thu, 16 Jan 2025 15:44:21 +0100 Subject: [PATCH 3/3] exclude some parallel --- .../src/test/groovy/JettyServlet3Test.groovy | 15 +++++++++++++ .../agent/test/base/HttpServerTest.groovy | 21 +++++++++++++------ 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/JettyServlet3Test.groovy b/dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/JettyServlet3Test.groovy index f38ef815e7f..61a255e1f0d 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/JettyServlet3Test.groovy +++ b/dd-java-agent/instrumentation/servlet/request-3/src/test/groovy/JettyServlet3Test.groovy @@ -438,6 +438,11 @@ class JettyServlet3TestSyncDispatchOnAsyncTimeout extends JettyServlet3Test { true } + @Override + boolean testParallelRequest() { + false + } + @Override void handlerSpan(TraceAssert trace, ServerEndpoint endpoint = SUCCESS) { dispatchSpan(trace, endpoint) @@ -474,6 +479,11 @@ class JettyServlet3TestAsyncDispatchOnAsyncTimeout extends JettyServlet3Test { true } + @Override + boolean testParallelRequest() { + false + } + @Override void handlerSpan(TraceAssert trace, ServerEndpoint endpoint = SUCCESS) { dispatchSpan(trace, endpoint) @@ -532,6 +542,11 @@ class JettyServlet3ServeFromAsyncTimeout extends JettyServlet3Test { boolean testException() { false } + + @Override + boolean testParallelRequest() { + false + } } class IastJettyServlet3ForkedTest extends JettyServlet3TestSync { diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy index 56482d8414f..0a917bbd469 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy @@ -384,6 +384,10 @@ abstract class HttpServerTest extends WithHttpServer { false // not all servers support session ids } + boolean testParallelRequest() { + true + } + @Override int version() { return 0 @@ -530,15 +534,20 @@ abstract class HttpServerTest extends WithHttpServer { @Flaky(value = "https://github.com/DataDog/dd-trace-java/issues/4690", suites = ["MuleHttpServerForkedTest"]) def "test success with #count requests"() { setup: + def responses def request = request(SUCCESS, method, body).build() - def executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) - def completionService = new ExecutorCompletionService(executor) - (1..count).each { - completionService.submit { - client.newCall(request).execute() + if (testParallelRequest()) { + def executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()) + def completionService = new ExecutorCompletionService(executor) + (1..count).each { + completionService.submit { + client.newCall(request).execute() + } } + responses = (1..count).collect { completionService.take().get() } + } else { + responses = (1..count).collect {client.newCall(request).execute()} } - def responses = (1..count).collect {completionService.take().get()} if (isDataStreamsEnabled()) { TEST_DATA_STREAMS_WRITER.waitForGroups(1)