From c4ab0f760d1b8bc5797ae13f8f20f99532917080 Mon Sep 17 00:00:00 2001 From: Martin Dindoffer Date: Thu, 18 Apr 2019 15:18:37 +0200 Subject: [PATCH] Exclude $view proxies from JAX-RS instrumentation --- .../JaxRsTransactionNameInstrumentation.java | 1 + ...xRsTransactionNameInstrumentationTest.java | 36 ++++++++++++++++--- 2 files changed, 33 insertions(+), 4 deletions(-) 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 8d8dc845b1..f6970f82e6 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 @@ -104,12 +104,31 @@ 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"); + } + /** * @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); } /** @@ -134,7 +153,6 @@ public interface SuperResourceInterface { @Path("testInterface") public interface ResourceInterfaceWithPath extends SuperResourceInterface { String testMethod(); - } public interface ResourceInterfaceWithoutPath extends SuperResourceInterface { @@ -142,13 +160,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") @@ -156,7 +185,6 @@ public static class ResourceWithPath extends AbstractResourceClassWithoutPath { public String testMethod() { return "ok"; } - } public static class ResourceWithPathOnAbstract extends AbstractResourceClassWithPath {