From 090d28a91c66d0d6b97ece2576c5f26251e45856 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Wed, 9 Mar 2022 10:52:20 +0100 Subject: [PATCH 01/11] minor code cleanup --- .../adapter/JakartaServletApiAdapter.java | 2 +- .../InitServiceNameInstrumentation.java | 9 +++++---- ...nerInitializerServiceNameInstrumentation.java | 8 ++++---- .../SpringServiceNameInstrumentation.java | 16 ++++++++-------- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/adapter/JakartaServletApiAdapter.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/adapter/JakartaServletApiAdapter.java index c2e8369675..51450af92d 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/adapter/JakartaServletApiAdapter.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/adapter/JakartaServletApiAdapter.java @@ -41,7 +41,7 @@ public class JakartaServletApiAdapter implements ServletApiAdapter { - public static final JakartaServletApiAdapter INSTANCE = new JakartaServletApiAdapter(); + private static final JakartaServletApiAdapter INSTANCE = new JakartaServletApiAdapter(); private JakartaServletApiAdapter() { } diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java index cbefb1e257..e57eacdde2 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java @@ -80,14 +80,15 @@ public ElementMatcher getMethodMatcher() { public static class JavaxInitServiceNameInstrumentation extends InitServiceNameInstrumentation { - private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); - @Override public String rootClassNameThatClassloaderCanLoad() { return "javax.servlet.AsyncContext"; } public static class AdviceClass { + + private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); + @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) public static void onEnter(@Advice.Argument(0) @Nullable Object arg) { javax.servlet.ServletContext servletContext; @@ -107,8 +108,6 @@ public static void onEnter(@Advice.Argument(0) @Nullable Object arg) { public static class JakartaInitServiceNameInstrumentation extends InitServiceNameInstrumentation { - private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); - @Override public String rootClassNameThatClassloaderCanLoad() { return "jakarta.servlet.AsyncContext"; @@ -116,6 +115,8 @@ public String rootClassNameThatClassloaderCanLoad() { public static class AdviceClass { + private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); + @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) public static void onEnter(@Advice.Argument(0) @Nullable Object arg) { jakarta.servlet.ServletContext servletContext; diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java index 0c75c8b323..29b5177c92 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java @@ -74,8 +74,6 @@ public ElementMatcher getMethodMatcher() { public static class JavaxInitServiceNameInstrumentation extends ServletContainerInitializerServiceNameInstrumentation { - private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); - @Override public String rootClassNameThatClassloaderCanLoad() { return "javax.servlet.AsyncContext"; @@ -83,6 +81,8 @@ public String rootClassNameThatClassloaderCanLoad() { public static class AdviceClass { + private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); + @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) { if (servletContext instanceof javax.servlet.ServletContext) { @@ -94,8 +94,6 @@ public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) public static class JakartaInitServiceNameInstrumentation extends ServletContainerInitializerServiceNameInstrumentation { - private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); - @Override public String rootClassNameThatClassloaderCanLoad() { return "jakarta.servlet.AsyncContext"; @@ -103,6 +101,8 @@ public String rootClassNameThatClassloaderCanLoad() { public static class AdviceClass { + private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); + @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) { if (servletContext instanceof jakarta.servlet.ServletContext) { diff --git a/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java index f7cd9204d8..f2e01c2887 100644 --- a/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java +++ b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringServiceNameInstrumentation.java @@ -22,6 +22,7 @@ import co.elastic.apm.agent.configuration.ServiceInfo; import co.elastic.apm.agent.servlet.ServletServiceNameHelper; import co.elastic.apm.agent.servlet.adapter.JavaxServletApiAdapter; +import co.elastic.apm.agent.servlet.adapter.ServletApiAdapter; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.NamedElement; import net.bytebuddy.description.method.MethodDescription; @@ -67,6 +68,8 @@ public String getAdviceClassName() { public static class SpringServiceNameAdvice { + private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); + @Advice.OnMethodExit(suppress = Throwable.class, inline = false) public static void afterInitPropertySources(@Advice.This WebApplicationContext applicationContext) { // avoid having two service names for a standalone jar @@ -74,6 +77,7 @@ public static void afterInitPropertySources(@Advice.This WebApplicationContext a if (!ServiceInfo.autoDetected().isMultiServiceContainer()) { return; } + // This method will be called whenever the spring application context is refreshed which may be more than once // // For example, using Tomcat Servlet container, it's called twice with the first not having a ServletContext, @@ -83,14 +87,10 @@ public static void afterInitPropertySources(@Advice.This WebApplicationContext a ServiceInfo fromServletContext = ServiceInfo.empty(); ServletContext servletContext = applicationContext.getServletContext(); if (servletContext != null) { - try { - ClassLoader servletClassloader = servletContext.getClassLoader(); - if (servletClassloader != null) { - classLoader = servletClassloader; - fromServletContext = ServletServiceNameHelper.detectServiceInfo(JavaxServletApiAdapter.get(), servletContext, servletClassloader); - } - } catch (UnsupportedOperationException e) { - // silently ignored + ClassLoader servletClassloader = adapter.getClassLoader(servletContext); + if (servletClassloader != null) { + classLoader = servletClassloader; + fromServletContext = ServletServiceNameHelper.detectServiceInfo(adapter, servletContext, servletClassloader); } } From 7e7e83110f6e00f7346cab30b1e169fec45961b6 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Wed, 9 Mar 2022 10:52:33 +0100 Subject: [PATCH 02/11] fix dep for spring-mvc > servlet plugin --- ...luginClassLoaderRootPackageCustomizer.java | 31 +++++++++++++++++++ ...bci.PluginClassLoaderRootPackageCustomizer | 1 + 2 files changed, 32 insertions(+) create mode 100644 apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringMvcPluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-spring-webmvc-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringMvcPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringMvcPluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..419f72034d --- /dev/null +++ b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/java/co/elastic/apm/agent/springwebmvc/SpringMvcPluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,31 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package co.elastic.apm.agent.springwebmvc; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class SpringMvcPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.servlet"); + } +} diff --git a/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..5647dc8e5a --- /dev/null +++ b/apm-agent-plugins/apm-spring-webmvc-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.springwebmvc.SpringMvcPluginClassLoaderRootPackageCustomizer From 6e8662d87103160cfb88b5239261fb7568f83214 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Wed, 9 Mar 2022 21:39:50 +0100 Subject: [PATCH 03/11] move 'http.client' to 'httpclient' for consistency --- .../agent/httpclient/ApacheHttpAsyncClientInstrumentation.java | 1 - .../apm/agent/httpclient/ApacheHttpClientInstrumentation.java | 1 - .../agent/httpclient/LegacyApacheHttpClientInstrumentation.java | 1 - .../httpclient/helper/HttpAsyncRequestProducerWrapper.java | 2 +- .../asynchttpclient/AbstractAsyncHttpClientInstrumentation.java | 2 +- .../apm/agent/{http/client => httpclient}/HttpClientHelper.java | 2 +- .../agent/{http/client => httpclient}/HttpClientHelperTest.java | 2 +- .../co/elastic/apm/agent/httpclient/HttpClientAdviceHelper.java | 1 - .../apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java | 2 +- .../elastic/apm/agent/okhttp/OkHttp3ClientInstrumentation.java | 2 +- .../apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java | 2 +- .../elastic/apm/agent/okhttp/OkHttpClientInstrumentation.java | 2 +- .../apm/agent/resttemplate/SpringRestTemplateAdvice.java | 2 +- .../agent/urlconnection/HttpUrlConnectionInstrumentation.java | 2 +- .../elastic/apm/agent/vertx/AbstractVertxWebClientHelper.java | 2 +- 15 files changed, 11 insertions(+), 15 deletions(-) rename apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/{http/client => httpclient}/HttpClientHelper.java (98%) rename apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/{http/client => httpclient}/HttpClientHelperTest.java (99%) diff --git a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpAsyncClientInstrumentation.java b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpAsyncClientInstrumentation.java index ff833a7824..50cac22599 100644 --- a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpAsyncClientInstrumentation.java +++ b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpAsyncClientInstrumentation.java @@ -18,7 +18,6 @@ */ package co.elastic.apm.agent.httpclient; -import co.elastic.apm.agent.http.client.HttpClientHelper; import co.elastic.apm.agent.httpclient.helper.ApacheHttpAsyncClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpClientInstrumentation.java b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpClientInstrumentation.java index 27e6e9bfee..29e94cdf3b 100644 --- a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpClientInstrumentation.java +++ b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/ApacheHttpClientInstrumentation.java @@ -18,7 +18,6 @@ */ package co.elastic.apm.agent.httpclient; -import co.elastic.apm.agent.http.client.HttpClientHelper; import co.elastic.apm.agent.httpclient.helper.RequestHeaderAccessor; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; diff --git a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/LegacyApacheHttpClientInstrumentation.java b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/LegacyApacheHttpClientInstrumentation.java index cc471d953d..807a5aaf4b 100644 --- a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/LegacyApacheHttpClientInstrumentation.java +++ b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/LegacyApacheHttpClientInstrumentation.java @@ -18,7 +18,6 @@ */ package co.elastic.apm.agent.httpclient; -import co.elastic.apm.agent.http.client.HttpClientHelper; import co.elastic.apm.agent.httpclient.helper.RequestHeaderAccessor; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; diff --git a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/helper/HttpAsyncRequestProducerWrapper.java b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/helper/HttpAsyncRequestProducerWrapper.java index 641d31ff0d..87f074f0c2 100644 --- a/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/helper/HttpAsyncRequestProducerWrapper.java +++ b/apm-agent-plugins/apm-apache-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/helper/HttpAsyncRequestProducerWrapper.java @@ -18,7 +18,7 @@ */ package co.elastic.apm.agent.httpclient.helper; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Span; import co.elastic.apm.agent.impl.transaction.TraceContext; diff --git a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AbstractAsyncHttpClientInstrumentation.java b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AbstractAsyncHttpClientInstrumentation.java index 465ba8e1e9..170267d3df 100644 --- a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AbstractAsyncHttpClientInstrumentation.java +++ b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AbstractAsyncHttpClientInstrumentation.java @@ -20,7 +20,7 @@ import co.elastic.apm.agent.bci.TracerAwareInstrumentation; import co.elastic.apm.agent.collections.WeakConcurrentProviderImpl; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.ElasticApmTracer; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; diff --git a/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java b/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/httpclient/HttpClientHelper.java similarity index 98% rename from apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java rename to apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/httpclient/HttpClientHelper.java index f1b6d1f7be..6aa657d7c3 100644 --- a/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/http/client/HttpClientHelper.java +++ b/apm-agent-plugins/apm-httpclient-core/src/main/java/co/elastic/apm/agent/httpclient/HttpClientHelper.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package co.elastic.apm.agent.http.client; +package co.elastic.apm.agent.httpclient; import co.elastic.apm.agent.impl.context.Destination; import co.elastic.apm.agent.impl.transaction.AbstractSpan; diff --git a/apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/http/client/HttpClientHelperTest.java b/apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/httpclient/HttpClientHelperTest.java similarity index 99% rename from apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/http/client/HttpClientHelperTest.java rename to apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/httpclient/HttpClientHelperTest.java index d27573a960..3c93b764ee 100644 --- a/apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/http/client/HttpClientHelperTest.java +++ b/apm-agent-plugins/apm-httpclient-core/src/test/java/co/elastic/apm/agent/httpclient/HttpClientHelperTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package co.elastic.apm.agent.http.client; +package co.elastic.apm.agent.httpclient; import co.elastic.apm.agent.AbstractInstrumentationTest; import co.elastic.apm.agent.impl.context.Destination; diff --git a/apm-agent-plugins/apm-jdk-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/HttpClientAdviceHelper.java b/apm-agent-plugins/apm-jdk-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/HttpClientAdviceHelper.java index 033ee9c49e..abdfa7f46b 100644 --- a/apm-agent-plugins/apm-jdk-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/HttpClientAdviceHelper.java +++ b/apm-agent-plugins/apm-jdk-httpclient-plugin/src/main/java/co/elastic/apm/agent/httpclient/HttpClientAdviceHelper.java @@ -18,7 +18,6 @@ */ package co.elastic.apm.agent.httpclient; -import co.elastic.apm.agent.http.client.HttpClientHelper; import co.elastic.apm.agent.impl.GlobalTracer; import co.elastic.apm.agent.impl.Tracer; import co.elastic.apm.agent.impl.transaction.AbstractSpan; diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java index 1c4966c42f..712787697d 100644 --- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java +++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientAsyncInstrumentation.java @@ -18,7 +18,7 @@ */ package co.elastic.apm.agent.okhttp; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientInstrumentation.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientInstrumentation.java index c255285462..05bd8a643f 100644 --- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientInstrumentation.java +++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3ClientInstrumentation.java @@ -18,7 +18,7 @@ */ package co.elastic.apm.agent.okhttp; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java index edc210c2f8..fe24707eea 100644 --- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java +++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientAsyncInstrumentation.java @@ -18,7 +18,7 @@ */ package co.elastic.apm.agent.okhttp; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientInstrumentation.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientInstrumentation.java index a12e15796a..916692350c 100644 --- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientInstrumentation.java +++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttpClientInstrumentation.java @@ -18,7 +18,7 @@ */ package co.elastic.apm.agent.okhttp; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java index 8b732ea584..15bdde6228 100644 --- a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java +++ b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/SpringRestTemplateAdvice.java @@ -19,7 +19,7 @@ package co.elastic.apm.agent.resttemplate; import co.elastic.apm.agent.bci.TracerAwareInstrumentation; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/HttpUrlConnectionInstrumentation.java b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/HttpUrlConnectionInstrumentation.java index 22016ac984..370b38b2fa 100644 --- a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/HttpUrlConnectionInstrumentation.java +++ b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/HttpUrlConnectionInstrumentation.java @@ -20,7 +20,7 @@ import co.elastic.apm.agent.bci.TracerAwareInstrumentation; import co.elastic.apm.agent.collections.WeakConcurrentProviderImpl; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; diff --git a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebClientHelper.java b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebClientHelper.java index 5ce9bea19c..24ff54fd64 100644 --- a/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebClientHelper.java +++ b/apm-agent-plugins/apm-vertx/apm-vertx-common/src/main/java/co/elastic/apm/agent/vertx/AbstractVertxWebClientHelper.java @@ -18,7 +18,7 @@ */ package co.elastic.apm.agent.vertx; -import co.elastic.apm.agent.http.client.HttpClientHelper; +import co.elastic.apm.agent.httpclient.HttpClientHelper; import co.elastic.apm.agent.impl.transaction.AbstractSpan; import co.elastic.apm.agent.impl.transaction.Outcome; import co.elastic.apm.agent.impl.transaction.Span; From 58789c409f88e3c8c7165d8bd7dbb7c60ebc1487 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Wed, 9 Mar 2022 21:40:37 +0100 Subject: [PATCH 04/11] implement test to prevent similar issue --- .../co/elastic/apm/agent/PackagingTest.java | 310 ++++++++++++++++-- 1 file changed, 277 insertions(+), 33 deletions(-) diff --git a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java index ebe5d0971c..ba3b3d783a 100644 --- a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java +++ b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java @@ -18,83 +18,327 @@ */ package co.elastic.apm.agent; +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.codehaus.plexus.util.xml.pull.XmlPullParserException; import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.annotation.Nullable; import java.io.IOException; +import java.io.Reader; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.Comparator; -import java.util.HashSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Set; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; public class PackagingTest { + private static final Logger log = LoggerFactory.getLogger(PackagingTest.class); + + private static final Path MODULE_ROOT = getModuleRoot(); + private static final int MAX_DEPTH = 99; + @Test - void checkPluginDependencies() throws Exception { - // search for all known META-INF/services files + void checkPluginDependencies() { + Set pluginArtifactIds = getAgentPluginModules().values().stream() + .filter(AgentModule::isPlugin) + .map(m -> m.mavenArtifactId) + .collect(Collectors.toSet()); + checkContainsPluginAsDependencies(MODULE_ROOT.resolve("pom.xml"), pluginArtifactIds); + } - Path classLocation = Paths.get(PackagingTest.class.getProtectionDomain().getCodeSource().getLocation().toURI()); + @Test + void checkPluginInterdependencies() { - Path moduleRoot = classLocation.getParent().getParent(); - assertThat(moduleRoot).isDirectory(); + Map plugins = getAgentPlugins(); + Map modules = getAgentPluginModules(); - // compute the list of all plugin classes by scanning service loader files from filesystem - Path pluginsModulePath = moduleRoot.getParent().resolve("apm-agent-plugins"); - Set serviceLoaderFiles = Files.find(pluginsModulePath, 10, (path, attributes) -> { - Path fileFolder = path.getParent(); - return Files.isRegularFile(path) && fileFolder.endsWith(Path.of("src", "main", "resources", "META-INF", "services")); - }) - .collect(Collectors.toSet()); + plugins.values().forEach(plugin -> { - Set pluginArtifacts = new HashSet<>(); - serviceLoaderFiles.forEach(path -> { - Path pluginRoot = path.getParent().getParent().getParent().getParent().getParent().getParent(); - String pluginArtifact = getArtifactId(pluginRoot.resolve("pom.xml")); - pluginArtifacts.add(pluginArtifact); - }); + Set dependencies = plugin.getInternalDependencies().stream() + .filter(d->!d.equals("apm-agent-core")) // filter-out explicit dependencies to apm-agent-core + .filter(d->!d.equals("apm-httpclient-core")) // TODO : ignore this known issue for now + .filter(d->!d.equals("apm-redis-common")) // TODO : known case where it's OK + .filter(d->!d.equals("apm-cassandra-core-plugin")) // TODO : known case where it's OK + .filter(d->!d.equals("apm-log-shader-plugin-common")) // TODO : known case fixed by another PR + .map(modules::get) + .collect(Collectors.toSet()); - assertThat(pluginArtifacts).isNotEmpty(); - checkContainsPluginAsDependencies(moduleRoot.resolve("pom.xml"), pluginArtifacts); + for (AgentModule dep : dependencies) { + log.info("checking dependency from plugin '{}' to module '{}'", plugin.mavenArtifactId, dep.mavenArtifactId); + + if (plugin.basePackage.equals(dep.basePackage)) { + log.info("plugin '{}' with base package '{}' depends on module '{}' that have same base package", plugin.mavenArtifactId, plugin.basePackage, dep.mavenArtifactId); + } else { + log.info("plugin '{}' with base package '{}' depends on module '{}' with base package '{}'", plugin.mavenArtifactId, plugin.basePackage, dep.mavenArtifactId, dep.basePackage); + + Collection depRootPackages = dep.getClassloaderRootPackages(); + if (depRootPackages.isEmpty()) { + // dependency is loaded in the bootstrap CL, thus it is always visible to the plugin + log.info("dependency '{}' is loaded in the bootstrap CL, thus it is always visible to the '{}' plugin", dep.mavenArtifactId, plugin.mavenArtifactId); + } else if (plugin.getClassloaderRootPackages().contains(dep.basePackage)) { + log.info("dependency '{}' is accessible to plugin '{}' through classloader root customization", dep.mavenArtifactId, plugin.mavenArtifactId); + } else { + fail("dependency '%s' base package '%s' is NOT accessible to plugin '%s', using a PluginClassLoaderRootPackageCustomizer in plugin is required", dep.mavenArtifactId, dep.basePackage, plugin.mavenArtifactId); + } + + } + } + + }); + } - private static String getArtifactId(Path pomPath) { - MavenXpp3Reader reader = new MavenXpp3Reader(); + private static Map getAgentPluginModules() { + // search for all maven submodules within the plugins directory + + Path pluginsModulePath = MODULE_ROOT.getParent().resolve("apm-agent-plugins"); + Set pomFiles; + try { - Model model = reader.read(Files.newBufferedReader(pomPath)); - return model.getArtifactId(); - } catch (IOException | XmlPullParserException e) { + pomFiles = Files.find(pluginsModulePath, MAX_DEPTH, + (path, attributes) -> path.getFileName().toString().equals("pom.xml")) + .collect(Collectors.toSet()); + } catch (IOException e) { throw new IllegalStateException(e); } + + Map modules = new HashMap<>(); + pomFiles.forEach(f->{ + Model pom = parseMaven(f); + String packaging = pom.getPackaging(); + + // only include real code dependencies, pom modules can be ignored + if (packaging == null || packaging.equals("jar")) { + modules.put(pom.getArtifactId(), new AgentModule(f.getParent())); + } + }); + return modules; } - private static void checkContainsPluginAsDependencies(Path pomPath, Set plugins) { - assertThat(pomPath).isRegularFile(); + private static Map getAgentPlugins() { + // search for all known META-INF/services files - MavenXpp3Reader reader = new MavenXpp3Reader(); + // compute the list of all plugin classes by scanning service loader files from filesystem + Path pluginsModulePath = MODULE_ROOT.getParent().resolve("apm-agent-plugins"); + Set serviceLoaderFiles; + + Path servicesSuffix = Path.of("src", "main", "resources", "META-INF", "services"); try { - Model model = reader.read(Files.newBufferedReader(pomPath)); - Set dependenciesArtifacts = model.getDependencies().stream() - .filter(d -> sameProjectGroup(model, d) && sameProjectVersion(model, d)) + serviceLoaderFiles = Files.find(pluginsModulePath, MAX_DEPTH, + (path, attributes) -> Files.isRegularFile(path) && path.getParent().endsWith(servicesSuffix)) + .collect(Collectors.toSet()); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + Map plugins = serviceLoaderFiles.stream() + .map(path -> path.getParent().getParent().getParent().getParent().getParent().getParent()) + .collect(Collectors.toSet()) + .stream() + .map(AgentModule::new) + .collect(Collectors.toMap(p -> p.mavenArtifactId, p -> p)); + + assertThat(plugins).isNotEmpty(); + return plugins; + } + + /** + * Represents a Java agent module, either a plugin or an internal dependency + */ + private static class AgentModule { + private final Path rootFolder; + private final Model mavenModel; + private final String mavenGroupId; + private final String mavenArtifactId; + + @Nullable + private final String basePackage; + + private AgentModule(Path rootFolder) { + this.rootFolder = rootFolder.toAbsolutePath(); + this.mavenModel = parseMaven(rootFolder.resolve("pom.xml")); + this.mavenArtifactId = mavenModel.getArtifactId(); + this.basePackage = getBasePackage(rootFolder); + + // verify module invariants & store effective groupID + String groupId = mavenModel.getGroupId(); + if (groupId == null) { + assertThat(mavenModel.getParent()).isNotNull(); + groupId = mavenModel.getParent().getGroupId(); + } + this.mavenGroupId = groupId; + assertThat(groupId) + .isEqualTo("co.elastic.apm"); + } + + public boolean isPlugin() { + try { + Path servicesFolder = getServicesFolder(); + return servicesFolder != null && Files.list(servicesFolder).count() > 0; + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + public boolean hasCode() { + return basePackage != null; + } + + public Collection getClassloaderRootPackages() { + Path servicesFolder = getServicesFolder(); + if (servicesFolder != null) { + Path customizerService = servicesFolder.resolve(PluginClassLoaderRootPackageCustomizer.class.getName()); + if (Files.exists(customizerService)) { + try { + List lines = Files.readAllLines(customizerService); + assertThat(lines).describedAs("only a single root package customizer expected").hasSize(1); + PluginClassLoaderRootPackageCustomizer customizer = (PluginClassLoaderRootPackageCustomizer) Class.forName(lines.get(0), true, PackagingTest.class.getClassLoader()).getConstructor().newInstance(); + return customizer.pluginClassLoaderRootPackages(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + } + return Collections.singleton(basePackage); + } + + @Nullable + private Path getServicesFolder() { + Path servicesFolder = rootFolder.resolve(Path.of("src", "main", "resources", "META-INF", "services")); + return Files.isDirectory(servicesFolder) ? servicesFolder : null; + } + + public Set getInternalDependencies() { + return mavenModel.getDependencies() + .stream() + .filter(d -> getGroupId(d).equals(mavenGroupId)) + .filter(d -> d.getScope() == null || !d.getScope().equals("test")) .map(Dependency::getArtifactId) .collect(Collectors.toSet()); + } + + private String getGroupId(Dependency d) { + String groupId = d.getGroupId(); + return groupId.equals("${project.groupId}") ? mavenGroupId : groupId; + } + - assertThat(dependenciesArtifacts).describedAs(createDescription(plugins)).containsAll(plugins); + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AgentModule that = (AgentModule) o; + return rootFolder.equals(that.rootFolder); + } + + @Override + public int hashCode() { + return Objects.hash(rootFolder); + } + + @Override + public String toString() { + return "AgentPlugin{" + + "rootFolder=" + rootFolder + + ", mavenArtifactId='" + mavenArtifactId + '\'' + + ", basePackage='" + basePackage + '\'' + + '}'; + } + } + + private static Model parseMaven(Path pomPath) { + MavenXpp3Reader reader = new MavenXpp3Reader(); + try (Reader r = Files.newBufferedReader(pomPath)) { + return reader.read(r); } catch (IOException | XmlPullParserException e) { throw new IllegalStateException(e); } } + @Nullable + private static String getBasePackage(Path pluginRoot) { + Path javaSources = pluginRoot.resolve("src").resolve("main").resolve("java"); + + if (!Files.isDirectory(javaSources)) { + // no java sources, it s a test module + return null; + } + + Path expectedPrefix = javaSources.resolve("co").resolve("elastic").resolve("apm").resolve("agent"); + AtomicReference pluginSubPackage = new AtomicReference<>(); + + try { + Files.find(javaSources, MAX_DEPTH, (path, attributes) -> + Files.isRegularFile(path) + && !path.getFileName().toString().equals("module-info.java") + && path.getFileName().toString().endsWith(".java")) + .forEach(p -> { + assertThat(p) + .describedAs("unexpected plugin file location '%s' should be in '%s", p, expectedPrefix) + .startsWith(expectedPrefix); + + Path relativePath = expectedPrefix.relativize(p); + String subPackage = relativePath.getName(0).toString(); + if (null == pluginSubPackage.get()) { + pluginSubPackage.set(subPackage); + } else { + assertThat(subPackage).isEqualTo(pluginSubPackage.get()); + } + }); + } catch (IOException e) { + throw new IllegalStateException(e); + } + + assertThat(pluginSubPackage.get()).isNotNull(); + return String.format("co.elastic.apm.agent.%s", pluginSubPackage.get()); + } + + private static Path getModuleRoot() { + Path classLocation; + try { + classLocation = Paths.get(PackagingTest.class.getProtectionDomain().getCodeSource().getLocation().toURI()); + } catch (URISyntaxException e) { + throw new IllegalStateException(e); + } + Path moduleRoot = classLocation.getParent().getParent(); + assertThat(moduleRoot).isDirectory(); + return moduleRoot; + } + + private static void checkContainsPluginAsDependencies(Path pomPath, Set plugins) { + assertThat(pomPath).isRegularFile(); + + Model model = parseMaven(pomPath); + Set dependenciesArtifacts = model.getDependencies().stream() + .filter(d -> sameProjectGroup(model, d) && sameProjectVersion(model, d)) + .map(Dependency::getArtifactId) + .collect(Collectors.toSet()); + + assertThat(dependenciesArtifacts).describedAs(createDescription(plugins)).containsAll(plugins); + + } + private static String createDescription(Set plugins) { StringBuilder sb = new StringBuilder(); From 7cf88dd0eed6e515949b714e8022918b74a09570 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Thu, 10 Mar 2022 16:54:56 +0100 Subject: [PATCH 05/11] slightly improve test --- .../co/elastic/apm/agent/PackagingTest.java | 75 ++++++------------- 1 file changed, 23 insertions(+), 52 deletions(-) diff --git a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java index ba3b3d783a..804d1da204 100644 --- a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java +++ b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java @@ -38,13 +38,13 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; @@ -58,27 +58,28 @@ public class PackagingTest { @Test void checkPluginDependencies() { - Set pluginArtifactIds = getAgentPluginModules().values().stream() + Set pluginArtifactIds = getAgentPluginModules() .filter(AgentModule::isPlugin) .map(m -> m.mavenArtifactId) .collect(Collectors.toSet()); + checkContainsPluginAsDependencies(MODULE_ROOT.resolve("pom.xml"), pluginArtifactIds); } @Test void checkPluginInterdependencies() { - Map plugins = getAgentPlugins(); - Map modules = getAgentPluginModules(); + Stream plugins = getAgentPluginModules().filter(AgentModule::isPlugin); + Map modules = getAgentPluginModules().collect(Collectors.toMap(m -> m.mavenArtifactId, m -> m)); - plugins.values().forEach(plugin -> { + plugins.forEach(plugin -> { Set dependencies = plugin.getInternalDependencies().stream() - .filter(d->!d.equals("apm-agent-core")) // filter-out explicit dependencies to apm-agent-core - .filter(d->!d.equals("apm-httpclient-core")) // TODO : ignore this known issue for now - .filter(d->!d.equals("apm-redis-common")) // TODO : known case where it's OK - .filter(d->!d.equals("apm-cassandra-core-plugin")) // TODO : known case where it's OK - .filter(d->!d.equals("apm-log-shader-plugin-common")) // TODO : known case fixed by another PR + .filter(d -> !d.equals("apm-agent-core")) // filter-out explicit dependencies to apm-agent-core + .filter(d -> !d.equals("apm-httpclient-core")) // TODO : ignore this known issue for now + .filter(d -> !d.equals("apm-redis-common")) // TODO : known case where it's OK + .filter(d -> !d.equals("apm-cassandra-core-plugin")) // TODO : known case where it's OK + .filter(d -> !d.equals("apm-log-shader-plugin-common")) // TODO : known case fixed by another PR .map(modules::get) .collect(Collectors.toSet()); @@ -108,58 +109,27 @@ void checkPluginInterdependencies() { } - private static Map getAgentPluginModules() { + private static Stream getAgentPluginModules() { // search for all maven submodules within the plugins directory Path pluginsModulePath = MODULE_ROOT.getParent().resolve("apm-agent-plugins"); - Set pomFiles; + Stream pomStream; try { - pomFiles = Files.find(pluginsModulePath, MAX_DEPTH, + pomStream = Files.find(pluginsModulePath, MAX_DEPTH, (path, attributes) -> path.getFileName().toString().equals("pom.xml")) - .collect(Collectors.toSet()); + .collect(Collectors.toSet()) + .stream(); } catch (IOException e) { throw new IllegalStateException(e); } - Map modules = new HashMap<>(); - pomFiles.forEach(f->{ - Model pom = parseMaven(f); - String packaging = pom.getPackaging(); - + return pomStream + // use an intermediate map entry to keep track of file -> pom association + .map(file -> Map.entry(file, parseMaven(file))) // only include real code dependencies, pom modules can be ignored - if (packaging == null || packaging.equals("jar")) { - modules.put(pom.getArtifactId(), new AgentModule(f.getParent())); - } - }); - return modules; - } - - private static Map getAgentPlugins() { - // search for all known META-INF/services files - - // compute the list of all plugin classes by scanning service loader files from filesystem - Path pluginsModulePath = MODULE_ROOT.getParent().resolve("apm-agent-plugins"); - Set serviceLoaderFiles; - - Path servicesSuffix = Path.of("src", "main", "resources", "META-INF", "services"); - try { - serviceLoaderFiles = Files.find(pluginsModulePath, MAX_DEPTH, - (path, attributes) -> Files.isRegularFile(path) && path.getParent().endsWith(servicesSuffix)) - .collect(Collectors.toSet()); - } catch (IOException e) { - throw new IllegalStateException(e); - } - - Map plugins = serviceLoaderFiles.stream() - .map(path -> path.getParent().getParent().getParent().getParent().getParent().getParent()) - .collect(Collectors.toSet()) - .stream() - .map(AgentModule::new) - .collect(Collectors.toMap(p -> p.mavenArtifactId, p -> p)); - - assertThat(plugins).isNotEmpty(); - return plugins; + .filter(e -> e.getValue().getPackaging() == null || e.getValue().getPackaging().equals("jar")) + .map(e -> new AgentModule(e.getKey().getParent())); } /** @@ -212,7 +182,8 @@ public Collection getClassloaderRootPackages() { try { List lines = Files.readAllLines(customizerService); assertThat(lines).describedAs("only a single root package customizer expected").hasSize(1); - PluginClassLoaderRootPackageCustomizer customizer = (PluginClassLoaderRootPackageCustomizer) Class.forName(lines.get(0), true, PackagingTest.class.getClassLoader()).getConstructor().newInstance(); + Class customizerType = Class.forName(lines.get(0), true, PackagingTest.class.getClassLoader()); + PluginClassLoaderRootPackageCustomizer customizer = (PluginClassLoaderRootPackageCustomizer) customizerType.getConstructor().newInstance(); return customizer.pluginClassLoaderRootPackages(); } catch (Exception e) { throw new IllegalStateException(e); From 4b5949a3211ad5be215521b18eed2665ad95e43c Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Sat, 12 Mar 2022 14:15:23 +0100 Subject: [PATCH 06/11] add CL root package customizer for cross deps --- ...ientPluginClassLoaderRootPackageCustomizer.java | 14 ++++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...dra3PluginClassLoaderRootPackageCustomizer.java | 13 +++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...dra4PluginClassLoaderRootPackageCustomizer.java | 13 +++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...ttp3PluginClassLoaderRootPackageCustomizer.java | 14 ++++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...edisPluginClassLoaderRootPackageCustomizer.java | 14 ++++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...tucePluginClassLoaderRootPackageCustomizer.java | 13 +++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...ssonPluginClassLoaderRootPackageCustomizer.java | 14 ++++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...tionPluginClassLoaderRootPackageCustomizer.java | 14 ++++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + ...tionPluginClassLoaderRootPackageCustomizer.java | 13 +++++++++++++ ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 + .../java/co/elastic/apm/agent/PackagingTest.java | 8 ++------ 19 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer create mode 100644 apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java create mode 100644 apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..4c15c91a7a --- /dev/null +++ b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,14 @@ +package co.elastic.apm.agent.asynchttpclient; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class AsyncHttpClientPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); + } +} diff --git a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..6c3ec05dfe --- /dev/null +++ b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.asynchttpclient.AsyncHttpClientPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..d6c3b33198 --- /dev/null +++ b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,13 @@ +package co.elastic.apm.agent.cassandra3; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class Cassandra3PluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.cassandra"); + } +} diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..c0abbe2c4e --- /dev/null +++ b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.cassandra3.Cassandra3PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..d3c344dc9e --- /dev/null +++ b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,13 @@ +package co.elastic.apm.agent.cassandra4; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class Cassandra4PluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.cassandra"); + } +} diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..bd527fb61c --- /dev/null +++ b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.cassandra4.Cassandra4PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..431340aa96 --- /dev/null +++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,14 @@ +package co.elastic.apm.agent.okhttp; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class OkHttp3PluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); + } +} diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..ec43e2d3fc --- /dev/null +++ b/apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.okhttp.OkHttp3PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..fc1b6a5515 --- /dev/null +++ b/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,14 @@ +package co.elastic.apm.agent.jedis; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class JedisPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.redis"); + } +} diff --git a/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..1d099658b8 --- /dev/null +++ b/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.jedis.JedisPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..8ac023f170 --- /dev/null +++ b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,13 @@ +package co.elastic.apm.agent.lettuce; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class LettucePluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.redis"); + } +} diff --git a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..99ee9fb8a8 --- /dev/null +++ b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.lettuce.LettucePluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..4906ebd54e --- /dev/null +++ b/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,14 @@ +package co.elastic.apm.agent.redisson; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class RedissonPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.redis"); + } +} diff --git a/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..0e89df85be --- /dev/null +++ b/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.redisson.RedissonPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..8da90b7f24 --- /dev/null +++ b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,14 @@ +package co.elastic.apm.agent.resttemplate; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class UrlConnectionPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); + } +} diff --git a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..51c90c792a --- /dev/null +++ b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.resttemplate.UrlConnectionPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java new file mode 100644 index 0000000000..8fc4ef4734 --- /dev/null +++ b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java @@ -0,0 +1,13 @@ +package co.elastic.apm.agent.urlconnection; + +import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; + +import java.util.Arrays; +import java.util.Collection; + +public class UrlConnectionPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { + @Override + public Collection pluginClassLoaderRootPackages() { + return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); + } +} diff --git a/apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer new file mode 100644 index 0000000000..95634893db --- /dev/null +++ b/apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer @@ -0,0 +1 @@ +co.elastic.apm.agent.urlconnection.UrlConnectionPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java index 804d1da204..65569d888e 100644 --- a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java +++ b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java @@ -71,15 +71,11 @@ void checkPluginInterdependencies() { Stream plugins = getAgentPluginModules().filter(AgentModule::isPlugin); Map modules = getAgentPluginModules().collect(Collectors.toMap(m -> m.mavenArtifactId, m -> m)); - plugins.forEach(plugin -> { Set dependencies = plugin.getInternalDependencies().stream() .filter(d -> !d.equals("apm-agent-core")) // filter-out explicit dependencies to apm-agent-core - .filter(d -> !d.equals("apm-httpclient-core")) // TODO : ignore this known issue for now - .filter(d -> !d.equals("apm-redis-common")) // TODO : known case where it's OK - .filter(d -> !d.equals("apm-cassandra-core-plugin")) // TODO : known case where it's OK - .filter(d -> !d.equals("apm-log-shader-plugin-common")) // TODO : known case fixed by another PR + .filter(d -> !d.equals("apm-log-shader-plugin-common")) // TODO : remove this known case when logging refactor PR is merged. .map(modules::get) .collect(Collectors.toSet()); @@ -181,7 +177,7 @@ public Collection getClassloaderRootPackages() { if (Files.exists(customizerService)) { try { List lines = Files.readAllLines(customizerService); - assertThat(lines).describedAs("only a single root package customizer expected").hasSize(1); + assertThat(lines).describedAs("exactly one root package customizer expected in file %s", customizerService).hasSize(1); Class customizerType = Class.forName(lines.get(0), true, PackagingTest.class.getClassLoader()); PluginClassLoaderRootPackageCustomizer customizer = (PluginClassLoaderRootPackageCustomizer) customizerType.getConstructor().newInstance(); return customizer.pluginClassLoaderRootPackages(); From 603596cdea68c1ecc7617b3103377f8ffd357651 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Mon, 14 Mar 2022 10:25:27 +0100 Subject: [PATCH 07/11] simplify the http-client case --- ...ientPluginClassLoaderRootPackageCustomizer.java | 14 -------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...ttp3PluginClassLoaderRootPackageCustomizer.java | 14 -------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...tionPluginClassLoaderRootPackageCustomizer.java | 14 -------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...tionPluginClassLoaderRootPackageCustomizer.java | 13 ------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - .../java/co/elastic/apm/agent/PackagingTest.java | 6 ++++++ 9 files changed, 6 insertions(+), 59 deletions(-) delete mode 100644 apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index 4c15c91a7a..0000000000 --- a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/java/co/elastic/apm/agent/asynchttpclient/AsyncHttpClientPluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,14 +0,0 @@ -package co.elastic.apm.agent.asynchttpclient; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class AsyncHttpClientPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); - } -} diff --git a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index 6c3ec05dfe..0000000000 --- a/apm-agent-plugins/apm-asynchttpclient-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.asynchttpclient.AsyncHttpClientPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index 431340aa96..0000000000 --- a/apm-agent-plugins/apm-okhttp-plugin/src/main/java/co/elastic/apm/agent/okhttp/OkHttp3PluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,14 +0,0 @@ -package co.elastic.apm.agent.okhttp; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class OkHttp3PluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); - } -} diff --git a/apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index ec43e2d3fc..0000000000 --- a/apm-agent-plugins/apm-okhttp-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.okhttp.OkHttp3PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index 8da90b7f24..0000000000 --- a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/java/co/elastic/apm/agent/resttemplate/UrlConnectionPluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,14 +0,0 @@ -package co.elastic.apm.agent.resttemplate; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class UrlConnectionPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); - } -} diff --git a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index 51c90c792a..0000000000 --- a/apm-agent-plugins/apm-spring-resttemplate/apm-spring-resttemplate-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.resttemplate.UrlConnectionPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index 8fc4ef4734..0000000000 --- a/apm-agent-plugins/apm-urlconnection-plugin/src/main/java/co/elastic/apm/agent/urlconnection/UrlConnectionPluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,13 +0,0 @@ -package co.elastic.apm.agent.urlconnection; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class UrlConnectionPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.httpclient"); - } -} diff --git a/apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index 95634893db..0000000000 --- a/apm-agent-plugins/apm-urlconnection-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.urlconnection.UrlConnectionPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java index 65569d888e..b862a5ec73 100644 --- a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java +++ b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java @@ -92,6 +92,8 @@ void checkPluginInterdependencies() { if (depRootPackages.isEmpty()) { // dependency is loaded in the bootstrap CL, thus it is always visible to the plugin log.info("dependency '{}' is loaded in the bootstrap CL, thus it is always visible to the '{}' plugin", dep.mavenArtifactId, plugin.mavenArtifactId); + } else if (!dep.hasDependencies()) { + log.info("dependency '{}' does not have dependencies, thus it is safe to load from agent or plugin CL", dep.mavenArtifactId); } else if (plugin.getClassloaderRootPackages().contains(dep.basePackage)) { log.info("dependency '{}' is accessible to plugin '{}' through classloader root customization", dep.mavenArtifactId, plugin.mavenArtifactId); } else { @@ -204,6 +206,10 @@ public Set getInternalDependencies() { .collect(Collectors.toSet()); } + public boolean hasDependencies() { + return !mavenModel.getDependencies().isEmpty(); + } + private String getGroupId(Dependency d) { String groupId = d.getGroupId(); return groupId.equals("${project.groupId}") ? mavenGroupId : groupId; From a4e3bf85eb7a17664396704c998f7723193e0daf Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Mon, 14 Mar 2022 12:06:58 +0100 Subject: [PATCH 08/11] post-review changes + simplify further --- .../apm-cassandra-core-plugin/pom.xml | 8 -------- ...dra3PluginClassLoaderRootPackageCustomizer.java | 13 ------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...dra4PluginClassLoaderRootPackageCustomizer.java | 13 ------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...edisPluginClassLoaderRootPackageCustomizer.java | 14 -------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - ...ssonPluginClassLoaderRootPackageCustomizer.java | 14 -------------- ...gent.bci.PluginClassLoaderRootPackageCustomizer | 1 - .../java/co/elastic/apm/agent/PackagingTest.java | 6 +++--- 11 files changed, 3 insertions(+), 70 deletions(-) delete mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer delete mode 100644 apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java delete mode 100644 apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra-core-plugin/pom.xml b/apm-agent-plugins/apm-cassandra/apm-cassandra-core-plugin/pom.xml index dcf994f8e3..a9eb008bcb 100644 --- a/apm-agent-plugins/apm-cassandra/apm-cassandra-core-plugin/pom.xml +++ b/apm-agent-plugins/apm-cassandra/apm-cassandra-core-plugin/pom.xml @@ -14,12 +14,4 @@ ${project.basedir}/../../.. - - - ${project.groupId} - apm-jdbc-plugin - ${project.version} - - - diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index d6c3b33198..0000000000 --- a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/java/co/elastic/apm/agent/cassandra3/Cassandra3PluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,13 +0,0 @@ -package co.elastic.apm.agent.cassandra3; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class Cassandra3PluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.cassandra"); - } -} diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index c0abbe2c4e..0000000000 --- a/apm-agent-plugins/apm-cassandra/apm-cassandra3-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.cassandra3.Cassandra3PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index d3c344dc9e..0000000000 --- a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/java/co/elastic/apm/agent/cassandra4/Cassandra4PluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,13 +0,0 @@ -package co.elastic.apm.agent.cassandra4; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class Cassandra4PluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.cassandra"); - } -} diff --git a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index bd527fb61c..0000000000 --- a/apm-agent-plugins/apm-cassandra/apm-cassandra4-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.cassandra4.Cassandra4PluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index fc1b6a5515..0000000000 --- a/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/java/co/elastic/apm/agent/jedis/JedisPluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,14 +0,0 @@ -package co.elastic.apm.agent.jedis; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class JedisPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.redis"); - } -} diff --git a/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index 1d099658b8..0000000000 --- a/apm-agent-plugins/apm-redis-plugin/apm-jedis-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.jedis.JedisPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index 99ee9fb8a8..0000000000 --- a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.lettuce.LettucePluginClassLoaderRootPackageCustomizer diff --git a/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index 4906ebd54e..0000000000 --- a/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/java/co/elastic/apm/agent/redisson/RedissonPluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,14 +0,0 @@ -package co.elastic.apm.agent.redisson; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class RedissonPluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(), "co.elastic.apm.agent.redis"); - } -} diff --git a/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer b/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer deleted file mode 100644 index 0e89df85be..0000000000 --- a/apm-agent-plugins/apm-redis-plugin/apm-redisson-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer +++ /dev/null @@ -1 +0,0 @@ -co.elastic.apm.agent.redisson.RedissonPluginClassLoaderRootPackageCustomizer diff --git a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java index b862a5ec73..13cfe78b4e 100644 --- a/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java +++ b/apm-agent/src/test/java/co/elastic/apm/agent/PackagingTest.java @@ -92,7 +92,7 @@ void checkPluginInterdependencies() { if (depRootPackages.isEmpty()) { // dependency is loaded in the bootstrap CL, thus it is always visible to the plugin log.info("dependency '{}' is loaded in the bootstrap CL, thus it is always visible to the '{}' plugin", dep.mavenArtifactId, plugin.mavenArtifactId); - } else if (!dep.hasDependencies()) { + } else if (!dep.hasNonTestDependencies()) { log.info("dependency '{}' does not have dependencies, thus it is safe to load from agent or plugin CL", dep.mavenArtifactId); } else if (plugin.getClassloaderRootPackages().contains(dep.basePackage)) { log.info("dependency '{}' is accessible to plugin '{}' through classloader root customization", dep.mavenArtifactId, plugin.mavenArtifactId); @@ -206,8 +206,8 @@ public Set getInternalDependencies() { .collect(Collectors.toSet()); } - public boolean hasDependencies() { - return !mavenModel.getDependencies().isEmpty(); + public boolean hasNonTestDependencies() { + return mavenModel.getDependencies().stream().anyMatch(d -> !"test".equals(d.getScope())); } private String getGroupId(Dependency d) { From 9453a40eb472249a2f705f7a9fecf04bb94df3bd Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Mon, 14 Mar 2022 12:35:12 +0100 Subject: [PATCH 09/11] remove useless class --- ...ttucePluginClassLoaderRootPackageCustomizer.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java diff --git a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java b/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java deleted file mode 100644 index 8ac023f170..0000000000 --- a/apm-agent-plugins/apm-redis-plugin/apm-lettuce-plugin/src/main/java/co/elastic/apm/agent/lettuce/LettucePluginClassLoaderRootPackageCustomizer.java +++ /dev/null @@ -1,13 +0,0 @@ -package co.elastic.apm.agent.lettuce; - -import co.elastic.apm.agent.bci.PluginClassLoaderRootPackageCustomizer; - -import java.util.Arrays; -import java.util.Collection; - -public class LettucePluginClassLoaderRootPackageCustomizer extends PluginClassLoaderRootPackageCustomizer { - @Override - public Collection pluginClassLoaderRootPackages() { - return Arrays.asList(getPluginPackage(),"co.elastic.apm.agent.redis"); - } -} From 33db7a54d40ec007ad66c8f40895d15781be4a6b Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Mon, 14 Mar 2022 15:22:10 +0100 Subject: [PATCH 10/11] fix changelog duplicated sections --- CHANGELOG.asciidoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 96f8f44bcd..a77d7b3e16 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -37,10 +37,9 @@ endif::[] [float] ===== Performance improvements * Proxy classes are excluded from instrumentation in more cases - {pull}2474[#2474] +* Only time type/method matching if the debug logging is enabled as the results are only used when debug logging is enabled - {pull}2471[#2471] [float] -===== Performance improvements -* Only time type/method matching if the debug logging is enabled as the results are only used when debug logging is enabled - {pull}2471[#2471] [[release-notes-1.x]] === Java Agent version 1.x From c70892cdcdaee0c566e7426b3a276feb2e599a10 Mon Sep 17 00:00:00 2001 From: Sylvain Juge Date: Mon, 14 Mar 2022 15:22:36 +0100 Subject: [PATCH 11/11] add changelog entry --- CHANGELOG.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index a77d7b3e16..853f4651ce 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -40,6 +40,8 @@ endif::[] * Only time type/method matching if the debug logging is enabled as the results are only used when debug logging is enabled - {pull}2471[#2471] [float] +===== Bug fixes +* Fix cross-plugin dependencies triggering NoClassDefFound - {pull}2509[#2509] [[release-notes-1.x]] === Java Agent version 1.x