- 介绍
- 解决方案一
- 解决方案二
- 在项目中,链路追踪是通过traceId去关联的,但当使用多线程的话,会出现不同线程之间traceId不一致情况,导致无法追踪;
- 以CompletableFuture为例,并行请求多个接口,子线程的日志无法通过父线程的traceId追踪,因为traceId是通过线程的ThreadLocal进行存储的,只能够在当前线程获取;
- 这里使用Skywalking的SupplierWrapper.of()方法解决:
CompletableFuture> futureSysUsers = CompletableFuture.supplyAsync(SupplierWrapper.of(() -> { }), asyncTaskExecutor);
- 依赖
解决方案二org.apache.skywalking apm-toolkit-trace
- 使用Brave提供的API,使用方法同上
brave.propagation.CurrentTraceContext#wrap(java.lang.Runnable)
brave.propagation.CurrentTraceContext#wrap(java.util.concurrent.Callable)
brave.propagation.CurrentTraceContext#executor
brave.propagation.CurrentTraceContext#executorService



