From 171daaf28044e81fdaa6243ee1f8613126ca4f08 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sun, 11 Mar 2018 20:45:53 +0100 Subject: [PATCH] Migrated to brave's span customizing handler interceptors --- pom.xml | 2 +- .../cloud/sleuth/TraceKeys.java | 3 + .../web/SleuthTraceHandlerInterceptor.java | 122 ------------------ .../web/TraceSpringDataBeanPostProcessor.java | 9 +- .../instrument/web/TraceWebMvcConfigurer.java | 28 +--- .../web/TraceWebServletAutoConfiguration.java | 2 + ...ceZuulHandlerMappingBeanPostProcessor.java | 4 +- .../web/TraceFilterIntegrationTests.java | 13 +- .../web/TraceFilterWebIntegrationTests.java | 13 +- 9 files changed, 23 insertions(+), 173 deletions(-) delete mode 100644 spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthTraceHandlerInterceptor.java diff --git a/pom.xml b/pom.xml index bf62ea1f7..221166ee1 100644 --- a/pom.xml +++ b/pom.xml @@ -272,7 +272,7 @@ Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT - 4.17.2 + 4.17.3-SNAPSHOT 2.5.1 2.0.0.RELEASE diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceKeys.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceKeys.java index ad6a6d573..c9cc31bc1 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceKeys.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/TraceKeys.java @@ -47,8 +47,11 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * what's you are storing. * * @since 1.0.0 + * + * @deprecated the Brave's defaults are suggested to be used */ @ConfigurationProperties("spring.sleuth.keys") +@Deprecated public class TraceKeys { private Http http = new Http(); diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthTraceHandlerInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthTraceHandlerInterceptor.java deleted file mode 100644 index 64e11f825..000000000 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/SleuthTraceHandlerInterceptor.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright 2013-2018 the original author or authors. - * - * Licensed 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 org.springframework.cloud.sleuth.instrument.web; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import brave.SpanCustomizer; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.BeanFactory; -import org.springframework.cloud.sleuth.ErrorParser; -import org.springframework.cloud.sleuth.TraceKeys; -import org.springframework.web.method.HandlerMethod; -import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; - -/** - * {@link org.springframework.web.servlet.HandlerInterceptor} that wraps handling of a - * adds tags related to the class and method name. - * - * @author Marcin Grzejszczak - * @since 1.0.3 - */ -class SleuthTraceHandlerInterceptor extends HandlerInterceptorAdapter { - - private static final Log log = LogFactory.getLog(SleuthTraceHandlerInterceptor.class); - - private final BeanFactory beanFactory; - private SpanCustomizer spanCustomizer; - private TraceKeys traceKeys; - private ErrorParser errorParser; - - public SleuthTraceHandlerInterceptor(BeanFactory beanFactory) { - this.beanFactory = beanFactory; - } - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, - Object handler) { - SpanCustomizer span = spanCustomizer(); - if (log.isDebugEnabled()) { - log.debug("Adding tags to span " + span); - } - addClassMethodTag(handler, span); - addClassNameTag(handler, span); - return true; - } - - private void addClassMethodTag(Object handler, SpanCustomizer span) { - if (handler instanceof HandlerMethod) { - String methodName = ((HandlerMethod) handler).getMethod().getName(); - span.tag(traceKeys().getMvc().getControllerMethod(), methodName); - if (log.isDebugEnabled()) { - log.debug("Adding a method tag with value [" + methodName + "] to a span " + span); - } - } - } - - private void addClassNameTag(Object handler, SpanCustomizer span) { - String className; - if (handler instanceof HandlerMethod) { - className = ((HandlerMethod) handler).getBeanType().getSimpleName(); - } else { - className = handler.getClass().getSimpleName(); - } - if (log.isDebugEnabled()) { - log.debug("Adding a class tag with value [" + className + "] to a span " + span); - } - span.tag(traceKeys().getMvc().getControllerClass(), className); - } - - @Override - public void afterConcurrentHandlingStarted(HttpServletRequest request, - HttpServletResponse response, Object handler) { - - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, - Object handler, Exception ex) { - SpanCustomizer span = spanCustomizer(); - if (ex != null && span != null) { - errorParser().parseErrorTags(span, ex); - } - } - - private SpanCustomizer spanCustomizer() { - if (this.spanCustomizer == null) { - this.spanCustomizer = this.beanFactory.getBean(SpanCustomizer.class); - } - return this.spanCustomizer; - } - - private TraceKeys traceKeys() { - if (this.traceKeys == null) { - this.traceKeys = this.beanFactory.getBean(TraceKeys.class); - } - return this.traceKeys; - } - - private ErrorParser errorParser() { - if (this.errorParser == null) { - this.errorParser = this.beanFactory.getBean(ErrorParser.class); - } - return this.errorParser; - } - -} diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceSpringDataBeanPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceSpringDataBeanPostProcessor.java index 0d364aa30..fcc3d679b 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceSpringDataBeanPostProcessor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceSpringDataBeanPostProcessor.java @@ -19,7 +19,7 @@ package org.springframework.cloud.sleuth.instrument.web; import java.util.Collections; import javax.servlet.http.HttpServletRequest; -import brave.spring.webmvc.TracingHandlerInterceptor; +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; @@ -89,12 +89,7 @@ class TraceSpringDataBeanPostProcessor implements BeanPostProcessor { if (handlerExecutionChain == null) { return null; } - handlerExecutionChain.addInterceptor(this.applicationContext.getBean(TracingHandlerInterceptor.class)); - String legacyEnabled = this.applicationContext.getEnvironment() - .getProperty("spring.sleuth.http.legacy.enabled", "false"); - if (Boolean.parseBoolean(legacyEnabled)) { - handlerExecutionChain.addInterceptor(this.applicationContext.getBean(SleuthTraceHandlerInterceptor.class)); - } + handlerExecutionChain.addInterceptor(this.applicationContext.getBean(SpanCustomizingAsyncHandlerInterceptor.class)); return handlerExecutionChain; } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java index 682589104..d55993e6c 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebMvcConfigurer.java @@ -16,46 +16,28 @@ package org.springframework.cloud.sleuth.instrument.web; -import brave.http.HttpTracing; -import brave.spring.webmvc.TracingHandlerInterceptor; -import org.springframework.beans.factory.BeanFactory; +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /** - * MVC Adapter that adds the {@link TracingHandlerInterceptor} + * MVC Adapter that adds the {@link SpanCustomizingAsyncHandlerInterceptor} * * @author Marcin Grzejszczak * * @since 1.0.3 */ @Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) class TraceWebMvcConfigurer implements WebMvcConfigurer { @Autowired ApplicationContext applicationContext; - @Bean - public TracingHandlerInterceptor tracingHandlerInterceptor(HttpTracing tracing) { - return (TracingHandlerInterceptor) TracingHandlerInterceptor.create(tracing); - } - - @Bean - @ConditionalOnProperty("spring.sleuth.http.legacy.enabled") - public SleuthTraceHandlerInterceptor legacySleuthTraceHandlerInterceptor(BeanFactory beanFactory) { - return new SleuthTraceHandlerInterceptor(beanFactory); - } - @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(this.applicationContext.getBean(TracingHandlerInterceptor.class)); - String legacyEnabled = this.applicationContext.getEnvironment() - .getProperty("spring.sleuth.http.legacy.enabled", "false"); - if (Boolean.parseBoolean(legacyEnabled)) { - registry.addInterceptor(this.applicationContext.getBean(SleuthTraceHandlerInterceptor.class)); - } + registry.addInterceptor(this.applicationContext.getBean(SpanCustomizingAsyncHandlerInterceptor.class)); } } diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java index 29e50be80..051a5ee62 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebServletAutoConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.cloud.sleuth.instrument.web; import brave.Tracer; import brave.http.HttpTracing; import brave.servlet.TracingFilter; +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -54,6 +55,7 @@ import static javax.servlet.DispatcherType.REQUEST; @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @ConditionalOnBean(HttpTracing.class) @AutoConfigureAfter(TraceHttpAutoConfiguration.class) +@Import(SpanCustomizingAsyncHandlerInterceptor.class) public class TraceWebServletAutoConfiguration { public static final int TRACING_FILTER_ORDER = Ordered.HIGHEST_PRECEDENCE + 5; diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceZuulHandlerMappingBeanPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceZuulHandlerMappingBeanPostProcessor.java index 735f52720..7aa53fa71 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceZuulHandlerMappingBeanPostProcessor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/zuul/TraceZuulHandlerMappingBeanPostProcessor.java @@ -18,7 +18,7 @@ package org.springframework.cloud.sleuth.instrument.zuul; import java.lang.invoke.MethodHandles; -import brave.spring.webmvc.TracingHandlerInterceptor; +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; @@ -58,7 +58,7 @@ class TraceZuulHandlerMappingBeanPostProcessor implements BeanPostProcessor { } ZuulHandlerMapping zuulHandlerMapping = (ZuulHandlerMapping) bean; zuulHandlerMapping.setInterceptors( - this.beanFactory.getBean(TracingHandlerInterceptor.class)); + this.beanFactory.getBean(SpanCustomizingAsyncHandlerInterceptor.class)); } return bean; } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java index 561a34eba..526764c7e 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterIntegrationTests.java @@ -96,7 +96,7 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { public void should_create_a_trace() throws Exception { whenSentPingWithoutTracingData(); - then(this.reporter.getSpans()).hasSize(2); + then(this.reporter.getSpans()).hasSize(1); zipkin2.Span span = this.reporter.getSpans().get(0); then(span.tags()) .containsKey(new TraceKeys().getMvc().getControllerClass()) @@ -175,14 +175,11 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { whenSentToNonExistentEndpointWithTraceId(expectedTraceId); // it's a span with the same ids - then(this.reporter.getSpans()).hasSize(2); + then(this.reporter.getSpans()).hasSize(1); zipkin2.Span serverSpan = this.reporter.getSpans().get(0); then(serverSpan.tags()) .containsEntry("custom", "tag") .containsEntry("http.status_code", "404"); - zipkin2.Span handlerSpan = this.reporter.getSpans().get(0); - then(handlerSpan.tags()) - .containsEntry("http.status_code", "404"); then(this.tracer.currentSpan()).isNull(); } @@ -199,12 +196,8 @@ public class TraceFilterIntegrationTests extends AbstractMvcIntegrationTest { // we need to dump the span cause it's not in TraceFilter since TF // has also error dispatch and the ErrorController would report the span - then(this.reporter.getSpans()).hasSize(2); - // server + then(this.reporter.getSpans()).hasSize(1); then(this.reporter.getSpans().get(0).tags()) - .containsEntry("error", "java.lang.RuntimeException"); - // handler - then(this.reporter.getSpans().get(1).tags()) .containsEntry("error", "Request processing failed; nested exception is java.lang.RuntimeException"); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterWebIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterWebIntegrationTests.java index a41c0942a..b3970917c 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterWebIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterWebIntegrationTests.java @@ -84,19 +84,15 @@ public class TraceFilterWebIntegrationTests { } then(Tracing.current().tracer().currentSpan()).isNull(); - then(this.accumulator.getSpans()).hasSize(2); + then(this.accumulator.getSpans()).hasSize(1); Span fromFirstTraceFilterFlow = this.accumulator.getSpans().get(0); then(fromFirstTraceFilterFlow.tags()) .containsEntry("http.status_code", "500") .containsEntry("http.method", "GET") - .containsEntry("error", "Throwing exception") - .containsEntry("mvc.controller.class", "ExceptionThrowingController"); - Span fromErrorController = this.accumulator.getSpans().get(1); - then(fromErrorController.tags()) - .containsEntry("http.status_code", "500") + .containsEntry("mvc.controller.class", "ExceptionThrowingController") .containsEntry("error", "Request processing failed; nested exception is java.lang.RuntimeException: Throwing exception"); // issue#714 - String hex = fromErrorController.traceId(); + String hex = fromFirstTraceFilterFlow.traceId(); String[] split = capture.toString().split("\n"); List list = Arrays.stream(split).filter(s -> s.contains( "Uncaught exception thrown")) @@ -114,9 +110,10 @@ public class TraceFilterWebIntegrationTests { } then(Tracing.current().tracer().currentSpan()).isNull(); - then(this.accumulator.getSpans()).hasSize(2).as("spans with same id, one from server, one from handler"); + then(this.accumulator.getSpans()).hasSize(1); then(this.accumulator.getSpans().get(0).kind().ordinal()).isEqualTo(Span.Kind.SERVER.ordinal()); then(this.accumulator.getSpans().get(0).tags()).containsEntry("http.status_code", "400"); + then(this.accumulator.getSpans().get(0).tags()).containsEntry("http.path", "/test_bad_request"); } @Test