NOTE
2.9 如何设计链路追踪
1. 什么是链路追踪 记录一个请求的全部流程。用来查看请求经过了哪些节点,每个节点的耗时 2. 为什么需要链路追踪 能快速定位一个请求在整个链路上哪个节点出了问题 3. 如何实现链路追踪 3.1. 上报什么数据 3.1.1. Span 3.1.1.1. Span是什么 - 每调用一个模块就生成一个S
这是历史学习笔记,可能存在过时或不完整的理解。
1. 什么是链路追踪
记录一个请求的全部流程。用来查看请求经过了哪些节点,每个节点的耗时
2. 为什么需要链路追踪
能快速定位一个请求在整个链路上哪个节点出了问题
3. 如何实现链路追踪
3.1. 上报什么数据

3.1.1. Span
3.1.1.1. Span是什么
- 每调用一个模块就生成一个Span,每个Span包含的信息有Span名称、Span ID、父Span ID
- 有了Span ID可以知道调用的顺序
- 有了父Span ID可以知道层级关系
3.1.1.2. 为什么需要Span
- 一个链路经过多个模块,Span用来标识一个模块的请求
3.1.2. Trace
3.1.2.1. Trace是什么
- 每次调用的最开始生成Trace,Trace包含的信息有Trace ID
- 有了Trace ID可以跟踪完成的请求
- Trace 和 Span 存在一对多的关系,Span 与 Span 之间存在父子关系
3.1.2.2. 为什么需要Trace
- 一个链路经过多个模块,Trace用来标识整个链路
3.1.3. Annotation
3.1.3.1. Annotation是什么
- 在每一个Span上自定义的附加数据,比如时间戳
- cs:Client Sent。客户端发起一个请求的时间戳
- sr:Server Received。服务端收到请求的时间戳。sr-cs=网络延迟
- ss:Server Sent。服务端请求处理完成,返回客户端的时间戳。ss-sr=服务端处理请求需要的时间
- cr:Client Received。客户端成功接收到服务端响应的时间戳。 cr-cs=客户端从服务端获取响应的所需时间
3.1.3.2. 为什么需要Annotation
- 存储Span的扩展信息
3.1.4. 服务信息
- IP、Host、服务名、接口名、被调还是主调
3.2. 数据采样率
- 根据流量的大小,动态对采样阈值进行调整。比如可以写在远程配置中
3.3. 如何获取数据
3.3.1. 基于日志的追踪
- 将Trace、Span等信息输出到应用日志中,将所有机器的日志汇聚在一起后,反推出调用链路
- 比如Spring Cloud Sleuth
- 优点:侵入性低、性能高
- 缺点:日志可能丢失导致精度差
3.3.2. 基于服务的追踪
- 通过某种手段给服务注入探针,探针可以监控服务收集数据,然后通过HTTP或者RPC调用发送给追踪系统
- RPC框架支持Filter,写一个被调+主调的Filter,从RPC请求的Header里面取出数据即可
- 比如Naver的Pinpoint、SkyWalking
- 优点:稳定性高,侵入性低
- 缺点:性能低
3.3.3. 基于边车模式的追踪
- 服务网格的专属方案
- 比如Envoy
- 优点:稳定性高、性能高、侵入性低
- 缺点:没有普及
3.4. 数据存储在哪
- MySQL
- 
3.5. 数据如何展示
4. 链路追踪组件
4.1. Google Dapper
4.2. Open Zipkin
- zipkin.md(原链接已失效)
4.3. CAT
- 客户端
- 服务端
-
4.4. Open Tracing
- CNCF技术委员会定义了调用链的API标准

4.5. Open Census
- Google定义的调用了的API标准,并且得到了Microsoft的支持
4.6. Open Telemetry
- CNCF技术委员会和Google握手言和,定义的调用链的API标准
4.7. Spring Cloud Sleuth
- Sleuth.md(原链接已失效)


