通常,traceId在线程中是一致的。
如果某些动作,是新开线程去执行,那么执行的代码的traceId 和 调用着就不一样,这样就没法串起来了。
sw官方,提供了一个注解
TraceCrossThread
并用几个例子,说明改如何做,可以使子线程执行中 打印的日志,traceId和父线程一致。
我用过的是以下这种
ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(CallableWrapper.of(new Callable<String>() {
@Override public String call() throws Exception {
return null;
}
}));
就是使用CallableWrapper包装,可以看出,这个类,也是使用了TraceCrossThread这个注解。
同理还有runnable的封装。
参考
https://skywalking.apache.org/docs/skywalking-java/v8.8.0/en/setup/service-agent/java-agent/application-toolkit-trace-cross-thread/