skywalking agent改造支持多线程traceId不丢失
一、项目背景
希望多线程环境,traceId可以传递.且需要我们做到无侵入
二、解决方法
skywalking的解决方案
skywalking.apache.org/docs/skywal…
skywllking agent 通过@TraceCrossThread来识别是否跨线程传递id 可以在agent中改造选择指定类增强
原理如下
transmittable-thread-local阿里的跨线程传递方法
将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的增强逻辑。
详细如下