diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java index 35d08a765..b3fac1dc4 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspect.java @@ -16,10 +16,11 @@ package org.springframework.cloud.sleuth.instrument.async; -import java.lang.reflect.Method; - import brave.Span; import brave.Tracer; + +import java.lang.reflect.Method; + import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @@ -53,9 +54,12 @@ public class TraceAsyncAspect { @Around("execution (@org.springframework.scheduling.annotation.Async * *.*(..))") public Object traceBackgroundThread(final ProceedingJoinPoint pjp) throws Throwable { - String spanName = this.spanNamer.name(getMethod(pjp, pjp.getTarget()), - SpanNameUtil.toLowerHyphen(pjp.getSignature().getName())); - Span span = this.tracer.currentSpan().name(spanName); + String spanName = name(pjp); + Span span = this.tracer.currentSpan(); + if (span == null) { + span = this.tracer.nextSpan(); + } + span = span.name(spanName); try(Tracer.SpanInScope ws = this.tracer.withSpanInScope(span)) { span.tag(this.traceKeys.getAsync().getPrefix() + this.traceKeys.getAsync().getClassNameKey(), pjp.getTarget().getClass().getSimpleName()); @@ -67,6 +71,11 @@ public class TraceAsyncAspect { } } + String name(ProceedingJoinPoint pjp) { + return this.spanNamer.name(getMethod(pjp, pjp.getTarget()), + SpanNameUtil.toLowerHyphen(pjp.getSignature().getName())); + } + private Method getMethod(ProceedingJoinPoint pjp, Object object) { MethodSignature signature = (MethodSignature) pjp.getSignature(); Method method = signature.getMethod(); 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 new file mode 100644 index 000000000..66cd1ba3c --- /dev/null +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/async/TraceAsyncAspectTest.java @@ -0,0 +1,52 @@ +package org.springframework.cloud.sleuth.instrument.async; + +import brave.Tracing; +import brave.propagation.CurrentTraceContext; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.reflect.MethodSignature; +import org.assertj.core.api.BDDAssertions; +import org.junit.Before; +import org.junit.Test; +import org.mockito.BDDMockito; +import org.mockito.Mockito; +import org.springframework.cloud.sleuth.DefaultSpanNamer; +import org.springframework.cloud.sleuth.TraceKeys; +import org.springframework.cloud.sleuth.util.ArrayListSpanReporter; + +/** + * @author Marcin Grzejszczak + */ +public class TraceAsyncAspectTest { + + ArrayListSpanReporter reporter = new ArrayListSpanReporter(); + Tracing tracing = Tracing.newBuilder() + .currentTraceContext(CurrentTraceContext.Default.create()) + .spanReporter(this.reporter) + .build(); + ProceedingJoinPoint point = Mockito.mock(ProceedingJoinPoint.class); + + @Before + public void setup() throws NoSuchMethodException { + MethodSignature signature = Mockito.mock(MethodSignature.class); + BDDMockito.given(signature.getName()).willReturn("fooBar"); + BDDMockito.given(signature.getMethod()).willReturn(TraceAsyncAspectTest.class.getMethod("setup")); + BDDMockito.given(this.point.getSignature()).willReturn(signature); + BDDMockito.given(this.point.getTarget()).willReturn(""); + } + + //Issue#926 + @Test public void should_work() throws Throwable { + TraceAsyncAspect asyncAspect = new TraceAsyncAspect(this.tracing.tracer(), + new DefaultSpanNamer(), new TraceKeys()) { + @Override String name(ProceedingJoinPoint pjp) { + return "foo-bar"; + } + }; + + asyncAspect.traceBackgroundThread(this.point); + + BDDAssertions.then(this.reporter.getSpans()).hasSize(1); + BDDAssertions.then(this.reporter.getSpans().get(0).name()).isEqualTo("foo-bar"); + } +} \ No newline at end of file