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

1,389 阅读1分钟

前言

在之前写过一篇 关于全链路日志实现学习笔记,其中讲述了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信息 在这里插入图片描述

思考

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

线程池传值

异步场景如何记录到traceId

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

参考资料