前言

在之前写过一篇 关于全链路日志实现学习笔记,其中讲述了zipkin以及sleuth,通过spanId跟traceId进行全链路监控。

SpanId

跨越id,来标识一个请求流经不同的领域。
蚂蚁金服分布式链路系统SOFATracer学习笔记

traceId

一个请求的标识。

SOFATracer

基于 SLF4J MDC 的扩展能力

可以通过MDC来设置日志的变量输出,再结合logback.xml配置,输出到日志中。

蚂蚁金服分布式链路系统SOFATracer学习笔记

OpenFegin改造

其实一开始我有点懵逼,为啥调用了就会打印日志?我们一步一步看吧。

为啥会调用就打印

Logger

蚂蚁金服分布式链路系统SOFATracer学习笔记
在调用logRequest的时候会进行打印操作。所以说SOFATracer很多操作都是把spanId跟traceId储存在Request的header里头。

蚂蚁金服分布式链路系统SOFATracer学习笔记
蚂蚁金服分布式链路系统SOFATracer学习笔记
蚂蚁金服分布式链路系统SOFATracer学习笔记
就是在调用的时候,通过代理类进行执行方法了。

SOFATracer对各框架集成的核心实现代码

核心代码

SofaTracer
蚂蚁金服分布式链路系统SOFATracer学习笔记

不同框架只是实现不同的逻辑,但是最后还是调用inject来进行注入载体。
蚂蚁金服分布式链路系统SOFATracer学习笔记

fegin

蚂蚁金服分布式链路系统SOFATracer学习笔记
创建Client
蚂蚁金服分布式链路系统SOFATracer学习笔记
实现Client,set tags
蚂蚁金服分布式链路系统SOFATracer学习笔记
Span信息注入载体
蚂蚁金服分布式链路系统SOFATracer学习笔记

RestTemplate

通过ClientHttpRequestInterceptor拦截起来进行spanId以及traceId的传递。
蚂蚁金服分布式链路系统SOFATracer学习笔记
蚂蚁金服分布式链路系统SOFATracer学习笔记
蚂蚁金服分布式链路系统SOFATracer学习笔记
在上面RestTemplateInterceptor里头进行appendRestTemplateResponseSpanTags的设置tags.

跨线程透传原理

比如说两个Runnable,它会将自己的spanId,traceId传到另一个线程去

蚂蚁金服分布式链路系统SOFATracer学习笔记
通过ThreadLocal来储存Span信息
蚂蚁金服分布式链路系统SOFATracer学习笔记

思考

我上次写了下面这篇文章,感觉还是可以解决很多异步传值的情况。

线程池传值

异步场景如何记录到traceId

原理:重写线程池,在run方法上进行MDC的设置。将父线程的值传给子线程。

参考资料

相关文章: