Guard against NPE for async; fixes gh-926
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user