diff --git a/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2InstrumentationModule.java b/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2InstrumentationModule.java index 2be49aae00..e3b5481d25 100644 --- a/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2InstrumentationModule.java +++ b/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/Servlet2InstrumentationModule.java @@ -42,7 +42,7 @@ public class Servlet2InstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { return Arrays.asList( - new HttpServletResponseInstrumentation(), new ServletAndFilterChainInstrumentation()); + new HttpServletResponseInstrumentation(), new ServletAndFilterInstrumentation()); } @Override diff --git a/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/ServletAndFilterChainInstrumentation.java b/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/ServletAndFilterInstrumentation.java similarity index 90% rename from instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/ServletAndFilterChainInstrumentation.java rename to instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/ServletAndFilterInstrumentation.java index f273e14fe4..b20a2490ac 100644 --- a/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/ServletAndFilterChainInstrumentation.java +++ b/instrumentation/servlet/servlet-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v2_2/ServletAndFilterInstrumentation.java @@ -19,7 +19,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -final class ServletAndFilterChainInstrumentation implements TypeInstrumentation { +final class ServletAndFilterInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -29,8 +29,7 @@ final class ServletAndFilterChainInstrumentation implements TypeInstrumentation @Override public ElementMatcher typeMatcher() { - return safeHasSuperType( - namedOneOf("javax.servlet.FilterChain", "javax.servlet.http.HttpServlet")); + return safeHasSuperType(namedOneOf("javax.servlet.Filter", "javax.servlet.http.HttpServlet")); } /** diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3InstrumentationModule.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3InstrumentationModule.java index 5107554d86..d8346316d1 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3InstrumentationModule.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3InstrumentationModule.java @@ -31,6 +31,6 @@ public class Servlet3InstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { - return asList(new AsyncContextInstrumentation(), new ServletAndFilterChainInstrumentation()); + return asList(new AsyncContextInstrumentation(), new ServletAndFilterInstrumentation()); } } diff --git a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/ServletAndFilterChainInstrumentation.java b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/ServletAndFilterInstrumentation.java similarity index 90% rename from instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/ServletAndFilterChainInstrumentation.java rename to instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/ServletAndFilterInstrumentation.java index 9639e1cc09..6251cc5a3f 100644 --- a/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/ServletAndFilterChainInstrumentation.java +++ b/instrumentation/servlet/servlet-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/ServletAndFilterInstrumentation.java @@ -19,7 +19,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -final class ServletAndFilterChainInstrumentation implements TypeInstrumentation { +final class ServletAndFilterInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. @@ -28,8 +28,7 @@ final class ServletAndFilterChainInstrumentation implements TypeInstrumentation @Override public ElementMatcher typeMatcher() { - return safeHasSuperType( - namedOneOf("javax.servlet.FilterChain", "javax.servlet.http.HttpServlet")); + return safeHasSuperType(namedOneOf("javax.servlet.Filter", "javax.servlet.http.HttpServlet")); } /** diff --git a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/HandlerMappingResourceNameFilter.java b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/HandlerMappingResourceNameFilter.java index 772029745e..ad307c4acc 100644 --- a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/HandlerMappingResourceNameFilter.java +++ b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/HandlerMappingResourceNameFilter.java @@ -12,33 +12,44 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.tracer.BaseTracer; import java.io.IOException; import java.util.List; +import javax.servlet.Filter; import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.support.GenericBeanDefinition; import org.springframework.core.Ordered; -import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.servlet.HandlerExecutionChain; import org.springframework.web.servlet.HandlerMapping; -public class HandlerMappingResourceNameFilter extends OncePerRequestFilter implements Ordered { +public class HandlerMappingResourceNameFilter implements Filter, Ordered { private volatile List handlerMappings; @Override - protected void doFilterInternal( - HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + public void init(FilterConfig filterConfig) {} + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws ServletException, IOException { + if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) { + filterChain.doFilter(request, response); + return; + } + Context context = Context.current(); Span serverSpan = BaseTracer.getCurrentServerSpan(context); if (handlerMappings != null && serverSpan != null) { try { - if (findMapping(request)) { + if (findMapping((HttpServletRequest) request)) { + // Name the parent span based on the matching pattern // Let the parent span resource name be set with the attribute set in findMapping. - tracer().onRequest(context, serverSpan, request); + tracer().onRequest(context, serverSpan, (HttpServletRequest) request); } } catch (Exception ignored) { // mapping.getHandler() threw exception. Ignore @@ -48,6 +59,9 @@ public class HandlerMappingResourceNameFilter extends OncePerRequestFilter imple filterChain.doFilter(request, response); } + @Override + public void destroy() {} + /** * When a HandlerMapping matches a request, it sets HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE * as an attribute on the request. This attribute is read by SpringWebMvcDecorator.onRequest and diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/matcher/AdditionalLibraryIgnoresMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/matcher/AdditionalLibraryIgnoresMatcher.java index 3704f17428..bd823eb534 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/matcher/AdditionalLibraryIgnoresMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/matcher/AdditionalLibraryIgnoresMatcher.java @@ -167,6 +167,7 @@ public class AdditionalLibraryIgnoresMatcher if (name.startsWith("org.springframework.web.")) { if (name.startsWith("org.springframework.web.servlet.") + || name.startsWith("org.springframework.web.filter.") || name.startsWith("org.springframework.web.reactive.") || name.startsWith("org.springframework.web.context.request.async.") || name.equals( @@ -306,7 +307,7 @@ public class AdditionalLibraryIgnoresMatcher return false; } - private static Set INSTRUMENTED_SPRING_BOOT_CLASSES = + private static final Set INSTRUMENTED_SPRING_BOOT_CLASSES = Sets.newHashSet( "org.springframework.boot.autoconfigure.BackgroundPreinitializer$", "org.springframework.boot.autoconfigure.condition.OnClassCondition$", @@ -319,7 +320,12 @@ public class AdditionalLibraryIgnoresMatcher "org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext", "org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext", "org.springframework.boot.web.embedded.tomcat.TomcatWebServer$", - "org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader"); + "org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader", + "org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean$", + "org.springframework.boot.web.filter.OrderedCharacterEncodingFilter", + "org.springframework.boot.web.filter.OrderedHiddenHttpMethodFilter", + "org.springframework.boot.web.filter.OrderedHttpPutFormContentFilter", + "org.springframework.boot.web.filter.OrderedRequestContextFilter"); private static String outerClassName(final String name) { int separator = name.indexOf('$');