From 6eca1249994d3ce63b5eabd21178e250f0fd9f80 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 14 Sep 2018 13:24:17 +0800 Subject: [PATCH 1/2] Updates to latest Brave, removing deprecated usage Notably, this avoids `Span.remoteEndpoint` and deprecated test helpers. --- .../main/asciidoc/spring-cloud-sleuth.adoc | 111 +++++++++++------- pom.xml | 2 +- .../autoconfig/TraceAutoConfiguration.java | 7 +- .../messaging/TracingChannelInterceptor.java | 7 +- .../SpringCloudSleuthDocTests.java | 7 +- .../async/TraceAsyncAspectTest.java | 7 +- .../TraceAsyncListenableTaskExecutorTest.java | 7 +- .../instrument/async/TraceCallableTests.java | 7 +- .../instrument/async/TraceRunnableTests.java | 7 +- .../async/TraceableExecutorServiceTests.java | 7 +- ...TraceableScheduledExecutorServiceTest.java | 7 +- .../SleuthHystrixConcurrencyStrategyTest.java | 7 +- .../instrument/hystrix/TraceCommandTests.java | 7 +- .../ITTracingChannelInterceptor.java | 7 +- .../TracingChannelInterceptorTest.java | 8 +- .../opentracing/BraveTracerTest.java | 12 +- .../SleuthRxJavaSchedulersHookTests.java | 7 +- .../instrument/web/TraceFilterTests.java | 15 ++- .../TraceRestTemplateInterceptorTests.java | 11 +- ...stTemplateInterceptorIntegrationTests.java | 7 +- .../web/client/feign/FeignRetriesTests.java | 7 +- .../client/feign/TraceFeignAspectTests.java | 7 +- .../client/feign/TracingFeignClientTests.java | 7 +- .../zuul/TracePostZuulFilterTests.java | 7 +- .../cloud/sleuth/log/Slf4JSpanLoggerTest.java | 11 +- spring-cloud-sleuth-dependencies/pom.xml | 2 +- spring-cloud-sleuth-samples/pom.xml | 2 +- 27 files changed, 201 insertions(+), 99 deletions(-) diff --git a/docs/src/main/asciidoc/spring-cloud-sleuth.adoc b/docs/src/main/asciidoc/spring-cloud-sleuth.adoc index 1b3c61e09..89adcde66 100644 --- a/docs/src/main/asciidoc/spring-cloud-sleuth.adoc +++ b/docs/src/main/asciidoc/spring-cloud-sleuth.adoc @@ -75,35 +75,47 @@ Spans have a context that includes trace identifiers that place the span at the ==== Local Tracing -When tracing local code, you can run it inside a span, as shown in the following example: - -```java - -@Autowired Tracer tracer; - -Span span = tracer.newTrace().name("encode").start(); -try { - doSomethingExpensive(); -} finally { - span.finish(); -} -``` - -In the preceding example, the span is the root of the trace. -In many cases, the span is part of an existing trace. -When this is the case, call `newChild` instead of `newTrace`, as shown in the following example: +When tracing code that never leaves your process, run it inside a scoped span. ```java @Autowired Tracer tracer; -Span span = tracer.newChild(root.context()).name("encode").start(); +// Start a new trace or a span within an existing trace representing an operation +ScopedSpan span = tracer.startScopedSpan("encode"); try { - doSomethingExpensive(); + // The span is in "scope" meaning downstream code such as loggers can see trace IDs + return encoder.encode(); +} catch (RuntimeException | Error e) { + span.error(e); // Unless you handle exceptions, you might not know the operation failed! + throw e; } finally { - span.finish(); + span.finish(); // always finish the span } ``` +When you need more features, or finer control, use the `Span` type: +```java +@Autowired Tracer tracer; + +// Start a new trace or a span within an existing trace representing an operation +Span span = tracer.nextSpan().name("encode").start(); +// Put the span in "scope" so that downstream code such as loggers can see trace IDs +try (SpanInScope ws = tracer.withSpanInScope(span)) { + return encoder.encode(); +} catch (RuntimeException | Error e) { + span.error(e); // Unless you handle exceptions, you might not know the operation failed! + throw e; +} finally { + span.finish(); // note the scope is independent of the span. Always finish a span. +} +``` + +Both of the above examples report the exact same span on finish! + +In the above example, the span will be either a new root span or the +next child in an existing trace. + + ==== Customizing Spans Once you have a span, you can add tags to it. @@ -156,23 +168,26 @@ RPC tracing is often done automatically by interceptors. Behind the scenes, they The following example shows how to add a client span: ```java +@Autowired Tracing tracing; @Autowired Tracer tracer; // before you send a request, add metadata that describes the operation -span = tracer.newTrace().name("get").type(CLIENT); -span.tag("clnt/finagle.version", "6.36.0"); -span.tag(TraceKeys.HTTP_PATH, "/api"); -span.remoteEndpoint(Endpoint.builder() - .serviceName("backend") - .ipv4(127 << 24 | 1) - .port(8080).build()); +span = tracer.nextSpan().name(service + "/" + method).kind(CLIENT); +span.tag("myrpc.version", "1.0.0"); +span.remoteServiceName("backend"); +span.remoteIpAndPort("172.3.4.1", 8108); + +// Add the trace context to the request, so it can be propagated in-band +tracing.propagation().injector(Request::addHeader) + .inject(span.context(), request); // when the request is scheduled, start the span span.start(); -// if you have callbacks for when data is on the wire, note those events -span.annotate(Constants.WIRE_SEND); -span.annotate(Constants.WIRE_RECV); +// if there is an error, tag the span +span.tag("error", error.getCode()); +// or if there is an exception +span.error(exception); // when the response is complete, finish the span span.finish(); @@ -187,10 +202,11 @@ to indicate that the response was received. In one-way tracing, you use The following example shows how a client might model a one-way operation: ```java +@Autowired Tracing tracing; @Autowired Tracer tracer; // start a new span representing a client request -oneWaySend = tracer.newSpan(parent).kind(Span.Kind.CLIENT); +oneWaySend = tracer.nextSpan().name(service + "/" + method).kind(CLIENT); // Add the trace context to the request, so it can be propagated in-band tracing.propagation().injector(Request::addHeader) @@ -243,16 +259,24 @@ Most users use a framework interceptor to automate this sort of policy. The following example shows how that might work internally: ```java -@Autowired Tracing tracing; +@Autowired Tracer tracer; // derives a sample rate from an annotation on a java method DeclarativeSampler sampler = DeclarativeSampler.create(Traced::sampleRate); @Around("@annotation(traced)") public Object traceThing(ProceedingJoinPoint pjp, Traced traced) throws Throwable { - Span span = tracing.tracer().newTrace(sampler.sample(traced))... + // When there is no trace in progress, this decides using an annotation + Sampler decideUsingAnnotation = declarativeSampler.toSampler(traced); + Tracer tracer = tracer.withSampler(decideUsingAnnotation); + + // This code looks the same as if there was no declarative override + ScopedSpan span = tracer.startScopedSpan(spanName(pjp)); try { return pjp.proceed(); + } catch (RuntimeException | Error e) { + span.error(e); + throw e; } finally { span.finish(); } @@ -269,15 +293,20 @@ The following example shows how that might work internally: ```java @Autowired Tracer tracer; +@Autowired Sampler fallback; -Span newTrace(Request input) { - SamplingFlags flags = SamplingFlags.NONE; - if (input.url().startsWith("/experimental")) { - flags = SamplingFlags.SAMPLED; - } else if (input.url().startsWith("/static")) { - flags = SamplingFlags.NOT_SAMPLED; - } - return tracer.newTrace(flags); +Span nextSpan(final Request input) { + Sampler requestBased = Sampler() { + @Override public boolean isSampled(long traceId) { + if (input.url().startsWith("/experimental")) { + return true; + } else if (input.url().startsWith("/static")) { + return false; + } + return fallback.isSampled(traceId); + } + }; + return tracer.withSampler(requestBased).nextSpan(); } ``` diff --git a/pom.xml b/pom.xml index ae3f853d0..aec1219bc 100644 --- a/pom.xml +++ b/pom.xml @@ -273,7 +273,7 @@ Elmhurst.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT 2.0.0.BUILD-SNAPSHOT - 5.2.0 + 5.3.3 2.0.0.RELEASE diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java index fc0ad3678..56e30b075 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/autoconfig/TraceAutoConfiguration.java @@ -23,7 +23,8 @@ import brave.CurrentSpanCustomizer; import brave.ErrorParser; import brave.Tracer; import brave.Tracing; -import brave.context.log4j2.ThreadContextCurrentTraceContext; +import brave.context.log4j2.ThreadContextScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import brave.propagation.B3Propagation; import brave.propagation.CurrentTraceContext; import brave.propagation.ExtraFieldPropagation; @@ -135,7 +136,9 @@ public class TraceAutoConfiguration { @Bean @ConditionalOnMissingBean CurrentTraceContext sleuthCurrentTraceContext() { - return ThreadContextCurrentTraceContext.create(); + return ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(ThreadContextScopeDecorator.create()) + .build(); } @Bean diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java index 342665bed..0483551ec 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptor.java @@ -41,7 +41,6 @@ import org.springframework.messaging.support.ExecutorChannelInterceptor; import org.springframework.messaging.support.GenericMessage; import org.springframework.messaging.support.MessageHeaderAccessor; import org.springframework.util.ClassUtils; -import zipkin2.Endpoint; /** * This starts and propagates {@link Span.Kind#PRODUCER} span for each message sent (via native @@ -137,7 +136,7 @@ public final class TracingChannelInterceptor extends ChannelInterceptorAdapter this.injector.inject(span.context(), headers); if (!span.isNoop()) { span.kind(Span.Kind.PRODUCER).name("send").start(); - span.remoteEndpoint(Endpoint.newBuilder().serviceName(REMOTE_SERVICE_NAME).build()); + span.remoteServiceName(REMOTE_SERVICE_NAME); addTags(message, span, channel); } if (log.isDebugEnabled()) { @@ -203,7 +202,7 @@ public final class TracingChannelInterceptor extends ChannelInterceptorAdapter this.injector.inject(span.context(), headers); if (!span.isNoop()) { span.kind(Span.Kind.CONSUMER).name("receive").start(); - span.remoteEndpoint(Endpoint.newBuilder().serviceName(REMOTE_SERVICE_NAME).build()); + span.remoteServiceName(REMOTE_SERVICE_NAME); addTags(message, span, channel); } if (log.isDebugEnabled()) { @@ -240,7 +239,7 @@ public final class TracingChannelInterceptor extends ChannelInterceptorAdapter Span consumerSpan = this.tracer.nextSpan(extracted); if (!consumerSpan.isNoop()) { consumerSpan.kind(Span.Kind.CONSUMER).start(); - consumerSpan.remoteEndpoint(Endpoint.newBuilder().serviceName(REMOTE_SERVICE_NAME).build()); + consumerSpan.remoteServiceName(REMOTE_SERVICE_NAME); addTags(message, consumerSpan, channel); consumerSpan.finish(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java index 60a1a2065..1e694a67f 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/documentation/SpringCloudSleuthDocTests.java @@ -27,7 +27,8 @@ import java.util.concurrent.Future; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import brave.sampler.Sampler; import org.assertj.core.api.BDDAssertions; import org.junit.Before; @@ -53,7 +54,9 @@ public class SpringCloudSleuthDocTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .sampler(Sampler.ALWAYS_SAMPLE) .spanReporter(this.reporter) .build(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspectTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspectTest.java index dcb1cb5d3..1612ea447 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspectTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspectTest.java @@ -1,7 +1,8 @@ package org.springframework.cloud.sleuth.instrument.async; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.assertj.core.api.BDDAssertions; @@ -19,7 +20,9 @@ public class TraceAsyncAspectTest { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); ProceedingJoinPoint point = Mockito.mock(ProceedingJoinPoint.class); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java index e3b4003f6..14aa0baf4 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncListenableTaskExecutorTest.java @@ -23,7 +23,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.assertj.core.api.BDDAssertions; import org.awaitility.Awaitility; import org.junit.Test; @@ -37,7 +38,9 @@ public class TraceAsyncListenableTaskExecutorTest { AsyncListenableTaskExecutor delegate = new SimpleAsyncTaskExecutor(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .build(); Tracer tracer = this.tracing.tracer(); TraceAsyncListenableTaskExecutor traceAsyncListenableTaskExecutor = new TraceAsyncListenableTaskExecutor( diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java index 0d5ce71f6..f8338430a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceCallableTests.java @@ -23,7 +23,8 @@ import java.util.concurrent.Executors; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,7 +41,9 @@ public class TraceCallableTests { ExecutorService executor = Executors.newSingleThreadExecutor(); ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java index 49e4c67b9..3f049ac64 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceRunnableTests.java @@ -23,7 +23,8 @@ import java.util.concurrent.atomic.AtomicReference; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; @@ -40,7 +41,9 @@ public class TraceRunnableTests { ExecutorService executor = Executors.newSingleThreadExecutor(); ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java index d8fd53447..14194867e 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableExecutorServiceTests.java @@ -32,7 +32,8 @@ import brave.ScopedSpan; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.assertj.core.api.BDDAssertions; import org.junit.After; import org.junit.Before; @@ -60,7 +61,9 @@ public class TraceableExecutorServiceTests { ExecutorService traceManagerableExecutorService; ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java index 70b55f7d1..5c1e82f83 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceableScheduledExecutorServiceTest.java @@ -22,7 +22,8 @@ import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -46,7 +47,9 @@ import static org.mockito.BDDMockito.then; public class TraceableScheduledExecutorServiceTest { Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .build(); @Mock BeanFactory beanFactory; diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategyTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategyTest.java index 7557f05cf..c36de2c43 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategyTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/SleuthHystrixConcurrencyStrategyTest.java @@ -21,7 +21,8 @@ import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -51,7 +52,9 @@ public class SleuthHystrixConcurrencyStrategyTest { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java index bb6d322e4..40d05f6dd 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/hystrix/TraceCommandTests.java @@ -21,7 +21,8 @@ import java.util.List; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.HystrixCommandKey; import com.netflix.hystrix.HystrixCommandProperties; @@ -39,7 +40,9 @@ public class TraceCommandTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/ITTracingChannelInterceptor.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/ITTracingChannelInterceptor.java index db36b9b74..aa50ff1de 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/ITTracingChannelInterceptor.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/ITTracingChannelInterceptor.java @@ -26,7 +26,8 @@ import javax.annotation.PreDestroy; import brave.Span; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -136,7 +137,9 @@ public class ITTracingChannelInterceptor implements MessageHandler { @Bean Tracing tracing() { return Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(spans()::add).build(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java index 24b5bc48d..fb2bc9cd6 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/messaging/TracingChannelInterceptorTest.java @@ -23,7 +23,8 @@ import java.util.List; import java.util.Map; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.After; import org.junit.Test; import org.springframework.integration.channel.DirectChannel; @@ -49,7 +50,10 @@ public class TracingChannelInterceptorTest { List spans = new ArrayList<>(); ChannelInterceptor interceptor = TracingChannelInterceptor.create(Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()).spanReporter(spans::add) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) + .spanReporter(spans::add) .build()); QueueChannel channel = new QueueChannel(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/opentracing/BraveTracerTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/opentracing/BraveTracerTest.java index 15d5ec39c..cfa597dea 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/opentracing/BraveTracerTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/opentracing/BraveTracerTest.java @@ -15,9 +15,6 @@ */ package org.springframework.cloud.sleuth.instrument.opentracing; -import java.util.LinkedHashMap; -import java.util.Map; - import brave.Span; import brave.Tracer.SpanInScope; import brave.Tracing; @@ -25,13 +22,16 @@ import brave.opentracing.BraveSpan; import brave.opentracing.BraveSpanContext; import brave.opentracing.BraveTracer; import brave.propagation.CurrentTraceContext; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import brave.propagation.TraceContext; import brave.sampler.Sampler; import io.opentracing.Scope; import io.opentracing.propagation.Format; import io.opentracing.propagation.TextMapExtractAdapter; import io.opentracing.propagation.TextMapInjectAdapter; +import java.util.LinkedHashMap; +import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -318,7 +318,9 @@ public class BraveTracerTest { } @Bean CurrentTraceContext currentTraceContext() { - return new StrictCurrentTraceContext(); + return ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build(); } } } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java index 68056a4f1..24c1621e9 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/rxjava/SleuthRxJavaSchedulersHookTests.java @@ -28,7 +28,8 @@ import java.util.concurrent.ThreadFactory; import brave.Tracer; import brave.Tracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import rx.functions.Action0; import rx.plugins.RxJavaErrorHandler; import rx.plugins.RxJavaObservableExecutionHook; @@ -50,7 +51,9 @@ public class SleuthRxJavaSchedulersHookTests { List threadsToIgnore = new ArrayList<>(); ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java index 91f35557b..d45f2a04a 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceFilterTests.java @@ -25,7 +25,8 @@ import brave.Span; import brave.Tracer; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import brave.sampler.Sampler; import brave.servlet.TracingFilter; import org.junit.After; @@ -60,7 +61,9 @@ public class TraceFilterTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); @@ -108,7 +111,9 @@ public class TraceFilterTests { private Filter neverSampleFilter() { Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .sampler(Sampler.NEVER_SAMPLE) .supportsJoin(false) @@ -235,7 +240,9 @@ public class TraceFilterTests { @Test public void createsChildFromHeadersWhenJoinUnsupported() throws Exception { Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .supportsJoin(false) .build(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceRestTemplateInterceptorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceRestTemplateInterceptorTests.java index 826057f66..9bb53042e 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceRestTemplateInterceptorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/TraceRestTemplateInterceptorTests.java @@ -25,8 +25,9 @@ import brave.Span; import brave.Tracer; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; import brave.sampler.Sampler; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import brave.spring.web.TracingClientHttpRequestInterceptor; import org.apache.commons.lang3.StringUtils; import org.junit.After; @@ -60,7 +61,9 @@ public class TraceRestTemplateInterceptorTests { new MockMvcClientHttpRequestFactory(this.mockMvc)); ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); @@ -136,7 +139,9 @@ public class TraceRestTemplateInterceptorTests { @Test public void notSampledHeaderAddedWhenNotExportable() { Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .sampler(Sampler.NEVER_SAMPLE) .build(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java index 0b51c8cc6..7ef1e60e1 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/TraceRestTemplateInterceptorIntegrationTests.java @@ -36,7 +36,8 @@ import brave.Span; import brave.Tracer; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import brave.spring.web.TracingClientHttpRequestInterceptor; import okhttp3.mockwebserver.MockResponse; import okhttp3.mockwebserver.MockWebServer; @@ -53,7 +54,9 @@ public class TraceRestTemplateInterceptorIntegrationTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java index a5d9b502c..7984228dc 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/FeignRetriesTests.java @@ -23,7 +23,8 @@ import java.util.concurrent.atomic.AtomicInteger; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import feign.Client; import feign.Feign; import feign.FeignException; @@ -60,7 +61,9 @@ public class FeignRetriesTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); HttpTracing httpTracing = HttpTracing.newBuilder(this.tracing) diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspectTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspectTests.java index ff2f4099e..9a21cab18 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspectTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TraceFeignAspectTests.java @@ -20,7 +20,8 @@ import java.io.IOException; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import feign.Client; import org.aspectj.lang.ProceedingJoinPoint; import org.junit.Before; @@ -46,7 +47,9 @@ public class TraceFeignAspectTests { @Mock ProceedingJoinPoint pjp; @Mock TraceLoadBalancerFeignClient traceLoadBalancerFeignClient; Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .build(); HttpTracing httpTracing = HttpTracing.newBuilder(this.tracing) .clientParser(SleuthHttpParserAccessor.getClient()) diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java index bcf991cb7..91911d101 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/client/feign/TracingFeignClientTests.java @@ -24,7 +24,8 @@ import brave.Span; import brave.Tracer; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import feign.Client; import feign.Request; import org.assertj.core.api.BDDAssertions; @@ -49,7 +50,9 @@ public class TracingFeignClientTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); @Mock BeanFactory beanFactory; Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Tracer tracer = this.tracing.tracer(); diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilterTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilterTests.java index 3c670bb34..79e98a3fc 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilterTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/zuul/TracePostZuulFilterTests.java @@ -25,7 +25,8 @@ import brave.Span; import brave.Tracer; import brave.Tracing; import brave.http.HttpTracing; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.monitoring.TracerFactory; import org.junit.After; @@ -53,7 +54,9 @@ public class TracePostZuulFilterTests { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); HttpTracing httpTracing = HttpTracing.newBuilder(this.tracing) diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java index ae76e5490..762d2cdbc 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/log/Slf4JSpanLoggerTest.java @@ -19,7 +19,8 @@ package org.springframework.cloud.sleuth.log; import brave.Span; import brave.Tracing; import brave.propagation.CurrentTraceContext.Scope; -import brave.propagation.StrictCurrentTraceContext; +import brave.propagation.StrictScopeDecorator; +import brave.propagation.ThreadLocalCurrentTraceContext; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -35,13 +36,17 @@ public class Slf4JSpanLoggerTest { ArrayListSpanReporter reporter = new ArrayListSpanReporter(); Tracing tracing = Tracing.newBuilder() - .currentTraceContext(new StrictCurrentTraceContext()) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()) .spanReporter(this.reporter) .build(); Span span = this.tracing.tracer().nextSpan().name("span").start(); Slf4jCurrentTraceContext slf4jCurrentTraceContext = - new Slf4jCurrentTraceContext(new StrictCurrentTraceContext()); + new Slf4jCurrentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(StrictScopeDecorator.create()) + .build()); @Before @After diff --git a/spring-cloud-sleuth-dependencies/pom.xml b/spring-cloud-sleuth-dependencies/pom.xml index 4701dd72c..4b896f97a 100644 --- a/spring-cloud-sleuth-dependencies/pom.xml +++ b/spring-cloud-sleuth-dependencies/pom.xml @@ -30,7 +30,7 @@ spring-cloud-sleuth-dependencies Spring Cloud Sleuth Dependencies - 0.32.0 + 0.33.0 diff --git a/spring-cloud-sleuth-samples/pom.xml b/spring-cloud-sleuth-samples/pom.xml index bdc8fc983..98c42b7d9 100644 --- a/spring-cloud-sleuth-samples/pom.xml +++ b/spring-cloud-sleuth-samples/pom.xml @@ -73,7 +73,7 @@ io.zipkin.zipkin2 zipkin - 2.11.2 + 2.11.5 From 4da88ee142c15b0c42e3810660ab985abc971e09 Mon Sep 17 00:00:00 2001 From: Denys Ivano Date: Thu, 20 Sep 2018 13:07:09 +0300 Subject: [PATCH 2/2] Throw the target exception instead of InvocationTargetException (#1093) Fixes gh-1092 --- .../async/ExecutorBeanPostProcessor.java | 11 ++++++- .../async/ExecutorBeanPostProcessorTests.java | 31 +++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java index 9ce03995e..904455a41 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessor.java @@ -16,6 +16,7 @@ package org.springframework.cloud.sleuth.instrument.async; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.concurrent.Executor; @@ -38,6 +39,8 @@ import org.springframework.util.ReflectionUtils; * method or is final. * * @author Marcin Grzejszczak + * @author Jesus Alonso + * @author Denys Ivano * @since 1.1.4 */ class ExecutorBeanPostProcessor implements BeanPostProcessor { @@ -124,7 +127,13 @@ class ExecutorMethodInterceptor implements MethodInterceptor Executor executor = executor(this.beanFactory, this.delegate); Method methodOnTracedBean = getMethod(invocation, executor); if (methodOnTracedBean != null) { - return methodOnTracedBean.invoke(executor, invocation.getArguments()); + try { + return methodOnTracedBean.invoke(executor, invocation.getArguments()); + } catch (InvocationTargetException ex) { + // gh-1092: throw the target exception (if present) + Throwable cause = ex.getCause(); + throw (cause != null) ? cause : ex; + } } return invocation.proceed(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java index 66d6fd06d..283c4ba73 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/ExecutorBeanPostProcessorTests.java @@ -18,14 +18,20 @@ package org.springframework.cloud.sleuth.instrument.async; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ScheduledExecutorService; +import brave.Tracing; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.aop.framework.AopConfigException; import org.springframework.beans.factory.BeanFactory; +import org.springframework.cloud.sleuth.DefaultSpanNamer; +import org.springframework.cloud.sleuth.SpanNamer; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.util.ClassUtils; @@ -34,6 +40,7 @@ import static org.assertj.core.api.BDDAssertions.thenThrownBy; /** * @author Marcin Grzejszczak + * @author Denys Ivano */ @RunWith(MockitoJUnitRunner.class) public class ExecutorBeanPostProcessorTests { @@ -110,4 +117,28 @@ public class ExecutorBeanPostProcessorTests { .hasMessage("foo"); } + @Test + public void should_throw_real_exception_when_using_proxy() throws Exception { + // for LazyTraceExecutor + Mockito.when(this.beanFactory.getBean(Tracing.class)) + .thenReturn(Tracing.newBuilder().build()); + Mockito.when(this.beanFactory.getBean(SpanNamer.class)) + .thenReturn(new DefaultSpanNamer()); + + Object o = new ExecutorBeanPostProcessor(this.beanFactory) + .postProcessAfterInitialization(new RejectedExecutionExecutor(), "fooExecutor"); + + then(o).isInstanceOf(RejectedExecutionExecutor.class); + then(ClassUtils.isCglibProxy(o)).isTrue(); + thenThrownBy(() -> ((RejectedExecutionExecutor) o).execute(() -> {})) + .isInstanceOf(RejectedExecutionException.class) + .hasMessage("rejected"); + } + + class RejectedExecutionExecutor implements Executor { + @Override public void execute(Runnable task) { + throw new RejectedExecutionException("rejected"); + } + } + } \ No newline at end of file