From 35deeaf5f017591b140de85f3fe18b469ec552ca Mon Sep 17 00:00:00 2001 From: Tobias Stadler Date: Sat, 5 Feb 2022 09:32:47 +0100 Subject: [PATCH 1/3] Added Instrumentation for `ServletContainerInitializer#onStartup` --- .../InitServiceNameInstrumentation2.java | 112 ++++++++++++++++++ ...ic.apm.agent.sdk.ElasticApmInstrumentation | 2 + .../InitServiceNameInstrumentationTest.java | 22 ++++ 3 files changed, 136 insertions(+) create mode 100644 apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java new file mode 100644 index 0000000000..6c426b007a --- /dev/null +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java @@ -0,0 +1,112 @@ +/* + * 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.servlet; + +import co.elastic.apm.agent.servlet.adapter.JakartaServletApiAdapter; +import co.elastic.apm.agent.servlet.adapter.JavaxServletApiAdapter; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.description.NamedElement; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +import javax.annotation.Nullable; +import java.util.Set; + +import static net.bytebuddy.matcher.ElementMatchers.hasSuperType; +import static net.bytebuddy.matcher.ElementMatchers.isInterface; +import static net.bytebuddy.matcher.ElementMatchers.nameContains; +import static net.bytebuddy.matcher.ElementMatchers.nameEndsWith; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; +import static net.bytebuddy.matcher.ElementMatchers.not; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +/** + * Instruments + * + *

+ * Determines the service name based on the webapp's {@code META-INF/MANIFEST.MF} file early in the startup process. + * As this doesn't work with runtime attachment, the service name is also determined when the first request comes in. + */ +public abstract class InitServiceNameInstrumentation2 extends AbstractServletInstrumentation { + + @Override + public ElementMatcher getTypeMatcherPreFilter() { + return nameContains("Initializer"); + } + + @Override + public ElementMatcher getTypeMatcher() { + return not(isInterface()).and(hasSuperType(namedOneOf( + "javax.servlet.ServletContainerInitializer", "jakarta.servlet.ServletContainerInitializer"))); + } + + @Override + public ElementMatcher getMethodMatcher() { + return named("onStartup") + .and(takesArguments(2)) + .and(takesArgument(0, Set.class)) + .and(takesArgument(1, nameEndsWith("ServletContext"))); + } + + public static class JavaxInitServiceNameInstrumentation extends InitServiceNameInstrumentation2 { + + private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); + + @Override + public String rootClassNameThatClassloaderCanLoad() { + return "javax.servlet.AsyncContext"; + } + + public static class AdviceClass { + + @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) + public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) { + if (servletContext instanceof javax.servlet.ServletContext) { + ServletServiceNameHelper.determineServiceName(adapter, (javax.servlet.ServletContext) servletContext, tracer); + } + } + } + } + + public static class JakartaInitServiceNameInstrumentation extends InitServiceNameInstrumentation2 { + + private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); + + @Override + public String rootClassNameThatClassloaderCanLoad() { + return "jakarta.servlet.AsyncContext"; + } + + public static class AdviceClass { + + @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) + public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) { + if (servletContext instanceof javax.servlet.ServletContext) { + ServletServiceNameHelper.determineServiceName(adapter, (jakarta.servlet.ServletContext) servletContext, tracer); + } + } + } + } +} diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation b/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation index cb4fab934c..e02db11014 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation @@ -16,3 +16,5 @@ co.elastic.apm.agent.servlet.JavaxRequestStreamRecordingInstrumentation co.elastic.apm.agent.servlet.JakartaRequestStreamRecordingInstrumentation co.elastic.apm.agent.servlet.InitServiceNameInstrumentation$JavaxInitServiceNameInstrumentation co.elastic.apm.agent.servlet.InitServiceNameInstrumentation$JakartaInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.InitServiceNameInstrumentation2$JavaxInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.InitServiceNameInstrumentation2$JakartaInitServiceNameInstrumentation diff --git a/apm-agent-plugins/apm-servlet-plugin/src/test/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentationTest.java b/apm-agent-plugins/apm-servlet-plugin/src/test/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentationTest.java index d70add640d..e5414a459e 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/test/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentationTest.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/test/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentationTest.java @@ -29,6 +29,8 @@ import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.Servlet; +import javax.servlet.ServletContainerInitializer; +import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletException; @@ -36,11 +38,25 @@ import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import java.io.IOException; +import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; class InitServiceNameInstrumentationTest extends AbstractInstrumentationTest { + @Test + void testOnStartup() { + ServletContainerInitializer servletContainerInitializer = new NoopServletContainerInitializer(); + + CustomManifestLoader cl = new CustomManifestLoader(() -> getClass().getResourceAsStream("/TEST-MANIFEST.MF")); + CustomManifestLoader.withThreadContextClassLoader(cl, () -> { + servletContainerInitializer.onStartup(null, new MockServletContext()); + tracer.startRootTransaction(cl).end(); + }); + + assertServiceInfo(); + } + @Test void testContextInitialized() { ServletContextListener servletContextListener = new NoopServletContextListener(); @@ -87,6 +103,12 @@ private void assertServiceInfo() { assertThat(traceContext.getServiceVersion()).isEqualTo("1.42.0"); } + private static class NoopServletContainerInitializer implements ServletContainerInitializer { + @Override + public void onStartup(Set> classes, ServletContext servletContext) { + } + } + private static class NoopServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { From 9204aaaf35b87ebe916fbc919116ecd5a6d5243c Mon Sep 17 00:00:00 2001 From: Tobias Stadler Date: Wed, 9 Feb 2022 18:26:34 +0100 Subject: [PATCH 2/3] Review by @felixbarny --- .../Servlet2PlusInstrumentation.java} | 10 ++++++---- .../Servlet3PlusInstrumentation.java} | 12 +++++++----- ...o.elastic.apm.agent.sdk.ElasticApmInstrumentation | 8 ++++---- 3 files changed, 17 insertions(+), 13 deletions(-) rename apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/{InitServiceNameInstrumentation.java => service_name/Servlet2PlusInstrumentation.java} (94%) rename apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/{InitServiceNameInstrumentation2.java => service_name/Servlet3PlusInstrumentation.java} (91%) diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet2PlusInstrumentation.java similarity index 94% rename from apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation.java rename to apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet2PlusInstrumentation.java index 7238e21be0..3e1f3f78a2 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet2PlusInstrumentation.java @@ -16,8 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -package co.elastic.apm.agent.servlet; +package co.elastic.apm.agent.servlet.service_name; +import co.elastic.apm.agent.servlet.AbstractServletInstrumentation; +import co.elastic.apm.agent.servlet.ServletServiceNameHelper; import co.elastic.apm.agent.servlet.adapter.JakartaServletApiAdapter; import co.elastic.apm.agent.servlet.adapter.JavaxServletApiAdapter; import net.bytebuddy.asm.Advice; @@ -52,7 +54,7 @@ * Determines the service name based on the webapp's {@code META-INF/MANIFEST.MF} file early in the startup process. * As this doesn't work with runtime attachment, the service name is also determined when the first request comes in. */ -public abstract class InitServiceNameInstrumentation extends AbstractServletInstrumentation { +public abstract class Servlet2PlusInstrumentation extends AbstractServletInstrumentation { @Override public ElementMatcher getTypeMatcherPreFilter() { @@ -76,7 +78,7 @@ public ElementMatcher getMethodMatcher() { .and(takesArgument(0, nameEndsWith("ServletContextEvent")))); } - public static class JavaxInitServiceNameInstrumentation extends InitServiceNameInstrumentation { + public static class JavaxInitServiceNameInstrumentation extends Servlet2PlusInstrumentation { private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); @@ -103,7 +105,7 @@ public static void onEnter(@Advice.Argument(0) @Nullable Object arg) { } } - public static class JakartaInitServiceNameInstrumentation extends InitServiceNameInstrumentation { + public static class JakartaInitServiceNameInstrumentation extends Servlet2PlusInstrumentation { private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet3PlusInstrumentation.java similarity index 91% rename from apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java rename to apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet3PlusInstrumentation.java index 6c426b007a..86b132af39 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/InitServiceNameInstrumentation2.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet3PlusInstrumentation.java @@ -16,8 +16,10 @@ * specific language governing permissions and limitations * under the License. */ -package co.elastic.apm.agent.servlet; +package co.elastic.apm.agent.servlet.service_name; +import co.elastic.apm.agent.servlet.AbstractServletInstrumentation; +import co.elastic.apm.agent.servlet.ServletServiceNameHelper; import co.elastic.apm.agent.servlet.adapter.JakartaServletApiAdapter; import co.elastic.apm.agent.servlet.adapter.JavaxServletApiAdapter; import net.bytebuddy.asm.Advice; @@ -49,7 +51,7 @@ * Determines the service name based on the webapp's {@code META-INF/MANIFEST.MF} file early in the startup process. * As this doesn't work with runtime attachment, the service name is also determined when the first request comes in. */ -public abstract class InitServiceNameInstrumentation2 extends AbstractServletInstrumentation { +public abstract class Servlet3PlusInstrumentation extends AbstractServletInstrumentation { @Override public ElementMatcher getTypeMatcherPreFilter() { @@ -70,7 +72,7 @@ public ElementMatcher getMethodMatcher() { .and(takesArgument(1, nameEndsWith("ServletContext"))); } - public static class JavaxInitServiceNameInstrumentation extends InitServiceNameInstrumentation2 { + public static class JavaxInitServiceNameInstrumentation extends Servlet3PlusInstrumentation { private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); @@ -90,7 +92,7 @@ public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) } } - public static class JakartaInitServiceNameInstrumentation extends InitServiceNameInstrumentation2 { + public static class JakartaInitServiceNameInstrumentation extends Servlet3PlusInstrumentation { private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); @@ -103,7 +105,7 @@ public static class AdviceClass { @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) { - if (servletContext instanceof javax.servlet.ServletContext) { + if (servletContext instanceof jakarta.servlet.ServletContext) { ServletServiceNameHelper.determineServiceName(adapter, (jakarta.servlet.ServletContext) servletContext, tracer); } } diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation b/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation index e02db11014..27039b9a65 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation @@ -14,7 +14,7 @@ co.elastic.apm.agent.servlet.JakartaAsyncInstrumentation$JakartaStartAsyncInstru co.elastic.apm.agent.servlet.JakartaAsyncInstrumentation$JakartaAsyncContextInstrumentation co.elastic.apm.agent.servlet.JavaxRequestStreamRecordingInstrumentation co.elastic.apm.agent.servlet.JakartaRequestStreamRecordingInstrumentation -co.elastic.apm.agent.servlet.InitServiceNameInstrumentation$JavaxInitServiceNameInstrumentation -co.elastic.apm.agent.servlet.InitServiceNameInstrumentation$JakartaInitServiceNameInstrumentation -co.elastic.apm.agent.servlet.InitServiceNameInstrumentation2$JavaxInitServiceNameInstrumentation -co.elastic.apm.agent.servlet.InitServiceNameInstrumentation2$JakartaInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.service_name.Servlet2PlusInstrumentation$JavaxInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.service_name.Servlet2PlusInstrumentation$JakartaInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.service_name.Servlet3PlusInstrumentation$JavaxInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.service_name.Servlet3PlusInstrumentation$JakartaInitServiceNameInstrumentation From d52f25534ab4256d3f3af6bbffb7886eff3114cb Mon Sep 17 00:00:00 2001 From: Tobias Stadler Date: Thu, 10 Feb 2022 09:43:30 +0100 Subject: [PATCH 3/3] Review by @felixbarny --- .../InitServiceNameInstrumentation.java} | 8 ++++---- ...etContainerInitializerServiceNameInstrumentation.java} | 8 ++++---- .../co.elastic.apm.agent.sdk.ElasticApmInstrumentation | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) rename apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/{service_name/Servlet2PlusInstrumentation.java => servicename/InitServiceNameInstrumentation.java} (96%) rename apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/{service_name/Servlet3PlusInstrumentation.java => servicename/ServletContainerInitializerServiceNameInstrumentation.java} (94%) diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet2PlusInstrumentation.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java similarity index 96% rename from apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet2PlusInstrumentation.java rename to apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java index 3e1f3f78a2..cbefb1e257 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet2PlusInstrumentation.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/InitServiceNameInstrumentation.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package co.elastic.apm.agent.servlet.service_name; +package co.elastic.apm.agent.servlet.servicename; import co.elastic.apm.agent.servlet.AbstractServletInstrumentation; import co.elastic.apm.agent.servlet.ServletServiceNameHelper; @@ -54,7 +54,7 @@ * Determines the service name based on the webapp's {@code META-INF/MANIFEST.MF} file early in the startup process. * As this doesn't work with runtime attachment, the service name is also determined when the first request comes in. */ -public abstract class Servlet2PlusInstrumentation extends AbstractServletInstrumentation { +public abstract class InitServiceNameInstrumentation extends AbstractServletInstrumentation { @Override public ElementMatcher getTypeMatcherPreFilter() { @@ -78,7 +78,7 @@ public ElementMatcher getMethodMatcher() { .and(takesArgument(0, nameEndsWith("ServletContextEvent")))); } - public static class JavaxInitServiceNameInstrumentation extends Servlet2PlusInstrumentation { + public static class JavaxInitServiceNameInstrumentation extends InitServiceNameInstrumentation { private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); @@ -105,7 +105,7 @@ public static void onEnter(@Advice.Argument(0) @Nullable Object arg) { } } - public static class JakartaInitServiceNameInstrumentation extends Servlet2PlusInstrumentation { + public static class JakartaInitServiceNameInstrumentation extends InitServiceNameInstrumentation { private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet3PlusInstrumentation.java b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java similarity index 94% rename from apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet3PlusInstrumentation.java rename to apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java index 86b132af39..0c75c8b323 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/service_name/Servlet3PlusInstrumentation.java +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/servicename/ServletContainerInitializerServiceNameInstrumentation.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package co.elastic.apm.agent.servlet.service_name; +package co.elastic.apm.agent.servlet.servicename; import co.elastic.apm.agent.servlet.AbstractServletInstrumentation; import co.elastic.apm.agent.servlet.ServletServiceNameHelper; @@ -51,7 +51,7 @@ * Determines the service name based on the webapp's {@code META-INF/MANIFEST.MF} file early in the startup process. * As this doesn't work with runtime attachment, the service name is also determined when the first request comes in. */ -public abstract class Servlet3PlusInstrumentation extends AbstractServletInstrumentation { +public abstract class ServletContainerInitializerServiceNameInstrumentation extends AbstractServletInstrumentation { @Override public ElementMatcher getTypeMatcherPreFilter() { @@ -72,7 +72,7 @@ public ElementMatcher getMethodMatcher() { .and(takesArgument(1, nameEndsWith("ServletContext"))); } - public static class JavaxInitServiceNameInstrumentation extends Servlet3PlusInstrumentation { + public static class JavaxInitServiceNameInstrumentation extends ServletContainerInitializerServiceNameInstrumentation { private static final JavaxServletApiAdapter adapter = JavaxServletApiAdapter.get(); @@ -92,7 +92,7 @@ public static void onEnter(@Advice.Argument(1) @Nullable Object servletContext) } } - public static class JakartaInitServiceNameInstrumentation extends Servlet3PlusInstrumentation { + public static class JakartaInitServiceNameInstrumentation extends ServletContainerInitializerServiceNameInstrumentation { private static final JakartaServletApiAdapter adapter = JakartaServletApiAdapter.get(); diff --git a/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation b/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation index 27039b9a65..8c80aa5dbb 100644 --- a/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation +++ b/apm-agent-plugins/apm-servlet-plugin/src/main/resources/META-INF/services/co.elastic.apm.agent.sdk.ElasticApmInstrumentation @@ -14,7 +14,7 @@ co.elastic.apm.agent.servlet.JakartaAsyncInstrumentation$JakartaStartAsyncInstru co.elastic.apm.agent.servlet.JakartaAsyncInstrumentation$JakartaAsyncContextInstrumentation co.elastic.apm.agent.servlet.JavaxRequestStreamRecordingInstrumentation co.elastic.apm.agent.servlet.JakartaRequestStreamRecordingInstrumentation -co.elastic.apm.agent.servlet.service_name.Servlet2PlusInstrumentation$JavaxInitServiceNameInstrumentation -co.elastic.apm.agent.servlet.service_name.Servlet2PlusInstrumentation$JakartaInitServiceNameInstrumentation -co.elastic.apm.agent.servlet.service_name.Servlet3PlusInstrumentation$JavaxInitServiceNameInstrumentation -co.elastic.apm.agent.servlet.service_name.Servlet3PlusInstrumentation$JakartaInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.servicename.InitServiceNameInstrumentation$JavaxInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.servicename.InitServiceNameInstrumentation$JakartaInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.servicename.ServletContainerInitializerServiceNameInstrumentation$JavaxInitServiceNameInstrumentation +co.elastic.apm.agent.servlet.servicename.ServletContainerInitializerServiceNameInstrumentation$JakartaInitServiceNameInstrumentation