From b1b9ffd6c4df373fbe513315ad1604348fcf279b Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 18 Oct 2023 15:07:41 +0200 Subject: [PATCH 1/9] Add instrumentation for jaxws metro 3.0+ Previously, only jaxws metro 2.2 was instrumented, which only worked with Java EE (javax namespace). Now, jaxws metro 3.0+ is also instrumented, which works with Jakarta EE (jakarta namespace). Rather than copy/pasting the metro 2.2 instrumentation implementation to a new metro 3.0 module, I made the existing module able to work with both Java EE and Jakarta EE classes. More specifically, I * moved the instrumentation implementation from `jaxws-2.0-metro-2.2` to `jaxws-metro-2.2` since "jaxws-2.0" is specific to Java EE. * Renamed `MetroServerSpanNaming` to `MetroServerSpanNameUpdater`, and made it work with both Java EE and Jakarta EE based on what is available on the runtime classpath. * moved the Java EE specific tests from `jaxws-2.0-metro-2.2` to `jaxws-2.0-metro-2.2-testing` * added new Jakarta EE specific tests in `jaxws-3.0-metro-2.2-testing`. This is basically a copy/paste of the tests from `jaxws-2.0-metro-2.2-testing`, but using Jakarta EE namespacing. * added the `jaxws-3.0-common-testing` module for reusable Jakarta EE tests for other future jaxws instrumentation implementations. This is basically a copy/paste of `jaxws-2.0-common-testing`, but using Jakarta EE namespacing. Regarding the implementation of `MetroServerSpanNameUpdater`, I originally added compile time dependencies on both `jakarta.servlet-api` and `javax.servlet-api`, and referenced both of their classes directly in the code, although guarded to make sure things would still work if they weren't on the runtime classpath. Unfortunately, muzzle would disable the instrumentation if either was not found at runtime. Therefore, I had to refactor the code a bit to only use reflection to access the classes. This way muzzle won't disable the instrumentation if either is not found. This is related to #9569, but specific to the metro runtime, rather than at the annotated `@WebService` level. --- docs/supported-libraries.md | 2 +- .../build.gradle.kts | 28 +++ .../src/test/groovy/MetroJaxWsTest.groovy | 0 .../resources/test-app/WEB-INF/sun-jaxws.xml | 0 .../test/resources/test-app/WEB-INF/web.xml | 0 .../metro/MetroServerSpanNaming.java | 53 ----- .../jaxws-3.0-common-testing/build.gradle.kts | 28 +++ .../src/main/groovy/AbstractJaxWsTest.groovy | 187 ++++++++++++++++++ .../main/groovy/hello/BaseHelloService.groovy | 16 ++ .../src/main/groovy/hello/HelloService.groovy | 24 +++ .../main/groovy/hello/HelloServiceImpl.groovy | 19 ++ .../src/main/schema/hello.xsd | 35 ++++ .../build.gradle.kts | 23 +++ .../src/test/groovy/MetroJaxWsTest.groovy | 7 + .../resources/test-app/WEB-INF/sun-jaxws.xml | 6 + .../test/resources/test-app/WEB-INF/web.xml | 21 ++ .../javaagent/build.gradle.kts | 17 +- .../instrumentation/metro/MetroHelper.java | 5 +- .../metro/MetroInstrumentationModule.java | 2 +- .../instrumentation/metro/MetroRequest.java | 0 .../metro/MetroServerSpanNameUpdater.java | 163 +++++++++++++++ .../metro/MetroSingletons.java | 2 +- ...erTubeAssemblerContextInstrumentation.java | 0 .../SoapFaultBuilderInstrumentation.java | 0 .../instrumentation/metro/TracingTube.java | 0 settings.gradle.kts | 5 +- 26 files changed, 571 insertions(+), 72 deletions(-) create mode 100644 instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts rename instrumentation/jaxws/{jaxws-2.0-metro-2.2/javaagent => jaxws-2.0-metro-2.2-testing}/src/test/groovy/MetroJaxWsTest.groovy (100%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2/javaagent => jaxws-2.0-metro-2.2-testing}/src/test/resources/test-app/WEB-INF/sun-jaxws.xml (100%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2/javaagent => jaxws-2.0-metro-2.2-testing}/src/test/resources/test-app/WEB-INF/web.xml (100%) delete mode 100644 instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNaming.java create mode 100644 instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts create mode 100644 instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/AbstractJaxWsTest.groovy create mode 100644 instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/BaseHelloService.groovy create mode 100644 instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloService.groovy create mode 100644 instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloServiceImpl.groovy create mode 100644 instrumentation/jaxws/jaxws-3.0-common-testing/src/main/schema/hello.xsd create mode 100644 instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts create mode 100644 instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/groovy/MetroJaxWsTest.groovy create mode 100644 instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/sun-jaxws.xml create mode 100644 instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/web.xml rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/build.gradle.kts (58%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java (92%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java (92%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroRequest.java (100%) create mode 100644 instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java (96%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/ServerTubeAssemblerContextInstrumentation.java (100%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/SoapFaultBuilderInstrumentation.java (100%) rename instrumentation/jaxws/{jaxws-2.0-metro-2.2 => jaxws-metro-2.2}/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/TracingTube.java (100%) diff --git a/docs/supported-libraries.md b/docs/supported-libraries.md index aa173229d643..29c10880ecc9 100644 --- a/docs/supported-libraries.md +++ b/docs/supported-libraries.md @@ -51,7 +51,7 @@ These are the supported libraries and frameworks: | [Eclipse Grizzly](https://javaee.github.io/grizzly/httpserverframework.html) | 2.3+ | N/A | [HTTP Server Spans], [HTTP Server Metrics] | | [Eclipse Jersey](https://eclipse-ee4j.github.io/jersey/) | 2.0+ (not including 3.x yet) | N/A | Provides `http.route` [2], Controller Spans [3] | | [Eclipse Jetty HTTP Client](https://www.eclipse.org/jetty/javadoc/jetty-9/org/eclipse/jetty/client/HttpClient.html) | 9.2+ (not including 10+ yet) | [opentelemetry-jetty-httpclient-9.2](../instrumentation/jetty-httpclient/jetty-httpclient-9.2/library) | [HTTP Client Spans], [HTTP Client Metrics] | -| [Eclipse Metro](https://projects.eclipse.org/projects/ee4j.metro) | 2.2+ (not including 3.x yet) | N/A | Provides `http.route` [2], Controller Spans [3] | +| [Eclipse Metro](https://projects.eclipse.org/projects/ee4j.metro) | 2.2+ | N/A | Provides `http.route` [2], Controller Spans [3] | | [Eclipse Mojarra](https://projects.eclipse.org/projects/ee4j.mojarra) | 1.2+ (not including 3.x yet) | N/A | Provides `http.route` [2], Controller Spans [3] | | [Elasticsearch API Client](https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html) | 7.16+ and 8.0+ | N/A | [Elasticsearch Client Spans] | | [Elasticsearch REST Client](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html) | 5.0+ | N/A | [Database Client Spans] | diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts new file mode 100644 index 000000000000..9dd6990cf05e --- /dev/null +++ b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("otel.javaagent-testing") +} + +dependencies { + testImplementation("javax.servlet:javax.servlet-api:3.0.1") + testImplementation("com.sun.xml.ws:jaxws-rt:2.3.6") + + testImplementation(project(":instrumentation:jaxws:jaxws-2.0-common-testing")) + + testInstrumentation(project(":instrumentation:jaxws:jaxws-metro-2.2:javaagent")) + testInstrumentation(project(":instrumentation:jaxws:jaxws-2.0:javaagent")) + testInstrumentation(project(":instrumentation:jaxws:jaxws-jws-api-1.1:javaagent")) + + testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent")) + testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent")) + + latestDepTestLibrary("com.sun.xml.ws:jaxws-rt:2.+") + latestDepTestLibrary("com.sun.xml.stream.buffer:streambuffer:1.+") +} + +tasks.withType().configureEach { + // required on jdk17 + jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED") + jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED") + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") +} diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/test/groovy/MetroJaxWsTest.groovy b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/src/test/groovy/MetroJaxWsTest.groovy similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/test/groovy/MetroJaxWsTest.groovy rename to instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/src/test/groovy/MetroJaxWsTest.groovy diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/test/resources/test-app/WEB-INF/sun-jaxws.xml b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/sun-jaxws.xml similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/test/resources/test-app/WEB-INF/sun-jaxws.xml rename to instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/sun-jaxws.xml diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/test/resources/test-app/WEB-INF/web.xml b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/web.xml similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/test/resources/test-app/WEB-INF/web.xml rename to instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/web.xml diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNaming.java b/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNaming.java deleted file mode 100644 index 284cbf8ed620..000000000000 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNaming.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.metro; - -import com.sun.xml.ws.api.message.Packet; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan; -import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath; -import javax.servlet.http.HttpServletRequest; -import javax.xml.ws.handler.MessageContext; - -public final class MetroServerSpanNaming { - - public static void updateServerSpanName(Context context, MetroRequest metroRequest) { - String spanName = metroRequest.spanName(); - if (spanName == null) { - return; - } - - Span serverSpan = LocalRootSpan.fromContextOrNull(context); - if (serverSpan == null) { - return; - } - - Packet packet = metroRequest.packet(); - if (packet.supports(MessageContext.SERVLET_REQUEST)) { - Object request = packet.get(MessageContext.SERVLET_REQUEST); - if (request instanceof HttpServletRequest) { - HttpServletRequest httpRequest = (HttpServletRequest) request; - String servletPath = httpRequest.getServletPath(); - if (!servletPath.isEmpty()) { - String pathInfo = httpRequest.getPathInfo(); - if (pathInfo != null) { - spanName = servletPath + "/" + spanName; - } else { - // when pathInfo is null then there is a servlet that is mapped to this exact service - // servletPath already contains the service name - String operationName = packet.getWSDLOperation().getLocalPart(); - spanName = servletPath + "/" + operationName; - } - } - } - } - - serverSpan.updateName(ServletContextPath.prepend(context, spanName)); - } - - private MetroServerSpanNaming() {} -} diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts new file mode 100644 index 000000000000..ecd8f75a5c37 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("org.unbroken-dome.xjc") + id("otel.java-conventions") +} + +tasks { + named("checkstyleMain") { + // exclude generated web service classes + exclude("**/hello_web_service/**") + } +} + +dependencies { + api("jakarta.xml.ws:jakarta.xml.ws-api:3.0.0") + api("jakarta.jws:jakarta.jws-api:3.0.0") + + api("ch.qos.logback:logback-classic") + api("org.slf4j:log4j-over-slf4j") + api("org.slf4j:jcl-over-slf4j") + api("org.slf4j:jul-to-slf4j") + api("org.eclipse.jetty:jetty-webapp:11.0.17") + api("org.springframework.ws:spring-ws-core:4.0.0") + + implementation(project(":testing-common")) + + xjcTool("com.sun.xml.bind:jaxb-xjc:3.0.2") + xjcTool("com.sun.xml.bind:jaxb-impl:3.0.2") +} diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/AbstractJaxWsTest.groovy b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/AbstractJaxWsTest.groovy new file mode 100644 index 000000000000..b1ce89abb00d --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/AbstractJaxWsTest.groovy @@ -0,0 +1,187 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification +import io.opentelemetry.instrumentation.test.asserts.TraceAssert +import io.opentelemetry.instrumentation.test.base.HttpServerTestTrait +import io.opentelemetry.sdk.trace.data.SpanData +import io.opentelemetry.semconv.SemanticAttributes +import io.opentelemetry.test.hello_web_service.Hello2Request +import io.opentelemetry.test.hello_web_service.HelloRequest +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.util.resource.Resource +import org.eclipse.jetty.webapp.WebAppContext +import org.springframework.oxm.jaxb.Jaxb2Marshaller +import org.springframework.util.ClassUtils +import org.springframework.ws.client.core.WebServiceTemplate +import org.springframework.ws.soap.client.SoapFaultClientException +import spock.lang.Shared +import spock.lang.Unroll + +import static io.opentelemetry.api.trace.SpanKind.INTERNAL +import static io.opentelemetry.api.trace.SpanKind.SERVER +import static io.opentelemetry.api.trace.StatusCode.ERROR + +abstract class AbstractJaxWsTest extends AgentInstrumentationSpecification implements HttpServerTestTrait { + + @Shared + private Jaxb2Marshaller marshaller = new Jaxb2Marshaller() + + @Shared + protected WebServiceTemplate webServiceTemplate = new WebServiceTemplate(marshaller) + + def setupSpec() { + setupServer() + + marshaller.setPackagesToScan(ClassUtils.getPackageName(HelloRequest)) + marshaller.afterPropertiesSet() + } + + def cleanupSpec() { + cleanupServer() + } + + @Override + Server startServer(int port) { + WebAppContext webAppContext = new WebAppContext() + webAppContext.setContextPath(getContextPath()) + // set up test application + webAppContext.setBaseResource(Resource.newSystemResource("test-app")) + webAppContext.getMetaData().addWebInfResource(Resource.newClassPathResource("/")) + + def jettyServer = new Server(port) + jettyServer.connectors.each { + it.setHost('localhost') + } + + jettyServer.setHandler(webAppContext) + jettyServer.start() + + return jettyServer + } + + @Override + void stopServer(Server server) { + server.stop() + server.destroy() + } + + @Override + String getContextPath() { + return "/jetty-context" + } + + String getServiceAddress(String serviceName) { + return address.resolve("ws/" + serviceName).toString() + } + + def makeRequest(methodName, name) { + Object request = null + if ("hello" == methodName) { + request = new HelloRequest(name: name) + } else if ("hello2" == methodName) { + request = new Hello2Request(name: name) + } else { + throw new IllegalArgumentException(methodName) + } + + return webServiceTemplate.marshalSendAndReceive(getServiceAddress("HelloService"), request) + } + + @Unroll + def "test #methodName"() { + setup: + def response = makeRequest(methodName, "Test") + + expect: + response.getMessage() == "Hello Test" + + and: + def spanCount = 2 + assertTraces(1) { + trace(0, spanCount) { + serverSpan(it, 0, serverSpanName(methodName)) + handlerSpan(it, 1, methodName, span(0)) + } + } + + where: + methodName << ["hello", "hello2"] + } + + @Unroll + def "test #methodName exception"() { + when: + makeRequest(methodName, "exception") + + then: + def error = thrown(SoapFaultClientException) + error.getMessage() == "hello exception" + + and: + def spanCount = 2 + def expectedException = new Exception("hello exception") + assertTraces(1) { + trace(0, spanCount) { + serverSpan(it, 0, serverSpanName(methodName), expectedException) + handlerSpan(it, 1, methodName, span(0), expectedException) + } + } + + where: + methodName << ["hello", "hello2"] + } + + def serverSpanName(String operation) { + return getContextPath() + "/ws/HelloService/" + operation + } + + static serverSpan(TraceAssert trace, int index, String operation, Throwable exception = null) { + trace.span(index) { + hasNoParent() + name operation + kind SERVER + if (exception != null) { + status ERROR + } + } + } + + static handlerSpan(TraceAssert trace, int index, String operation, Object parentSpan = null, Throwable exception = null) { + trace.span(index) { + if (parentSpan == null) { + hasNoParent() + } else { + childOf((SpanData) parentSpan) + } + name "HelloService/" + operation + kind INTERNAL + if (exception) { + status ERROR + errorEvent(exception.class, exception.message) + } + } + } + + static annotationHandlerSpan(TraceAssert trace, int index, String methodName, Object parentSpan = null, Throwable exception = null) { + trace.span(index) { + if (parentSpan == null) { + hasNoParent() + } else { + childOf((SpanData) parentSpan) + } + name "HelloServiceImpl." + methodName + kind INTERNAL + if (exception) { + status ERROR + errorEvent(exception.class, exception.message) + } + attributes { + "$SemanticAttributes.CODE_NAMESPACE" "hello.HelloServiceImpl" + "$SemanticAttributes.CODE_FUNCTION" methodName + } + } + } +} diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/BaseHelloService.groovy b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/BaseHelloService.groovy new file mode 100644 index 000000000000..a2d8da1e8a11 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/BaseHelloService.groovy @@ -0,0 +1,16 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package hello + +class BaseHelloService { + + String hello2(String name) { + if ("exception" == name) { + throw new Exception("hello exception") + } + return "Hello " + name + } +} diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloService.groovy b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloService.groovy new file mode 100644 index 000000000000..6e79845e2063 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloService.groovy @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package hello + +import jakarta.jws.WebParam +import jakarta.jws.WebResult +import jakarta.jws.WebService +import jakarta.xml.ws.RequestWrapper + +@WebService(targetNamespace = "http://opentelemetry.io/test/hello-web-service") +interface HelloService { + + @RequestWrapper(localName = "helloRequest") + @WebResult(name = "message") + String hello(@WebParam(name = "name") String name) + + @RequestWrapper(localName = "hello2Request") + @WebResult(name = "message") + String hello2(@WebParam(name = "name") String name) + +} diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloServiceImpl.groovy b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloServiceImpl.groovy new file mode 100644 index 000000000000..5a54f9e42021 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/groovy/hello/HelloServiceImpl.groovy @@ -0,0 +1,19 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package hello + +import jakarta.jws.WebService + +@WebService(serviceName = "HelloService", endpointInterface = "hello.HelloService", targetNamespace = "http://opentelemetry.io/test/hello-web-service") +class HelloServiceImpl extends BaseHelloService implements HelloService { + + String hello(String name) { + if ("exception" == name) { + throw new Exception("hello exception") + } + return "Hello " + name + } +} diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/schema/hello.xsd b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/schema/hello.xsd new file mode 100644 index 000000000000..f46d7d715238 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/src/main/schema/hello.xsd @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts new file mode 100644 index 000000000000..7ac00df018ba --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + id("otel.javaagent-testing") +} + +dependencies { + testImplementation("jakarta.servlet:jakarta.servlet-api:5.0.0") + testImplementation("com.sun.xml.ws:jaxws-rt:3.0.0") + + testImplementation(project(":instrumentation:jaxws:jaxws-3.0-common-testing")) + + testInstrumentation(project(":instrumentation:jaxws:jaxws-metro-2.2:javaagent")) + + testInstrumentation(project(":instrumentation:servlet:servlet-5.0:javaagent")) + testInstrumentation(project(":instrumentation:jetty:jetty-11.0:javaagent")) +} + +tasks.withType().configureEach { + // required on jdk17 + jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED") + jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED") + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") +} diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/groovy/MetroJaxWsTest.groovy b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/groovy/MetroJaxWsTest.groovy new file mode 100644 index 000000000000..c20abd4456f3 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/groovy/MetroJaxWsTest.groovy @@ -0,0 +1,7 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +class MetroJaxWsTest extends AbstractJaxWsTest { +} diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/sun-jaxws.xml b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/sun-jaxws.xml new file mode 100644 index 000000000000..6bf3e05acba2 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/sun-jaxws.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/web.xml b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/web.xml new file mode 100644 index 000000000000..037ef81d3bd2 --- /dev/null +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/src/test/resources/test-app/WEB-INF/web.xml @@ -0,0 +1,21 @@ + + + + + com.sun.xml.ws.transport.http.servlet.WSServletContextListener + + + + WSServlet + com.sun.xml.ws.transport.http.servlet.WSServlet + 1 + + + + WSServlet + /ws/* + + diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/build.gradle.kts b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts similarity index 58% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/build.gradle.kts rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts index 59be6661ab3e..aebdda4d0f53 100644 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts @@ -6,11 +6,10 @@ muzzle { pass { group.set("com.sun.xml.ws") module.set("jaxws-rt") - versions.set("[2.2.0.1,3)") + versions.set("[2.2.0.1,)") // version 2.3.4 depends on org.glassfish.gmbal:gmbal-api-only:4.0.3 which does not exist skip("2.3.4") assertInverse.set(true) - extraDependency("javax.servlet:javax.servlet-api:3.0.1") } } @@ -22,18 +21,8 @@ dependencies { // which doesn't work with java 8 library("com.sun.xml.stream.buffer:streambuffer:1.4") - compileOnly("javax.servlet:javax.servlet-api:3.0.1") - - testImplementation(project(":instrumentation:jaxws:jaxws-2.0-common-testing")) - - testInstrumentation(project(":instrumentation:jaxws:jaxws-2.0:javaagent")) - testInstrumentation(project(":instrumentation:jaxws:jaxws-jws-api-1.1:javaagent")) - - testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent")) - testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent")) - - latestDepTestLibrary("com.sun.xml.ws:jaxws-rt:2.+") - latestDepTestLibrary("com.sun.xml.stream.buffer:streambuffer:1.+") + compileOnly("javax.xml.ws:jaxws-api:2.0") + compileOnly("jakarta.xml.ws:jakarta.xml.ws-api:3.0.0") } tasks.withType().configureEach { diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java similarity index 92% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java index b2122c29e2b0..8c8ad4996b93 100644 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroHelper.java @@ -18,13 +18,16 @@ public final class MetroHelper { private static final String SCOPE_KEY = MetroHelper.class.getName() + ".Scope"; private static final String THROWABLE_KEY = MetroHelper.class.getName() + ".Throwable"; + private static final MetroServerSpanNameUpdater SPAN_NAME_UPDATER = + new MetroServerSpanNameUpdater(); + private MetroHelper() {} public static void start(WSEndpoint endpoint, Packet packet) { Context parentContext = Context.current(); MetroRequest request = new MetroRequest(endpoint, packet); - MetroServerSpanNaming.updateServerSpanName(parentContext, request); + SPAN_NAME_UPDATER.updateServerSpanName(parentContext, request); if (!instrumenter().shouldStart(parentContext, request)) { return; diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java similarity index 92% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java index 957dbf04537a..2a39fe143e3e 100644 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroInstrumentationModule.java @@ -22,7 +22,7 @@ public MetroInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { - return hasClassesNamed("javax.jws.WebService"); + return hasClassesNamed("com.sun.xml.ws.api.pipe.ServerTubeAssemblerContext"); } @Override diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroRequest.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroRequest.java similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroRequest.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroRequest.java diff --git a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java new file mode 100644 index 000000000000..3998099794c4 --- /dev/null +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java @@ -0,0 +1,163 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.metro; + +import com.sun.xml.ws.api.message.Packet; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan; +import io.opentelemetry.javaagent.bootstrap.servlet.ServletContextPath; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.logging.Logger; + +final class MetroServerSpanNameUpdater { + + private static final Logger logger = Logger.getLogger(MetroServerSpanNameUpdater.class.getName()); + + /** + * Map of message context key names to the {@link HttpServletRequestAdapter} to handle the {@code + * HttpServletRequest} found at that message context key. + * + *

This map will contain at most two entries: + * + *

    + *
  • {@value javax.xml.ws.handler.MessageContext#SERVLET_REQUEST} to an {@link + * HttpServletRequestAdapter} that handles {@code javax.servlet.http.HttpServletRequest} + *
  • {@value jakarta.xml.ws.handler.MessageContext#SERVLET_REQUEST} to an {@link + * HttpServletRequestAdapter} that handles {@code jakarta.servlet.http.HttpServletRequest} + *
+ */ + private final Map servletRequestAdapters; + + public MetroServerSpanNameUpdater() { + this.servletRequestAdapters = new LinkedHashMap<>(); + + registerHttpServletRequestAdapter( + "Jakarta EE", + // Same as jakarta.xml.ws.handler.MessageContext.SERVLET_REQUEST + "jakarta.xml.ws.servlet.request", + "jakarta.servlet.http.HttpServletRequest"); + + registerHttpServletRequestAdapter( + "Java EE", + // Same as javax.xml.ws.handler.MessageContext.SERVLET_REQUEST + "javax.xml.ws.servlet.request", + "javax.servlet.http.HttpServletRequest"); + } + + /** + * Registers a {@link HttpServletRequestAdapter} in the {@link #servletRequestAdapters} with the + * given {@code key} if the given {@code httpServletRequestClassName} is on the classpath. + */ + private void registerHttpServletRequestAdapter( + String name, String key, String httpServletRequestClassName) { + final HttpServletRequestAdapter adapter; + try { + adapter = + new HttpServletRequestAdapter( + Class.forName(httpServletRequestClassName, true, getClass().getClassLoader())); + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { + // Ignore. Don't register + return; + } + servletRequestAdapters.put(key, adapter); + logger.finest(() -> "Enabled " + name + " jaxws metro server span naming"); + } + + public void updateServerSpanName(Context context, MetroRequest metroRequest) { + String spanName = metroRequest.spanName(); + if (spanName == null) { + return; + } + + Span serverSpan = LocalRootSpan.fromContextOrNull(context); + if (serverSpan == null) { + return; + } + + for (Map.Entry httpServletRequestAdapterEntry : + servletRequestAdapters.entrySet()) { + Packet packet = metroRequest.packet(); + String key = httpServletRequestAdapterEntry.getKey(); + if (packet.supports(key)) { + Object request = packet.get(key); + HttpServletRequestAdapter httpServletRequestAdapter = + httpServletRequestAdapterEntry.getValue(); + if (httpServletRequestAdapter.canHandle(request)) { + String servletPath = httpServletRequestAdapter.getServletPath(request); + if (!servletPath.isEmpty()) { + String pathInfo = httpServletRequestAdapter.getPathInfo(request); + if (pathInfo != null) { + spanName = servletPath + "/" + spanName; + } else { + // when pathInfo is null then there is a servlet that is mapped to this exact service + // servletPath already contains the service name + String operationName = packet.getWSDLOperation().getLocalPart(); + spanName = servletPath + "/" + operationName; + } + break; + } + } + } + } + + serverSpan.updateName(ServletContextPath.prepend(context, spanName)); + } + + /** + * Adapter class for accessing the methods needed from either {@code + * jakarta.servlet.http.HttpServletRequest} or {@code javax.servlet.http.HttpServletRequest}. + */ + private static class HttpServletRequestAdapter { + + private final Class httpServletRequestClass; + private final MethodHandle getServletPathMethodHandle; + private final MethodHandle getPathInfoMethodHandle; + + private HttpServletRequestAdapter(Class httpServletRequestClass) + throws NoSuchMethodException, IllegalAccessException { + this.httpServletRequestClass = + Objects.requireNonNull( + httpServletRequestClass, "httpServletRequestClass must not be null"); + + MethodHandles.Lookup lookup = MethodHandles.lookup(); + this.getServletPathMethodHandle = + lookup.unreflect(httpServletRequestClass.getMethod("getServletPath")); + this.getPathInfoMethodHandle = + lookup.unreflect(httpServletRequestClass.getMethod("getPathInfo")); + } + + public boolean canHandle(Object httpServletRequest) { + return httpServletRequestClass.isInstance(httpServletRequest); + } + + public String getServletPath(Object httpServletRequest) { + return invokeSafely(getServletPathMethodHandle, httpServletRequest); + } + + public String getPathInfo(Object httpServletRequest) { + return invokeSafely(getPathInfoMethodHandle, httpServletRequest); + } + + private static String invokeSafely(MethodHandle methodHandle, Object httpServletRequest) { + try { + return (String) methodHandle.invoke(httpServletRequest); + } catch (RuntimeException | Error e) { + throw e; + } catch (Throwable t) { + /* + * This is impossible, because the methods being invoked do not throw checked exceptions, + * and unchecked exceptions and errors are handled above + */ + throw new AssertionError(t); + } + } + } +} diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java similarity index 96% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java index 470bccf76cc9..aa6ef3858d56 100644 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroSingletons.java @@ -10,7 +10,7 @@ import io.opentelemetry.javaagent.bootstrap.internal.ExperimentalConfig; public class MetroSingletons { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jaxws-2.0-metro-2.2"; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.jaxws-metro-2.2"; private static final Instrumenter INSTRUMENTER; diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/ServerTubeAssemblerContextInstrumentation.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/ServerTubeAssemblerContextInstrumentation.java similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/ServerTubeAssemblerContextInstrumentation.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/ServerTubeAssemblerContextInstrumentation.java diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/SoapFaultBuilderInstrumentation.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/SoapFaultBuilderInstrumentation.java similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/SoapFaultBuilderInstrumentation.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/SoapFaultBuilderInstrumentation.java diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/TracingTube.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/TracingTube.java similarity index 100% rename from instrumentation/jaxws/jaxws-2.0-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/TracingTube.java rename to instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/TracingTube.java diff --git a/settings.gradle.kts b/settings.gradle.kts index 88c453fca3c0..0656f54332db 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -287,15 +287,18 @@ include(":instrumentation:jaxrs:jaxrs-3.0:jaxrs-3.0-jersey-3.0:javaagent") include(":instrumentation:jaxrs:jaxrs-3.0:jaxrs-3.0-resteasy-6.0:javaagent") include(":instrumentation:jaxrs-client:jaxrs-client-1.1-testing") include(":instrumentation:jaxrs-client:jaxrs-client-2.0-testing") +include(":instrumentation:jaxws:jaxws-metro-2.2:javaagent") include(":instrumentation:jaxws:jaxws-2.0:javaagent") include(":instrumentation:jaxws:jaxws-2.0-arquillian-testing") include(":instrumentation:jaxws:jaxws-2.0-axis2-1.6:javaagent") include(":instrumentation:jaxws:jaxws-2.0-cxf-3.0:javaagent") include(":instrumentation:jaxws:jaxws-2.0-cxf-3.0:javaagent-unit-tests") -include(":instrumentation:jaxws:jaxws-2.0-metro-2.2:javaagent") +include(":instrumentation:jaxws:jaxws-2.0-metro-2.2-testing") include(":instrumentation:jaxws:jaxws-2.0-common-testing") include(":instrumentation:jaxws:jaxws-2.0-tomee-testing") include(":instrumentation:jaxws:jaxws-2.0-wildfly-testing") +include(":instrumentation:jaxws:jaxws-3.0-common-testing") +include(":instrumentation:jaxws:jaxws-3.0-metro-2.2-testing") include(":instrumentation:jaxws:jaxws-common:javaagent") include(":instrumentation:jaxws:jaxws-jws-api-1.1:javaagent") include(":instrumentation:jboss-logmanager:jboss-logmanager-appender-1.1:javaagent") From e71ec2116b18f9ad87c4765118f30df6876c2ffc Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 18 Oct 2023 15:25:22 +0200 Subject: [PATCH 2/9] Remove final designated as unnecessary --- .../instrumentation/metro/MetroServerSpanNameUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java index 3998099794c4..cd295d06a51e 100644 --- a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java @@ -58,7 +58,7 @@ public MetroServerSpanNameUpdater() { */ private void registerHttpServletRequestAdapter( String name, String key, String httpServletRequestClassName) { - final HttpServletRequestAdapter adapter; + HttpServletRequestAdapter adapter; try { adapter = new HttpServletRequestAdapter( From ca5eb999b3ec75431078258bd184412f8c89eae6 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 18 Oct 2023 16:07:41 +0200 Subject: [PATCH 3/9] Set min java version to 11 for jaxws-3.0-metro-2.2-testing --- .../jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts index 7ac00df018ba..fa432215500b 100644 --- a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts @@ -14,6 +14,10 @@ dependencies { testInstrumentation(project(":instrumentation:jetty:jetty-11.0:javaagent")) } +otelJava { + minJavaVersionSupported.set(JavaVersion.VERSION_11) +} + tasks.withType().configureEach { // required on jdk17 jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED") From bb138f31a671caa5be98835245be052ed3b16fae Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 18 Oct 2023 16:30:21 +0200 Subject: [PATCH 4/9] Set min java version to 17 for jaxws-3.0-metro-2.2-testing because Spring 6 requires Java 17 --- .../jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts index fa432215500b..e0e7bd07cb60 100644 --- a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { } otelJava { - minJavaVersionSupported.set(JavaVersion.VERSION_11) + minJavaVersionSupported.set(JavaVersion.VERSION_17) } tasks.withType().configureEach { From 7f0657c58185d1ee531d304f3ccd09b12dfa708c Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 23 Oct 2023 13:17:03 +0200 Subject: [PATCH 5/9] Simplify Class.forName call --- .../instrumentation/metro/MetroServerSpanNameUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java index cd295d06a51e..32c3b9013619 100644 --- a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java @@ -62,7 +62,7 @@ private void registerHttpServletRequestAdapter( try { adapter = new HttpServletRequestAdapter( - Class.forName(httpServletRequestClassName, true, getClass().getClassLoader())); + Class.forName(httpServletRequestClassName)); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { // Ignore. Don't register return; From 1d99c27a983247f4bf322a47e8e7fc50358380aa Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 23 Oct 2023 13:26:55 +0200 Subject: [PATCH 6/9] fix formatting --- .../instrumentation/metro/MetroServerSpanNameUpdater.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java index 32c3b9013619..181c4a7d0ae9 100644 --- a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/metro/MetroServerSpanNameUpdater.java @@ -60,9 +60,7 @@ private void registerHttpServletRequestAdapter( String name, String key, String httpServletRequestClassName) { HttpServletRequestAdapter adapter; try { - adapter = - new HttpServletRequestAdapter( - Class.forName(httpServletRequestClassName)); + adapter = new HttpServletRequestAdapter(Class.forName(httpServletRequestClassName)); } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException e) { // Ignore. Don't register return; From 74344a22965c9369586a5255cfc51e98e77e3620 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 23 Oct 2023 15:49:10 +0200 Subject: [PATCH 7/9] Optimize dependencies for jaxws-metro testing --- .../jaxws/jaxws-2.0-common-testing/build.gradle.kts | 4 ---- .../jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts | 4 ++-- .../jaxws/jaxws-3.0-common-testing/build.gradle.kts | 4 ---- .../jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts | 4 ++-- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts index b3d89f72b792..607effb0c6c1 100644 --- a/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-2.0-common-testing/build.gradle.kts @@ -14,10 +14,6 @@ dependencies { api("javax.xml.ws:jaxws-api:2.0") api("javax.jws:javax.jws-api:1.1") - api("ch.qos.logback:logback-classic") - api("org.slf4j:log4j-over-slf4j") - api("org.slf4j:jcl-over-slf4j") - api("org.slf4j:jul-to-slf4j") api("org.eclipse.jetty:jetty-webapp:9.4.35.v20201120") api("org.springframework.ws:spring-ws-core:3.0.0.RELEASE") diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts index 9dd6990cf05e..b36fc90fa2bc 100644 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts @@ -3,9 +3,9 @@ plugins { } dependencies { - testImplementation("javax.servlet:javax.servlet-api:3.0.1") - testImplementation("com.sun.xml.ws:jaxws-rt:2.3.6") + testLibrary("com.sun.xml.ws:jaxws-rt:2.2.0.1") + testImplementation("javax.servlet:javax.servlet-api:3.0.1") testImplementation(project(":instrumentation:jaxws:jaxws-2.0-common-testing")) testInstrumentation(project(":instrumentation:jaxws:jaxws-metro-2.2:javaagent")) diff --git a/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts index ecd8f75a5c37..0827852d5c94 100644 --- a/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-3.0-common-testing/build.gradle.kts @@ -14,10 +14,6 @@ dependencies { api("jakarta.xml.ws:jakarta.xml.ws-api:3.0.0") api("jakarta.jws:jakarta.jws-api:3.0.0") - api("ch.qos.logback:logback-classic") - api("org.slf4j:log4j-over-slf4j") - api("org.slf4j:jcl-over-slf4j") - api("org.slf4j:jul-to-slf4j") api("org.eclipse.jetty:jetty-webapp:11.0.17") api("org.springframework.ws:spring-ws-core:4.0.0") diff --git a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts index e0e7bd07cb60..02678cdb140b 100644 --- a/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-3.0-metro-2.2-testing/build.gradle.kts @@ -3,9 +3,9 @@ plugins { } dependencies { - testImplementation("jakarta.servlet:jakarta.servlet-api:5.0.0") - testImplementation("com.sun.xml.ws:jaxws-rt:3.0.0") + testLibrary("com.sun.xml.ws:jaxws-rt:3.0.0") + testImplementation("jakarta.servlet:jakarta.servlet-api:5.0.0") testImplementation(project(":instrumentation:jaxws:jaxws-3.0-common-testing")) testInstrumentation(project(":instrumentation:jaxws:jaxws-metro-2.2:javaagent")) From 80fa373cf3732343f6c3b06e31eb2f67319baced Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 23 Oct 2023 16:12:19 +0200 Subject: [PATCH 8/9] Use streambuffer that works with java 8 for java 8 jaxws test --- .../jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts index b36fc90fa2bc..63229269577b 100644 --- a/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-2.0-metro-2.2-testing/build.gradle.kts @@ -4,6 +4,9 @@ plugins { dependencies { testLibrary("com.sun.xml.ws:jaxws-rt:2.2.0.1") + // early versions of streambuffer depend on latest release of org.jvnet.staxex:stax-ex + // which doesn't work with java 8 + testLibrary("com.sun.xml.stream.buffer:streambuffer:1.4") testImplementation("javax.servlet:javax.servlet-api:3.0.1") testImplementation(project(":instrumentation:jaxws:jaxws-2.0-common-testing")) From a2aeafe37e105665fcad389c6b9cf91cbf988e33 Mon Sep 17 00:00:00 2001 From: Phil Date: Mon, 23 Oct 2023 19:47:14 +0200 Subject: [PATCH 9/9] Remove unnecessary test config from jaxws-metro-2.2 Tests were moved to other submodules, so the test config is no longer needed in jaxws-metro-2.2 --- .../jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts index aebdda4d0f53..a5c19447373d 100644 --- a/instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts +++ b/instrumentation/jaxws/jaxws-metro-2.2/javaagent/build.gradle.kts @@ -24,11 +24,3 @@ dependencies { compileOnly("javax.xml.ws:jaxws-api:2.0") compileOnly("jakarta.xml.ws:jakarta.xml.ws-api:3.0.0") } - -tasks.withType().configureEach { - // required on jdk17 - jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED") - jvmArgs("--add-exports=java.xml/com.sun.org.apache.xerces.internal.jaxp=ALL-UNNAMED") - jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") - jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") -}