链路追踪

随着业务规模和深度的拓展,微服务中的业务可能横跨多个应用,依赖的中间件也越来越多,其中一个节点出现问题,都可能导致整个业务请求出现波动或异常。

全链路追踪能够分布式地抓取多个节点的业务记录,并且通过统一的请求 ID 将一次请求过程中的各个节点记录串联起来,方便排查请求过程中的业务瓶颈或异常点。

链路追踪 - 图1

点击 查看详情 可查看具体的链路信息。

链路追踪 - 图2

  • Trace:一次调用的完整记录,由多个 Span 组成。

  • Span:一次调用中的某个节点或步骤,类似于一层堆栈信息。Span 之间存在父子或并列关系以表明 Span 在整个调用中的生命周期。

    :::tip 提示

    点击链路图中的 Span 节点可查看调用过程中的关键信息。

    :::

服务每次与外界交互时都会生成一个 Span,例如,服务接收到一个请求,服务发起一次 RPC 调用,服务发起一次 DB 调用。

  1. A ------------- Span1 ---------------
  2. A ---- Span2 ------
  3. B --- Span3 ---
  4. A --- Span4 --

如上图所示:

  • 服务 A 收到一个请求会生成一个 Span 1。
  • 服务 A 发起一个 RPC 请求调用服务 B 会生成一个 Span 2,其父 Span 为 Span 1。
  • 服务 B 收到服务 A 的 RPC 请求后生成 Span 3,其父 Span 为 Span 2。 两者的开始/结束时间差即网络耗时。
  • 服务 A 收到 RPC 响应后发起 DB 调用会再生成一个 Span 4,其父 Span 为 Span 1,其兄弟 Span 为 Span 2,Span 4 与 Span 2 为平级关系。

此外,使用 SDK 可在代码中获取当前链路的 requestId。

  1. <dependency>
  2. <groupId>io.terminus.erda</groupId>
  3. <artifactId>monitor_sdk</artifactId>
  4. <version>1.0.0</version>
  5. </dependency>
  1. Config config = ConfigManager.getConfig();
  2. String requestId = config.getRequestId();