diff --git a/apm-agent-plugins/apm-jaxrs-plugin/src/main/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentation.java b/apm-agent-plugins/apm-jaxrs-plugin/src/main/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentation.java index 296b5e3c03..bd10a2555d 100644 --- a/apm-agent-plugins/apm-jaxrs-plugin/src/main/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentation.java +++ b/apm-agent-plugins/apm-jaxrs-plugin/src/main/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentation.java @@ -81,6 +81,7 @@ public ElementMatcher getTypeMatcher() { if (configuration.isEnableJaxrsAnnotationInheritance()) { return not(isInterface()) .and(not(ElementMatchers.nameContains("$Proxy"))) + .and(not(ElementMatchers.nameContains("$view"))) .and(isAnnotatedWith(named("javax.ws.rs.Path")) .or(hasSuperType(isAnnotatedWith(named("javax.ws.rs.Path")))) ); diff --git a/apm-agent-plugins/apm-jaxrs-plugin/src/test/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentationTest.java b/apm-agent-plugins/apm-jaxrs-plugin/src/test/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentationTest.java index 5057e3b6cc..e92080e134 100644 --- a/apm-agent-plugins/apm-jaxrs-plugin/src/test/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentationTest.java +++ b/apm-agent-plugins/apm-jaxrs-plugin/src/test/java/co/elastic/apm/agent/jaxrs/JaxRsTransactionNameInstrumentationTest.java @@ -106,6 +106,20 @@ public void testJaxRsTransactionNameWithJaxrsAnnotationInheritance() { assertThat(actualTransactions.get(2).getName().toString()).isEqualTo("ResourceWithPathOnAbstract#testMethod"); } + @Test + public void testProxyClassInstrumentationExclusion() { + when(config.getConfig(JaxRsConfiguration.class).isEnableJaxrsAnnotationInheritance()).thenReturn(true); + ElasticApmAgent.initInstrumentation(tracer, ByteBuddyAgent.install()); + + doRequest("testViewProxy"); + doRequest("testProxyProxy"); + + List actualTransactions = reporter.getTransactions(); + assertThat(actualTransactions).hasSize(2); + assertThat(actualTransactions.get(0).getName().toString()).isEqualTo("unnamed"); + assertThat(actualTransactions.get(1).getName().toString()).isEqualTo("unnamed"); + } + @Test public void testJaxRsTransactionNameNonSampledTransactions() throws IOException { config.getConfig(CoreConfiguration.class).getSampleRate().update(0.0, SpyConfiguration.CONFIG_SOURCE_NAME); @@ -121,8 +135,13 @@ public void testJaxRsTransactionNameNonSampledTransactions() throws IOException /** * @return configuration for the jersey test server. Includes all resource classes in the co.elastic.apm.agent.jaxrs.resources package. */ + @Override protected Application configure() { - return new ResourceConfig(ResourceWithPath.class, ResourceWithPathOnInterface.class, ResourceWithPathOnAbstract.class); + return new ResourceConfig(ResourceWithPath.class, + ResourceWithPathOnInterface.class, + ResourceWithPathOnAbstract.class, + ProxiedClass$view.class, + ProxiedClass$Proxy.class); } /** @@ -147,7 +166,6 @@ public interface SuperResourceInterface { @Path("testInterface") public interface ResourceInterfaceWithPath extends SuperResourceInterface { String testMethod(); - } public interface ResourceInterfaceWithoutPath extends SuperResourceInterface { @@ -155,13 +173,24 @@ public interface ResourceInterfaceWithoutPath extends SuperResourceInterface { } public abstract static class AbstractResourceClassWithoutPath implements ResourceInterfaceWithoutPath { - } @Path("testAbstract") public abstract static class AbstractResourceClassWithPath implements ResourceInterfaceWithoutPath { + } + @Path("testViewProxy") + public static class ProxiedClass$view implements SuperResourceInterface { + public String testMethod() { + return "ok"; + } + } + @Path("testProxyProxy") + public static class ProxiedClass$Proxy implements SuperResourceInterface { + public String testMethod() { + return "ok"; + } } @Path("test") @@ -169,7 +198,6 @@ public static class ResourceWithPath extends AbstractResourceClassWithoutPath { public String testMethod() { return "ok"; } - } public static class ResourceWithPathOnAbstract extends AbstractResourceClassWithPath {