Guard against NPE for async; fixes gh-926

This commit is contained in:
Marcin Grzejszczak
2018-04-04 13:58:51 +02:00
parent eedff746d6
commit 71c7a9d168
2 changed files with 66 additions and 5 deletions

View File

@@ -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();

View File

@@ -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");
}
}