diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index c5d4cfe1f0..b01bdf5a18 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -34,6 +34,7 @@ Use subheadings with the "=====" level for adding notes for unreleased changes: [float] ===== Bug fixes * Fix JMX metric warning message about unsupported composite value types - {pull}3849[#3849] +* Fix JAX-WS transaction naming for @WebMethod annotated methods - {pull}3850[#3850] [[release-notes-1.x]] === Java Agent version 1.x diff --git a/apm-agent-plugins/apm-jaxws-plugin-jakartaee-test/src/test/java/co/elastic/apm/agent/jaxws/JakartaeeJaxWsTransactionNameInstrumentationTest.java b/apm-agent-plugins/apm-jaxws-plugin-jakartaee-test/src/test/java/co/elastic/apm/agent/jaxws/JakartaeeJaxWsTransactionNameInstrumentationTest.java index b0722501a2..bfc4e058b0 100644 --- a/apm-agent-plugins/apm-jaxws-plugin-jakartaee-test/src/test/java/co/elastic/apm/agent/jaxws/JakartaeeJaxWsTransactionNameInstrumentationTest.java +++ b/apm-agent-plugins/apm-jaxws-plugin-jakartaee-test/src/test/java/co/elastic/apm/agent/jaxws/JakartaeeJaxWsTransactionNameInstrumentationTest.java @@ -18,6 +18,7 @@ */ package co.elastic.apm.agent.jaxws; +import jakarta.jws.WebMethod; import jakarta.jws.WebService; import jakarta.jws.soap.SOAPBinding; import org.junit.jupiter.api.BeforeEach; @@ -42,6 +43,11 @@ public static class HelloWorldServiceImpl implements HelloWorldService { public String sayHello() { return "Hello World"; } + + @WebMethod + public String webMethodAnnotated() { + return "foo bar"; + } } } diff --git a/apm-agent-plugins/apm-jaxws-plugin/src/main/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentation.java b/apm-agent-plugins/apm-jaxws-plugin/src/main/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentation.java index bbb058f055..d822701fc7 100644 --- a/apm-agent-plugins/apm-jaxws-plugin/src/main/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentation.java +++ b/apm-agent-plugins/apm-jaxws-plugin/src/main/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentation.java @@ -18,8 +18,9 @@ */ package co.elastic.apm.agent.jaxws; -import co.elastic.apm.agent.sdk.bytebuddy.SimpleMethodSignatureOffsetMappingFactory.SimpleMethodSignature; import co.elastic.apm.agent.sdk.ElasticApmInstrumentation; +import co.elastic.apm.agent.sdk.bytebuddy.MethodHierarchyMatcher; +import co.elastic.apm.agent.sdk.bytebuddy.SimpleMethodSignatureOffsetMappingFactory.SimpleMethodSignature; import co.elastic.apm.agent.tracer.GlobalTracer; import co.elastic.apm.agent.tracer.Tracer; import co.elastic.apm.agent.tracer.Transaction; @@ -94,13 +95,19 @@ public ElementMatcher.Junction getClassLoaderMatcher() { @Override public ElementMatcher getMethodMatcher() { - return overridesOrImplementsMethodThat( + MethodHierarchyMatcher annotatedMethodMatcher = overridesOrImplementsMethodThat( + isAnnotatedWith( + namedOneOf("javax.jws.WebMethod", "jakarta.jws.WebMethod"))) + .onSuperClassesThat(isInAnyPackage(applicationPackages, ElementMatchers.any())); + + MethodHierarchyMatcher interfaceInheritedMatcher = overridesOrImplementsMethodThat( isPublic().and(isDeclaredBy(isInterface())) ).whereHierarchyContains( isInterface().and(isAnnotatedWith(namedOneOf("javax.jws.WebService", "jakarta.jws.WebService"))) ).onSuperClassesThat( isInAnyPackage(applicationPackages, ElementMatchers.any()) ); + return interfaceInheritedMatcher.or(annotatedMethodMatcher); } @Override diff --git a/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/AbstractJaxWsInstrumentationTest.java b/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/AbstractJaxWsInstrumentationTest.java index 726327e0ab..3e51171431 100644 --- a/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/AbstractJaxWsInstrumentationTest.java +++ b/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/AbstractJaxWsInstrumentationTest.java @@ -41,6 +41,19 @@ void testTransactionName() { assertThat(transaction.getFrameworkName()).isEqualTo("JAX-WS"); } + + @Test + void testTransactionNameForWebMethod() throws Exception { + final TransactionImpl transaction = tracer.startRootTransaction(getClass().getClassLoader()); + try (Scope scope = transaction.activateInScope()) { + helloWorldService.getClass().getMethod("webMethodAnnotated").invoke(helloWorldService); + } finally { + transaction.end(); + } + assertThat(transaction.getNameAsString()).isEqualTo("HelloWorldServiceImpl#webMethodAnnotated"); + assertThat(transaction.getFrameworkName()).isEqualTo("JAX-WS"); + } + public interface BaseHelloWorldService { String sayHello(); } diff --git a/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentationTest.java b/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentationTest.java index 913c65064c..242238ba44 100644 --- a/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentationTest.java +++ b/apm-agent-plugins/apm-jaxws-plugin/src/test/java/co/elastic/apm/agent/jaxws/JaxWsTransactionNameInstrumentationTest.java @@ -47,6 +47,11 @@ public static class HelloWorldServiceImpl implements HelloWorldService { public String sayHello() { return "Hello World"; } + + @WebMethod + public String webMethodAnnotated() { + return "foo bar"; + } } }