调用链追踪

# 1. 调用链追踪

DeepFlow 通过调用链追踪将一次调用涉及到的应用 Span、系统 Span 及网络 Span 都在一张火焰图中呈现,真正让业务开发团队、框架开发团队、服务网格运维团队、容器运维团队、DBA 团队、云运维团队多部门在一个平台协作起来。

# 1.1 总览介绍

调用链追踪功能页面中的一个调用发起追踪操作,然后通过右滑框的形式展现,此图为链路调用追踪的展示方式,如下图所示。

注: 调用链追踪的火焰图和拓扑图暂时不支持加入视图
1

00-总览

00-总览

调用追踪右滑框分三部分:头部信息、数据可视化、调用信息数据列表

  • ① 头部信息: 展示链路的基本信息,如客户端,服务端,开始请求时间,持续时间,请求类型,请求资源等
  • ① 数据可视化: 调用追踪 Span 数据以火焰图方式展示或调用追踪的服务以拓扑图的方式展示
  • ② 调用信息数据列表: 展示调用的关联信息

# 1.1.1 火焰图

01-火焰图

01-火焰图

火焰图由多个条状 bar组成,每个条状 bar代表一个 Span,x 轴以时间为维度,y 轴以调用堆栈深度为维度,按 Span 调用的顺序从上到下进行展示,下面将进行详细的介绍:

  • 长度: 结合 x 轴,表达的是一个 Span 的执行时间,两端分别对应这个开始时间及结束时间
  • 服务列表: 展示每个服务消耗的时延占比,点击服务可与火焰图联动,高亮服务对应的 Span
    • 颜色: 应用 Span 与系统 Span 为每一个服务代表一种颜色;所有的网络 Span 都为灰色(因为网络 Span 不属于任何一个服务)
  • 显示信息: 条状 bar 的显示信息图标+调用信息+执行时间组成
    • 图标: 通过图标来区分不同类型的 Span
      • A: 应用 Span,通过 Opentelemetry 协议收集的 Span,覆盖业务代码、框架代码
      • S: 系统 Span,通过 eBPF 零侵入采集的 Span,覆盖系统调用、应用函数(如 HTTPS)、API Gateway、服务网格 Sidecar
      • N: 网络 Span,通过 BPF 从网络流量中采集的 Span,覆盖 iptables、ipvs、OvS、LinuxBridge 等容器网络组件
    • 调用信息: 不同 Span 展示的调用信息略有不同
      • 应用 Span 和系统 Span:应用协议请求类型请求资源
      • 网络 Span:观测点
    • 执行时间: Span 从开始到结束消耗的所有时间
  • 操作: 支持悬停点击
    • 悬停: 悬停到 Span,以 TIP 的形式展示调用信息+实例信息+执行时间
      • 实例信息: 应用 Span 展示的是服务+资源实例;系统 Span 展示的是进程+资源实例;网络 Span 展示的是网卡+资源实例
      • 执行时间: 展示了 Span 的整个执行时间,即自身执行时间的占比
    • 点击: 点击 Span,高亮自身及父 Span,也可查看被点击 Span 的详细信息
  • 收起侧边栏: 点击后支持将服务列表收起

# 1.1.2 调用拓扑图

02-调用拓扑图

02-调用拓扑图

调用拓扑图将数据进行有序结构化展示,数据以服务聚合为节点,每个节点之间用水平竖的折线将 Span 之间的父子关系展示出其请求调用关系,下面将进行详细的介绍:

  • 节点: 对应到火焰图中服务列表的服务,将同一个服务下的一个或者多个 Span 聚合为一个节点,并展示该服务在调用链中所用耗时
    • 显示信息: 以方形节点显示信息图标+调用信息+自身耗时组成
      • 图标: 通过图标来区分不同类型的 Span,使用详情,请参阅【火焰图】章节
    • 自身耗时:服务所对应的一个或多个 Span 的耗时总和
  • 路径: 对应火焰图中的父Span子Span的关系进行拓扑路径绘制
  • 操作: 支持悬停点击,使用详情,请参阅【火焰图】章节

# 1.1.3 下方 Tab

# 1.1.3.1 调用详情

通过列表的形式展示火焰图中 Span 的详情信息,点击火焰图的 Span 则对应的调用详情会在列表高亮;反之,点击列表中的行则能高亮对应的 Span。

调用详情

调用详情

# 1.1.3.2 IO 事件

点击火焰图中系统 Span 时,如果系统 Span 对应的进程存在 IO 读写事件时,则可以查看对应的 IO 事件。通过 IO 事件 Tab 可快速的查看 Span 对于文件读写消耗的时间。

IO 事件

IO 事件

① 第一行: 叠加下面所有线程的 IO 事件块,重叠越多,颜色越重。 ② 线程行: 展示每个线程的 IO 事件,每一个块对应一个事件,块的长度根据 IO 事件的开始时间与结束时间计算而来

  • Tip:由文件名称+IO 事件类型+事件持续时间组成 ③ 详情信息: 展示 IO 事件的详情

# 1.1.3.3 流日志

点击火焰图中网络 Span 时,分析调用日志对应时间段流日志的时延数据。

流日志

流日志

① 状态行: 确定观测点、流持续时间以及流日志状态 ② 时延: 可分析网络相关时延,包含 TCP 建连时延、TLS 建连时延、平均数据时延、平均系统时延、平均客户端等待时延。时延的计算方式可参考指标示意图

# 1.1.3.4 Span 溯源

当需要分析火焰图中的 Span 为什么存在时,可使用 Span 溯源功能。点击火焰图中 Span 时,通过列表的形式展示与其他 Span 的关联关系。DeepFlow 的分布式追踪是根据一系列 ID 来计算完成的,包含 TraceID、SpanID、ParentSpanID、请求 X-Request-ID、响应 X-Request-ID、请求 Syscall TraceID、响应 Syscall TraceID、请求 TCP Seq 号、响应 TCP Seq 号,当 ID 存在关联关系时,Span 之间就能关联显示在一张火焰图中,其中 ID 的关联关系在列表中会通过紫色标注出来。

Span 溯源

Span 溯源

① 被点击 Span: 火焰图被点击 Span ① 关联 Span: 与被点击 Span 存在关联关系的 Span

# 1.1.4 火焰图快速理解

火焰图示例

火焰图示例

火焰图从左到右代表了时间的流逝,在上图的样例调用链中,一次业务请求的完整处理经过了如下过程:

  • (1) 「Client」进程发起了 http get 请求,经过多个网卡的传输到达「前端服务」;
  • (2) 「前端服务」为了完成此次业务处理,首先向「DNS 服务」发起 dns query,并经过网络传输到达「DNS 服务」;
  • (3) 「DNS 服务」对 query 进行处理,向「前端服务」返回 dns response,经网络传输到达「前端服务」;
  • (4) 「前端服务」继续发起 sql 查询,经过网络传输到达「MySQL 服务」;
  • (5) 「MySQL 服务」经过查询处理,向「前端服务」返回 sql 响应,并经过网络传输到达「前端服务」;
  • (6) 「前端服务」继续发起 rpc 请求,经过网络传输到达「RPC 服务」;
  • (7) 「RPC 服务」经过处理,返回 rpc 响应,并经过网络传输到达「前端服务」;
  • (8) 「前端服务」收到 rpc 响应后,向「Client」回复最终的 http 响应,并经过网络传输最终到达「Client」。

任意两个 Span 的长度的差值,表征了两个位置之间引入的时延量。

# 1.1.5 火焰图分析示例

  • 示例1:网络 Span 间差值明显

在下图中两个网络 Span 之间的差值明显,即说明调用数据包在 2 个网卡之间传递出现了明显时延。如果 2 个网卡分别为「客户端容器节点」、「服务端容器节点」,则说明慢响应的根源是容器节点间的转发网络。

慢调用火焰图示例 1-网络 Span差值明显

慢调用火焰图示例 1-网络 Span差值明显

  • 示例2:系统 Span 间差值明显

在下图中「前端服务」两个系统 Span 之间的差值明显,即说明慢响应根源在「前端服务」进程处理过程。

慢调用火焰图示例 2-系统间 Span差值明显

慢调用火焰图示例 2-系统间 Span差值明显

  • 示例3:末端系统 Span 长度明显

在下图中「DNS 服务」的长度明显,即说明慢响应源自「DNS 服务」进程处理过程。

慢调用火焰示例 3-末端系统 Span长度明显

慢调用火焰示例 3-末端系统 Span长度明显