NOTE

2.9 如何设计链路追踪

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

Software Architecture & Engineering创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 什么是链路追踪

记录一个请求的全部流程。用来查看请求经过了哪些节点,每个节点的耗时

2. 为什么需要链路追踪

能快速定位一个请求在整个链路上哪个节点出了问题

3. 如何实现链路追踪

3.1. 上报什么数据

![链路追踪](https://raw.githubusercontent.com/TDoct/images/master/1624786992_20210627174310340_26270.png =500x)

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. 数据存储在哪

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(原链接已失效)

4.8. CAT vs Zipkin vs Pinpoint

5. 参考