前言
在之前写过一篇 关于全链路日志实现学习笔记,其中讲述了zipkin以及sleuth,通过spanId跟traceId进行全链路监控。
SpanId
跨越id,来标识一个请求流经不同的领域。
traceId
一个请求的标识。
SOFATracer
基于 SLF4J MDC 的扩展能力
可以通过MDC来设置日志的变量输出,再结合logback.xml配置,输出到日志中。
OpenFegin改造
其实一开始我有点懵逼,为啥调用了就会打印日志?我们一步一步看吧。
为啥会调用就打印
Logger
在调用logRequest的时候会进行打印操作。所以说SOFATracer很多操作都是把spanId跟traceId储存在Request的header里头。
就是在调用的时候,通过代理类进行执行方法了。
SOFATracer对各框架集成的核心实现代码
核心代码
SofaTracer
不同框架只是实现不同的逻辑,但是最后还是调用inject来进行注入载体。
fegin
创建Client
实现Client,set tags
Span信息注入载体
RestTemplate
通过ClientHttpRequestInterceptor拦截起来进行spanId以及traceId的传递。
在上面RestTemplateInterceptor里头进行appendRestTemplateResponseSpanTags的设置tags.
跨线程透传原理
比如说两个Runnable,它会将自己的spanId,traceId传到另一个线程去
通过ThreadLocal来储存Span信息
思考
我上次写了下面这篇文章,感觉还是可以解决很多异步传值的情况。
线程池传值
原理:重写线程池,在run方法上进行MDC的设置。将父线程的值传给子线程。