skywalking agent改造支持多线程traceId不丢失

332 阅读1分钟

skywalking agent改造支持多线程traceId不丢失

一、项目背景

希望多线程环境,traceId可以传递.且需要我们做到无侵入

二、解决方法

 

skywalking的解决方案

skywalking.apache.org/docs/skywal…

skywllking agent 通过@TraceCrossThread来识别是否跨线程传递id 可以在agent中改造选择指定类增强

原理如下

juejin.cn/post/711058…

 

 

transmittable-thread-local阿里的跨线程传递方法

gitcode.net/mirrors/ali…

将skywalking agent的trace的threadlocal改为transmittable-thread-local 实现跨线程传递

  三者关系为继承和增强关系

 

三、解决方法与注意

解决方法

将skywalking agent的trace的threadlocal改为transmittable-thread-local 实现跨线程传递,同时使用挂载transmittable-thread-local 的方法实现无侵入的加强线程,具体如下

-javaagent:C:\Users\jiawei.wang03\Desktop\transmittable-thread-local-2.14.3\target\transmittable-thread-local-2.14.3.jar=ttl.agent.logger:STDOUT -javaagent:C:\Users\jiawei.wang03\Desktop\skywalking-java-8.16.0\skywalking-agent\skywalking-agent.jar -Dskywalking.agent.service_name=GoodsApplication -Dskywalking.collector.backend_service=172.16.37.108:11800 

如果没有跨线程的traceId传递需求,可以选择不挂载transmittable-thread-local,但agent 的threadlocal改为transmittable-thread-local,而transmittable-thread-local继承于InheritableThreadLocal,仍可以实现父子线程之间traceId传递

注意

TTL agent与其他agent共用时,TTL agent必须放在最前面;

否则会导致jdk线程池修饰失败,TTL失去作用。

解决方法

因为Skywalking Agent的入口逻辑(premain)包含 线程池 的启动,导致

  • 到了TTL Agent(的premain)时,TTL需要加强的线程池类已经加载(load)了。
  • 而TTL Agent的TtlTransformer是在类加载时触发类的增强;如果类已经加载了会跳过TTL Agent的增强逻辑。

详细如下

github.com/alibaba/tra…