diff --git a/instrumentation/akka-http-10.0/javaagent/src/test/groovy/AkkaHttpServerInstrumentationTest.groovy b/instrumentation/akka-http-10.0/javaagent/src/test/groovy/AkkaHttpServerInstrumentationTest.groovy index 044c43c906bd..b5f6afd3289b 100644 --- a/instrumentation/akka-http-10.0/javaagent/src/test/groovy/AkkaHttpServerInstrumentationTest.groovy +++ b/instrumentation/akka-http-10.0/javaagent/src/test/groovy/AkkaHttpServerInstrumentationTest.groovy @@ -24,6 +24,11 @@ abstract class AkkaHttpServerInstrumentationTest extends HttpServerTest return "akka.request" } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean testConcurrency() { return true diff --git a/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy b/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy index a7aa36d17301..ca9dc0cb7062 100644 --- a/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy +++ b/instrumentation/armeria-1.3/library/src/test/groovy/io/opentelemetry/instrumentation/armeria/v1_3/ArmeriaHttpServerTest.groovy @@ -11,6 +11,9 @@ import io.opentelemetry.instrumentation.test.LibraryTestTrait class ArmeriaHttpServerTest extends AbstractArmeriaHttpServerTest implements LibraryTestTrait { @Override ServerBuilder configureServer(ServerBuilder sb) { - return sb.decorator(ArmeriaTracing.create(getOpenTelemetry()).newServiceDecorator()) + return sb.decorator(ArmeriaTracing.newBuilder(getOpenTelemetry()) + .captureHttpServerHeaders(capturedHttpHeadersForTesting()) + .build() + .newServiceDecorator()) } } diff --git a/instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaHttpServerTest.groovy b/instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaHttpServerTest.groovy index ce921dbbd8ea..932c0276df6f 100644 --- a/instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaHttpServerTest.groovy +++ b/instrumentation/armeria-1.3/testing/src/main/groovy/io/opentelemetry/instrumentation/armeria/v1_3/AbstractArmeriaHttpServerTest.groovy @@ -5,6 +5,7 @@ package io.opentelemetry.instrumentation.armeria.v1_3 +import com.linecorp.armeria.common.HttpData import com.linecorp.armeria.common.HttpHeaderNames import com.linecorp.armeria.common.HttpRequest import com.linecorp.armeria.common.HttpResponse @@ -24,6 +25,7 @@ import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import java.util.function.Function +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM @@ -95,6 +97,16 @@ abstract class AbstractArmeriaHttpServerTest extends HttpServerTest { } } + sb.service("/captureHeaders") { ctx, req -> + controller(CAPTURE_HEADERS) { + HttpResponse.of( + ResponseHeaders.of(HttpStatus.valueOf(CAPTURE_HEADERS.status), + "X-Test-Response", req.headers().get("X-Test-Request"), + HttpHeaderNames.CONTENT_TYPE, MediaType.PLAIN_TEXT_UTF_8), + HttpData.ofUtf8(CAPTURE_HEADERS.body)) + } + } + // Make sure user decorators see spans. sb.decorator(new DecoratingHttpServiceFunction() { @Override diff --git a/instrumentation/dropwizard-testing/src/test/groovy/DropwizardAsyncTest.groovy b/instrumentation/dropwizard-testing/src/test/groovy/DropwizardAsyncTest.groovy index 19a0b4c61fe2..15e819cb45c6 100644 --- a/instrumentation/dropwizard-testing/src/test/groovy/DropwizardAsyncTest.groovy +++ b/instrumentation/dropwizard-testing/src/test/groovy/DropwizardAsyncTest.groovy @@ -9,6 +9,7 @@ import io.dropwizard.setup.Bootstrap import io.dropwizard.setup.Environment import javax.ws.rs.GET +import javax.ws.rs.HeaderParam import javax.ws.rs.Path import javax.ws.rs.PathParam import javax.ws.rs.QueryParam @@ -17,6 +18,7 @@ import javax.ws.rs.container.Suspended import javax.ws.rs.core.Response import java.util.concurrent.Executors +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM @@ -110,5 +112,17 @@ class DropwizardAsyncTest extends DropwizardTest { } } } + + @GET + @Path("captureHeaders") + void capture_headers(@HeaderParam("X-Test-Request") String header, + @Suspended final AsyncResponse asyncResponse) { + controller(CAPTURE_HEADERS) { + asyncResponse.resume(Response.status(CAPTURE_HEADERS.status) + .header("X-Test-Response", header) + .entity(CAPTURE_HEADERS.body) + .build()) + } + } } } diff --git a/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy b/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy index 3d3306ccb753..65f72bb08a19 100644 --- a/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy +++ b/instrumentation/dropwizard-testing/src/test/groovy/DropwizardTest.groovy @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.trace.data.SpanData import io.opentelemetry.semconv.trace.attributes.SemanticAttributes import javax.ws.rs.GET +import javax.ws.rs.HeaderParam import javax.ws.rs.Path import javax.ws.rs.PathParam import javax.ws.rs.QueryParam @@ -25,6 +26,7 @@ import javax.ws.rs.core.Response import static io.opentelemetry.api.trace.SpanKind.INTERNAL import static io.opentelemetry.api.trace.SpanKind.SERVER +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND @@ -121,6 +123,10 @@ class DropwizardTest extends HttpServerTest implements Ag "${SemanticAttributes.HTTP_FLAVOR.key}" "1.1" "${SemanticAttributes.HTTP_USER_AGENT.key}" TEST_USER_AGENT "${SemanticAttributes.HTTP_CLIENT_IP.key}" TEST_CLIENT_IP + if (endpoint == ServerEndpoint.CAPTURE_HEADERS) { + "http.request.header.x_test_request" { it == ["test"] } + "http.response.header.x_test_response" { it == ["test"] } + } } } } @@ -194,6 +200,17 @@ class DropwizardTest extends HttpServerTest implements Ag Response.status(PATH_PARAM.status).entity(param.toString()).build() } } + + @GET + @Path("captureHeaders") + Response capture_headers(@HeaderParam("X-Test-Request") String header) { + controller(CAPTURE_HEADERS) { + Response.status(CAPTURE_HEADERS.status) + .header("X-Test-Response", header) + .entity(CAPTURE_HEADERS.body) + .build() + } + } } @Path("/") diff --git a/instrumentation/finatra-2.9/javaagent/src/latestDepTest/groovy/FinatraServerLatestTest.groovy b/instrumentation/finatra-2.9/javaagent/src/latestDepTest/groovy/FinatraServerLatestTest.groovy index 9898f0ea2684..a7bb9690fe5d 100644 --- a/instrumentation/finatra-2.9/javaagent/src/latestDepTest/groovy/FinatraServerLatestTest.groovy +++ b/instrumentation/finatra-2.9/javaagent/src/latestDepTest/groovy/FinatraServerLatestTest.groovy @@ -103,4 +103,8 @@ class FinatraServerLatestTest extends HttpServerTest implements Agen SemanticAttributes.HTTP_URL ] } + + boolean testCapturedHttpHeaders() { + false + } } diff --git a/instrumentation/finatra-2.9/javaagent/src/test/groovy/FinatraServerTest.groovy b/instrumentation/finatra-2.9/javaagent/src/test/groovy/FinatraServerTest.groovy index 8f1344afe0f3..e4a4e0232a9a 100644 --- a/instrumentation/finatra-2.9/javaagent/src/test/groovy/FinatraServerTest.groovy +++ b/instrumentation/finatra-2.9/javaagent/src/test/groovy/FinatraServerTest.groovy @@ -87,4 +87,8 @@ class FinatraServerTest extends HttpServerTest implements AgentTestT SemanticAttributes.HTTP_URL ] } + + boolean testCapturedHttpHeaders() { + false + } } diff --git a/instrumentation/grails-3.0/javaagent/src/test/groovy/test/GrailsTest.groovy b/instrumentation/grails-3.0/javaagent/src/test/groovy/test/GrailsTest.groovy index da357a2598a5..b895cce23333 100644 --- a/instrumentation/grails-3.0/javaagent/src/test/groovy/test/GrailsTest.groovy +++ b/instrumentation/grails-3.0/javaagent/src/test/groovy/test/GrailsTest.groovy @@ -18,6 +18,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties import org.springframework.context.ConfigurableApplicationContext import static io.opentelemetry.api.trace.SpanKind.INTERNAL +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND @@ -141,6 +142,8 @@ class GrailsTest extends HttpServerTest implemen name "TestController.query" } else if (endpoint == PATH_PARAM) { name "TestController.path" + } else if (endpoint == CAPTURE_HEADERS) { + name "TestController.captureHeaders" } else if (endpoint == NOT_FOUND) { name "ResourceHttpRequestHandler.handleRequest" } else { diff --git a/instrumentation/grails-3.0/javaagent/src/test/groovy/test/TestController.groovy b/instrumentation/grails-3.0/javaagent/src/test/groovy/test/TestController.groovy index afae55e07996..16693260ce89 100644 --- a/instrumentation/grails-3.0/javaagent/src/test/groovy/test/TestController.groovy +++ b/instrumentation/grails-3.0/javaagent/src/test/groovy/test/TestController.groovy @@ -9,6 +9,7 @@ import grails.artefact.Controller import grails.web.Action import io.opentelemetry.instrumentation.test.base.HttpServerTest +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM @@ -64,4 +65,12 @@ class TestController implements Controller { render params.id } } + + @Action + def captureHeaders() { + HttpServerTest.controller(CAPTURE_HEADERS) { + response.setHeader("X-Test-Response", request.getHeader("X-Test-Request")) + render CAPTURE_HEADERS.body + } + } } diff --git a/instrumentation/grails-3.0/javaagent/src/test/groovy/test/UrlMappings.groovy b/instrumentation/grails-3.0/javaagent/src/test/groovy/test/UrlMappings.groovy index 7e79a7d455a3..0f99d34a5220 100644 --- a/instrumentation/grails-3.0/javaagent/src/test/groovy/test/UrlMappings.groovy +++ b/instrumentation/grails-3.0/javaagent/src/test/groovy/test/UrlMappings.groovy @@ -14,6 +14,7 @@ class UrlMappings { "/error-status"(controller: 'test', action: 'error') "/exception"(controller: 'test', action: 'exception') "/path/$id/param"(controller: 'test', action: 'path') + "/captureHeaders"(controller: 'test', action: 'captureHeaders') "500"(controller: 'error') "404"(controller: 'error', action: 'notFound') diff --git a/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy b/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy index bca550d013e5..dddffb261e38 100644 --- a/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy +++ b/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyFilterchainServerTest.groovy @@ -65,6 +65,11 @@ class GrizzlyFilterchainServerTest extends HttpServerTest implements false } + @Override + boolean testCapturedHttpHeaders() { + false + } + void setUpTransport(FilterChain filterChain) { TCPNIOTransportBuilder transportBuilder = TCPNIOTransportBuilder.newInstance() .setOptimizedForMultiplexing(true) diff --git a/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy b/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy index 75e45b38bfbc..0446ad6bbdf0 100644 --- a/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy +++ b/instrumentation/grizzly-2.0/javaagent/src/test/groovy/GrizzlyTest.groovy @@ -46,6 +46,11 @@ class GrizzlyTest extends HttpServerTest implements AgentTestTrait { server.stop() } + @Override + boolean testCapturedHttpHeaders() { + false + } + static class SimpleExceptionMapper implements ExceptionMapper { @Override diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/JaxRsHttpServerTest.groovy b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/JaxRsHttpServerTest.groovy index 316bf2f5ced5..f348e43186e5 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/JaxRsHttpServerTest.groovy +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/JaxRsHttpServerTest.groovy @@ -281,6 +281,10 @@ abstract class JaxRsHttpServerTest extends HttpServerTest implements Agent "${SemanticAttributes.HTTP_FLAVOR.key}" "1.1" "${SemanticAttributes.HTTP_USER_AGENT.key}" TEST_USER_AGENT "${SemanticAttributes.HTTP_CLIENT_IP.key}" TEST_CLIENT_IP + if (fullUrl.getPath().endsWith(ServerEndpoint.CAPTURE_HEADERS.getPath())) { + "http.request.header.x_test_request" { it == ["test"] } + "http.response.header.x_test_response" { it == ["test"] } + } } } } diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/test/JaxRsTestResource.groovy b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/test/JaxRsTestResource.groovy index 905a4ca12533..1c60b7ab2481 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/test/JaxRsTestResource.groovy +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-testing/src/main/groovy/test/JaxRsTestResource.groovy @@ -9,6 +9,7 @@ import io.opentelemetry.instrumentation.test.base.HttpServerTest import javax.ws.rs.ApplicationPath import javax.ws.rs.GET +import javax.ws.rs.HeaderParam import javax.ws.rs.Path import javax.ws.rs.PathParam import javax.ws.rs.QueryParam @@ -23,6 +24,7 @@ import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletionStage import java.util.concurrent.CyclicBarrier +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -86,6 +88,17 @@ class JaxRsTestResource { } } + @GET + @Path("captureHeaders") + Response capture_headers(@HeaderParam("X-Test-Request") String header) { + HttpServerTest.controller(CAPTURE_HEADERS) { + Response.status(CAPTURE_HEADERS.status) + .header("X-Test-Response", header) + .entity(CAPTURE_HEADERS.body) + .build() + } + } + @Path("/child") @GET void indexed_child(@Context UriInfo uriInfo, @Suspended AsyncResponse response) { diff --git a/instrumentation/jetty/jetty-11.0/javaagent/src/test/groovy/JettyHandlerTest.groovy b/instrumentation/jetty/jetty-11.0/javaagent/src/test/groovy/JettyHandlerTest.groovy index 8d965565010d..42fefd6d5491 100644 --- a/instrumentation/jetty/jetty-11.0/javaagent/src/test/groovy/JettyHandlerTest.groovy +++ b/instrumentation/jetty/jetty-11.0/javaagent/src/test/groovy/JettyHandlerTest.groovy @@ -17,6 +17,7 @@ import org.eclipse.jetty.server.handler.AbstractHandler import org.eclipse.jetty.server.handler.ErrorHandler import spock.lang.Shared +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND @@ -95,6 +96,11 @@ class JettyHandlerTest extends HttpServerTest implements AgentTestTrait case ERROR: response.sendError(endpoint.status, endpoint.body) break + case CAPTURE_HEADERS: + response.setHeader("X-Test-Response", request.getHeader("X-Test-Request")) + response.status = endpoint.status + response.writer.print(endpoint.body) + break case EXCEPTION: throw new Exception(endpoint.body) default: diff --git a/instrumentation/jetty/jetty-8.0/javaagent/src/test/groovy/JettyHandlerTest.groovy b/instrumentation/jetty/jetty-8.0/javaagent/src/test/groovy/JettyHandlerTest.groovy index 1861f70b2701..9b483f5d9838 100644 --- a/instrumentation/jetty/jetty-8.0/javaagent/src/test/groovy/JettyHandlerTest.groovy +++ b/instrumentation/jetty/jetty-8.0/javaagent/src/test/groovy/JettyHandlerTest.groovy @@ -18,6 +18,7 @@ import javax.servlet.ServletException import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.NOT_FOUND @@ -96,6 +97,11 @@ class JettyHandlerTest extends HttpServerTest implements AgentTestTrait case ERROR: response.sendError(endpoint.status, endpoint.body) break + case CAPTURE_HEADERS: + response.setHeader("X-Test-Response", request.getHeader("X-Test-Request")) + response.status = endpoint.status + response.writer.print(endpoint.body) + break case EXCEPTION: throw new Exception(endpoint.body) default: diff --git a/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy b/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy index 3c6844ca5226..ca89095d0126 100644 --- a/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy +++ b/instrumentation/netty/netty-3.8/javaagent/src/test/groovy/Netty38ServerTest.groovy @@ -158,6 +158,11 @@ class Netty38ServerTest extends HttpServerTest implements Agent return "HTTP GET" } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean testConcurrency() { return true diff --git a/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy b/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy index 16a2ae95bb33..5592e1dee028 100644 --- a/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy +++ b/instrumentation/netty/netty-4.0/javaagent/src/test/groovy/Netty40ServerTest.groovy @@ -128,6 +128,11 @@ class Netty40ServerTest extends HttpServerTest implements AgentT return "HTTP GET" } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean testConcurrency() { return true diff --git a/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy b/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy index d88ad47e8c31..c6ffdc445980 100644 --- a/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy +++ b/instrumentation/netty/netty-4.1/javaagent/src/test/groovy/Netty41ServerTest.groovy @@ -127,6 +127,11 @@ class Netty41ServerTest extends HttpServerTest implements AgentT return "HTTP GET" } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean testConcurrency() { return true diff --git a/instrumentation/play/play-2.4/javaagent/src/test/groovy/server/PlayServerTest.groovy b/instrumentation/play/play-2.4/javaagent/src/test/groovy/server/PlayServerTest.groovy index 3de337809c9c..f4c78233064c 100644 --- a/instrumentation/play/play-2.4/javaagent/src/test/groovy/server/PlayServerTest.groovy +++ b/instrumentation/play/play-2.4/javaagent/src/test/groovy/server/PlayServerTest.groovy @@ -77,6 +77,11 @@ class PlayServerTest extends HttpServerTest implements AgentTestTrait { true } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean testConcurrency() { return true diff --git a/instrumentation/play/play-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy b/instrumentation/play/play-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy index 08a551f0a534..32d03abb7ecd 100644 --- a/instrumentation/play/play-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy +++ b/instrumentation/play/play-2.6/javaagent/src/test/groovy/server/PlayServerTest.groovy @@ -64,6 +64,11 @@ class PlayServerTest extends HttpServerTest implements AgentTestTrait { server.stop() } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean hasHandlerSpan(ServerEndpoint endpoint) { true diff --git a/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackAsyncHttpServerTest.groovy b/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackAsyncHttpServerTest.groovy index 093601cd8af3..227d08cb2941 100644 --- a/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackAsyncHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackAsyncHttpServerTest.groovy @@ -13,4 +13,9 @@ class RatpackAsyncHttpServerTest extends AbstractRatpackAsyncHttpServerTest impl @Override void configure(RatpackServerSpec serverSpec) { } + + @Override + boolean testCapturedHttpHeaders() { + false + } } diff --git a/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy b/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy index 0cf2ae96354b..f387647bd147 100644 --- a/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackForkedHttpServerTest.groovy @@ -13,4 +13,9 @@ class RatpackForkedHttpServerTest extends AbstractRatpackForkedHttpServerTest im @Override void configure(RatpackServerSpec serverSpec) { } + + @Override + boolean testCapturedHttpHeaders() { + false + } } diff --git a/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackHttpServerTest.groovy b/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackHttpServerTest.groovy index bef9fabf2e0e..426f3c218005 100644 --- a/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/javaagent/src/test/groovy/server/RatpackHttpServerTest.groovy @@ -14,4 +14,9 @@ class RatpackHttpServerTest extends AbstractRatpackHttpServerTest implements Age @Override void configure(RatpackServerSpec serverSpec) { } + + @Override + boolean testCapturedHttpHeaders() { + false + } } diff --git a/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy b/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy index 69e97514c13e..c082492e5a84 100644 --- a/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackAsyncHttpServerTest.groovy @@ -14,7 +14,9 @@ import ratpack.server.RatpackServerSpec class RatpackAsyncHttpServerTest extends AbstractRatpackAsyncHttpServerTest implements LibraryTestTrait { @Override void configure(RatpackServerSpec serverSpec) { - RatpackTracing tracing = RatpackTracing.create(openTelemetry) + RatpackTracing tracing = RatpackTracing.newBuilder(openTelemetry) + .captureHttpHeaders(capturedHttpHeadersForTesting()) + .build() serverSpec.registryOf { tracing.configureServerRegistry(it) } diff --git a/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy b/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy index 038eff44ef56..db959d429444 100644 --- a/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackForkedHttpServerTest.groovy @@ -14,7 +14,9 @@ import ratpack.server.RatpackServerSpec class RatpackForkedHttpServerTest extends AbstractRatpackForkedHttpServerTest implements LibraryTestTrait { @Override void configure(RatpackServerSpec serverSpec) { - RatpackTracing tracing = RatpackTracing.create(openTelemetry) + RatpackTracing tracing = RatpackTracing.newBuilder(openTelemetry) + .captureHttpHeaders(capturedHttpHeadersForTesting()) + .build() serverSpec.registryOf { tracing.configureServerRegistry(it) } diff --git a/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy b/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy index 713cabf9c503..6c04a6cbd7c0 100644 --- a/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/library/src/test/groovy/io/opentelemetry/instrumentation/ratpack/server/RatpackHttpServerTest.groovy @@ -14,7 +14,9 @@ import ratpack.server.RatpackServerSpec class RatpackHttpServerTest extends AbstractRatpackHttpServerTest implements LibraryTestTrait { @Override void configure(RatpackServerSpec serverSpec) { - RatpackTracing tracing = RatpackTracing.create(openTelemetry) + RatpackTracing tracing = RatpackTracing.newBuilder(openTelemetry) + .captureHttpHeaders(capturedHttpHeadersForTesting()) + .build() serverSpec.registryOf { tracing.configureServerRegistry(it) } diff --git a/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackAsyncHttpServerTest.groovy b/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackAsyncHttpServerTest.groovy index c76bdda27015..712edad6e686 100644 --- a/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackAsyncHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackAsyncHttpServerTest.groovy @@ -9,6 +9,7 @@ import ratpack.error.ServerErrorHandler import ratpack.exec.Promise import ratpack.server.RatpackServer +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -108,6 +109,19 @@ abstract class AbstractRatpackAsyncHttpServerTest extends AbstractRatpackHttpSer } } } + it.prefix(CAPTURE_HEADERS.rawPath()) { + it.all { context -> + Promise.sync { + CAPTURE_HEADERS + } then { endpoint -> + controller(endpoint) { + context.response.status(endpoint.status) + context.response.headers.set("X-Test-Response", context.request.headers.get("X-Test-Request")) + context.response.send(endpoint.body) + } + } + } + } } configure(it) } diff --git a/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackForkedHttpServerTest.groovy b/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackForkedHttpServerTest.groovy index ad8dfc311808..1bb6b1ba2103 100644 --- a/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackForkedHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackForkedHttpServerTest.groovy @@ -16,6 +16,7 @@ import ratpack.exec.Result import ratpack.exec.util.ParallelBatch import ratpack.server.RatpackServer +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -116,6 +117,19 @@ abstract class AbstractRatpackForkedHttpServerTest extends AbstractRatpackHttpSe } } } + it.prefix(CAPTURE_HEADERS.rawPath()) { + it.all { context -> + Promise.sync { + CAPTURE_HEADERS + }.fork().then { endpoint -> + controller(endpoint) { + context.response.status(endpoint.status) + context.response.headers.set("X-Test-Response", context.request.headers.get("X-Test-Request")) + context.response.send(endpoint.body) + } + } + } + } it.prefix("fork_and_yieldAll") { it.all { context -> def promise = Promise.async { upstream -> diff --git a/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy b/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy index e74da911f2b5..4121b32ab78a 100644 --- a/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy +++ b/instrumentation/ratpack-1.4/testing/src/main/groovy/io/opentelemetry/instrumentation/ratpack/server/AbstractRatpackHttpServerTest.groovy @@ -17,6 +17,7 @@ import ratpack.server.RatpackServer import ratpack.server.RatpackServerSpec import static io.opentelemetry.api.trace.SpanKind.INTERNAL +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -90,6 +91,15 @@ abstract class AbstractRatpackHttpServerTest extends HttpServerTest + controller(CAPTURE_HEADERS) { + context.response.status(CAPTURE_HEADERS.status) + context.response.headers.set("X-Test-Response", context.request.headers.get("X-Test-Request")) + context.response.send(CAPTURE_HEADERS.body) + } + } + } } configure(it) } diff --git a/instrumentation/restlet/restlet-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v1_0/AbstractRestletServerTest.groovy b/instrumentation/restlet/restlet-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v1_0/AbstractRestletServerTest.groovy index 3a9f4959f2f8..5a52c2963767 100644 --- a/instrumentation/restlet/restlet-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v1_0/AbstractRestletServerTest.groovy +++ b/instrumentation/restlet/restlet-1.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v1_0/AbstractRestletServerTest.groovy @@ -166,11 +166,6 @@ abstract class AbstractRestletServerTest extends HttpServerTest { true } - @Override - boolean testCapturedHttpHeaders() { - true - } - @Override String expectedServerSpanName(ServerEndpoint endpoint) { switch (endpoint) { diff --git a/instrumentation/servlet/servlet-2.2/javaagent/src/test/groovy/JettyServlet2Test.groovy b/instrumentation/servlet/servlet-2.2/javaagent/src/test/groovy/JettyServlet2Test.groovy index 4d76dde0f3c4..4acc916a0683 100644 --- a/instrumentation/servlet/servlet-2.2/javaagent/src/test/groovy/JettyServlet2Test.groovy +++ b/instrumentation/servlet/servlet-2.2/javaagent/src/test/groovy/JettyServlet2Test.groovy @@ -72,6 +72,12 @@ class JettyServlet2Test extends HttpServerTest implements AgentTestTrait false } + // servlet 2 does not expose a way to retrieve response headers + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean hasResponseSpan(ServerEndpoint endpoint) { endpoint == REDIRECT || endpoint == ERROR diff --git a/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/AbstractServlet3Test.groovy b/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/AbstractServlet3Test.groovy index 913d10227796..5394977dbf92 100644 --- a/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/AbstractServlet3Test.groovy +++ b/instrumentation/servlet/servlet-3.0/javaagent/src/test/groovy/AbstractServlet3Test.groovy @@ -11,6 +11,7 @@ import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpRequest import javax.servlet.Servlet import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.AUTH_REQUIRED +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -44,6 +45,7 @@ abstract class AbstractServlet3Test extends HttpServerTest extends HttpServerTest expectedExceptionClass() { return IllegalStateException diff --git a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/boot/SpringBootBasedTest.groovy b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/boot/SpringBootBasedTest.groovy index c6a0c3aabd6f..da0924b599c7 100644 --- a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/boot/SpringBootBasedTest.groovy +++ b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/boot/SpringBootBasedTest.groovy @@ -71,11 +71,6 @@ class SpringBootBasedTest extends HttpServerTest true } - @Override - boolean testCapturedHttpHeaders() { - true - } - @Override boolean hasErrorPageSpans(ServerEndpoint endpoint) { endpoint == NOT_FOUND diff --git a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/FilteredAppConfig.groovy b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/FilteredAppConfig.groovy index 8f32e9438313..2f52cfb02284 100644 --- a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/FilteredAppConfig.groovy +++ b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/FilteredAppConfig.groovy @@ -32,6 +32,7 @@ import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse import java.nio.charset.StandardCharsets +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM @@ -108,6 +109,11 @@ class FilteredAppConfig extends WebMvcConfigurerAdapter { case REDIRECT: resp.sendRedirect(endpoint.body) break + case CAPTURE_HEADERS: + resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")) + resp.status = endpoint.status + resp.writer.print(endpoint.body) + break case ERROR: resp.sendError(endpoint.status, endpoint.body) break diff --git a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/TestController.groovy b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/TestController.groovy index 2540c65b0201..f64b77afdc44 100644 --- a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/TestController.groovy +++ b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/test/groovy/test/filter/TestController.groovy @@ -5,6 +5,7 @@ package test.filter + import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.stereotype.Controller @@ -56,6 +57,12 @@ class TestController { throw new Exception("This should not be called") } + @RequestMapping("/captureHeaders") + ResponseEntity capture_headers() { + throw new Exception("This should not be called") + } + + @ExceptionHandler ResponseEntity handleException(Throwable throwable) { new ResponseEntity(throwable.message, HttpStatus.INTERNAL_SERVER_ERROR) diff --git a/instrumentation/struts-2.3/javaagent/src/test/groovy/Struts2ActionSpanTest.groovy b/instrumentation/struts-2.3/javaagent/src/test/groovy/Struts2ActionSpanTest.groovy index 5bbac95fbf03..7e1791c2c669 100644 --- a/instrumentation/struts-2.3/javaagent/src/test/groovy/Struts2ActionSpanTest.groovy +++ b/instrumentation/struts-2.3/javaagent/src/test/groovy/Struts2ActionSpanTest.groovy @@ -38,6 +38,12 @@ class Struts2ActionSpanTest extends HttpServerTest implements AgentTestT return false } + // no idea how to test that in struts + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean hasHandlerSpan(ServerEndpoint endpoint) { return endpoint != NOT_FOUND diff --git a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/AsyncServlet.groovy b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/AsyncServlet.groovy index a3f95d44679f..a0b395834d06 100644 --- a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/AsyncServlet.groovy +++ b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/AsyncServlet.groovy @@ -13,6 +13,7 @@ import jakarta.servlet.http.HttpServletResponse import java.util.concurrent.CountDownLatch +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -51,6 +52,12 @@ class AsyncServlet extends HttpServlet { resp.sendRedirect(endpoint.body) context.complete() break + case CAPTURE_HEADERS: + resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")) + resp.status = endpoint.status + resp.writer.print(endpoint.body) + context.complete() + break case ERROR: resp.status = endpoint.status resp.writer.print(endpoint.body) diff --git a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TestServlet.java b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TestServlet.java index 7748f532f327..1af1bb11cf20 100644 --- a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TestServlet.java +++ b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TestServlet.java @@ -25,6 +25,9 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IO if (serverEndpoint == HttpServerTest.ServerEndpoint.EXCEPTION) { throw new Exception(serverEndpoint.getBody()); } + if (serverEndpoint == HttpServerTest.ServerEndpoint.CAPTURE_HEADERS) { + resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")); + } resp.getWriter().print(serverEndpoint.getBody()); if (serverEndpoint == HttpServerTest.ServerEndpoint.REDIRECT) { resp.sendRedirect(serverEndpoint.getBody()); diff --git a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.groovy b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.groovy index f9e8b1ffdc8e..cb4986bc6176 100644 --- a/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.groovy +++ b/instrumentation/tomcat/tomcat-10.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v10_0/TomcatAsyncTest.groovy @@ -19,6 +19,7 @@ import spock.lang.Unroll import java.nio.file.Files import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.AUTH_REQUIRED +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -82,6 +83,7 @@ class TomcatAsyncTest extends HttpServerTest implements AgentTestTrait { addServlet(context, EXCEPTION.path, servlet) addServlet(context, REDIRECT.path, servlet) addServlet(context, AUTH_REQUIRED.path, servlet) + addServlet(context, CAPTURE_HEADERS.path, servlet) addServlet(context, INDEXED_CHILD.path, servlet) } diff --git a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/AsyncServlet.groovy b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/AsyncServlet.groovy index e9865c239d4d..23695f4158a4 100644 --- a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/AsyncServlet.groovy +++ b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/AsyncServlet.groovy @@ -13,6 +13,7 @@ import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse import java.util.concurrent.CountDownLatch +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -51,6 +52,12 @@ class AsyncServlet extends AbstractHttpServlet { resp.sendRedirect(endpoint.body) context.complete() break + case CAPTURE_HEADERS: + resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")) + resp.status = endpoint.status + resp.writer.print(endpoint.body) + context.complete() + break case ERROR: resp.status = endpoint.status resp.writer.print(endpoint.body) diff --git a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TestServlet.java b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TestServlet.java index 46273a1f2a6e..a32d229519df 100644 --- a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TestServlet.java +++ b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TestServlet.java @@ -25,6 +25,9 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IO if (serverEndpoint == HttpServerTest.ServerEndpoint.EXCEPTION) { throw new Exception(serverEndpoint.getBody()); } + if (serverEndpoint == HttpServerTest.ServerEndpoint.CAPTURE_HEADERS) { + resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")); + } resp.getWriter().print(serverEndpoint.getBody()); if (serverEndpoint == HttpServerTest.ServerEndpoint.REDIRECT) { resp.sendRedirect(serverEndpoint.getBody()); diff --git a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.groovy b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.groovy index 1bf28b9c18f7..3a83c4ad2696 100644 --- a/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.groovy +++ b/instrumentation/tomcat/tomcat-7.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/tomcat/v7_0/TomcatAsyncTest.groovy @@ -19,6 +19,7 @@ import javax.servlet.ServletException import java.nio.file.Files import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.AUTH_REQUIRED +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD @@ -82,6 +83,7 @@ class TomcatAsyncTest extends HttpServerTest implements AgentTestTrait { addServlet(context, EXCEPTION.path, servlet) addServlet(context, REDIRECT.path, servlet) addServlet(context, AUTH_REQUIRED.path, servlet) + addServlet(context, CAPTURE_HEADERS.path, servlet) addServlet(context, INDEXED_CHILD.path, servlet) } diff --git a/instrumentation/undertow-1.4/javaagent/src/test/groovy/UndertowServerTest.groovy b/instrumentation/undertow-1.4/javaagent/src/test/groovy/UndertowServerTest.groovy index 1ee18d4f9d10..fbf1f5b40b3b 100644 --- a/instrumentation/undertow-1.4/javaagent/src/test/groovy/UndertowServerTest.groovy +++ b/instrumentation/undertow-1.4/javaagent/src/test/groovy/UndertowServerTest.groovy @@ -14,8 +14,10 @@ import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse import io.undertow.Handlers import io.undertow.Undertow import io.undertow.util.Headers +import io.undertow.util.HttpString import io.undertow.util.StatusCodes +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM @@ -47,6 +49,13 @@ class UndertowServerTest extends HttpServerTest implements AgentTestTr exchange.endExchange() } } + .addExactPath(CAPTURE_HEADERS.rawPath()) { exchange -> + controller(CAPTURE_HEADERS) { + exchange.setStatusCode(StatusCodes.OK) + exchange.getResponseHeaders().put(new HttpString("X-Test-Response"), exchange.getRequestHeaders().getFirst("X-Test-Request")) + exchange.getResponseSender().send(CAPTURE_HEADERS.body) + } + } .addExactPath(ERROR.rawPath()) { exchange -> controller(ERROR) { exchange.setStatusCode(ERROR.status) diff --git a/instrumentation/vertx-reactive-3.5/javaagent/src/latestDepTest/groovy/server/VertxRxHttpServerTest.groovy b/instrumentation/vertx-reactive-3.5/javaagent/src/latestDepTest/groovy/server/VertxRxHttpServerTest.groovy index 8dde090b7f35..fe798cb4bb71 100644 --- a/instrumentation/vertx-reactive-3.5/javaagent/src/latestDepTest/groovy/server/VertxRxHttpServerTest.groovy +++ b/instrumentation/vertx-reactive-3.5/javaagent/src/latestDepTest/groovy/server/VertxRxHttpServerTest.groovy @@ -58,6 +58,11 @@ class VertxRxHttpServerTest extends HttpServerTest implements AgentTestTr server.close() } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override boolean testPathParam() { return true diff --git a/instrumentation/vertx-reactive-3.5/javaagent/src/version35Test/groovy/server/VertxRxHttpServerTest.groovy b/instrumentation/vertx-reactive-3.5/javaagent/src/version35Test/groovy/server/VertxRxHttpServerTest.groovy index bdc21d4d515a..14e78aa30c80 100644 --- a/instrumentation/vertx-reactive-3.5/javaagent/src/version35Test/groovy/server/VertxRxHttpServerTest.groovy +++ b/instrumentation/vertx-reactive-3.5/javaagent/src/version35Test/groovy/server/VertxRxHttpServerTest.groovy @@ -63,6 +63,11 @@ class VertxRxHttpServerTest extends HttpServerTest implements AgentTestTr return true } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override String expectedServerSpanName(ServerEndpoint endpoint) { switch (endpoint) { diff --git a/instrumentation/vertx-web-3.0/testing/src/main/groovy/server/AbstractVertxHttpServerTest.groovy b/instrumentation/vertx-web-3.0/testing/src/main/groovy/server/AbstractVertxHttpServerTest.groovy index 03866f80c9d9..f86a024a9fc6 100644 --- a/instrumentation/vertx-web-3.0/testing/src/main/groovy/server/AbstractVertxHttpServerTest.groovy +++ b/instrumentation/vertx-web-3.0/testing/src/main/groovy/server/AbstractVertxHttpServerTest.groovy @@ -60,6 +60,11 @@ abstract class AbstractVertxHttpServerTest extends HttpServerTest impleme return true } + @Override + boolean testCapturedHttpHeaders() { + false + } + @Override List> extraAttributes() { return [ diff --git a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy index 8d67a879dc7d..8ca3fe373031 100644 --- a/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy +++ b/testing-common/src/main/groovy/io/opentelemetry/instrumentation/test/base/HttpServerTest.groovy @@ -103,9 +103,8 @@ abstract class HttpServerTest extends InstrumentationSpecification imple false } - // TODO: enable it everywhere boolean testCapturedHttpHeaders() { - false + true } boolean testErrorBody() {