一、问题
使用CompletableFuture异步调用时zipkintraceId无法跟踪并且feign调用链路也跟踪不到
|
二、解决方案
1.增加zipkin装饰器
|
1.自定义线程池,将装饰器放入线程池中
|
3.CompletableFuture指定自定义线程池
CompletableFuture.supplyAsync(() -> downloadAndUploadFile(reqDto.getBankAccountFileId()), asyncImgExecutor)
@Component
public class ZipkinHelper {
@Autowired
private Tracer tracer;
public ZipkinHelper() {
}
public Runnable wrap(Runnable runnable) {
Span currentSpan = this.tracer.currentSpan();
return () -> {
SpanInScope scope = this.tracer.withSpanInScope(currentSpan);
Throwable var4 = null;
try {
Span span = this.tracer.nextSpan();
MDC.put("X-B3-TraceId", span.context().traceIdString());
MDC.put("X-B3-SpanId", span.context().spanIdString());
MDC.put("X-B3-ParentSpanId", span.context().parentIdString());
span.name("new_thread_started").kind(Kind.SERVER).tag("thread_id", Thread.currentThread().getId() + "").tag("thread_name", Thread.currentThread().getName() + "");
span.start();
try {
SpanInScope ws = this.tracer.withSpanInScope(span);
Throwable var7 = null;
try {
runnable.run();
} catch (Throwable var44) {
var7 = var44;
throw var44;
} finally {
if (ws != null) {
if (var7 != null) {
try {
ws.close();
} catch (Throwable var43) {
var7.addSuppressed(var43);
}
} else {
ws.close();
}
}
}
} catch (Error | RuntimeException var46) {
span.error(var46);
throw var46;
} finally {
span.finish();
}
} catch (Throwable var48) {
var4 = var48;
throw var48;
} finally {
if (scope != null) {
if (var4 != null) {
try {
scope.close();
} catch (Throwable var42) {
var4.addSuppressed(var42);
}
} else {
scope.close();
}
}
}
};
}
public <T> Callable<T> wrap(Callable<T> callable) {
Span currentSpan = this.tracer.currentSpan();
return () -> {
SpanInScope scope = this.tracer.withSpanInScope(currentSpan);
Throwable var4 = null;
Object var8;
try {
Span span = this.tracer.nextSpan();
MDC.put("X-B3-TraceId", span.context().traceIdString());
MDC.put("X-B3-SpanId", span.context().spanIdString());
MDC.put("X-B3-ParentSpanId", span.context().parentIdString());
span.name("new_thread_started").kind(Kind.SERVER).tag("thread_id", Thread.currentThread().getId() + "").tag("thread_name", Thread.currentThread().getName() + "");
span.start();
try {
SpanInScope ws = this.tracer.withSpanInScope(span);
Throwable var7 = null;
try {
var8 = callable.call();
} catch (Throwable var45) {
var8 = var45;
var7 = var45;
throw var45;
} finally {
if (ws != null) {
if (var7 != null) {
try {
ws.close();
} catch (Throwable var44) {
var7.addSuppressed(var44);
}
} else {
ws.close();
}
}
}
} catch (Error | RuntimeException var47) {
span.error(var47);
throw var47;
} finally {
span.finish();
}
} catch (Throwable var49) {
var4 = var49;
throw var49;
} finally {
if (scope != null) {
if (var4 != null) {
try {
scope.close();
} catch (Throwable var43) {
var4.addSuppressed(var43);
}
} else {
scope.close();
}
}
}
return var8;
};
}
}