返回

链路追踪失效怎么办?sleuth版本升级后X-B3-TraceId:打印不出来了?

后端

Sleuth 3.1.3 版本当中 X-B3-TraceId 消失之谜

链路追踪是分布式系统中的重要组成部分,它能够帮助我们追踪服务之间的调用关系,从而快速定位问题,提高系统稳定性。Sleuth 是 Spring Cloud 生态系统中常用的链路追踪工具,它提供了简单易用的链路追踪解决方案。

然而,随着 Sleuth 版本的更新,一些用户遇到了新的问题:Sleuth 版本升级为 3.1.3 后,链路追踪 X-B3-TraceId 不再打印,导致链路追踪功能失效,给开发者的调试工作带来不便。

问题分析

X-B3-TraceId 是 Sleuth 用来标识请求的唯一 ID,它的作用类似于 HTTP 协议中的 requestId。当请求在分布式系统中流转时,X-B3-TraceId 会随请求一起传递,从而将不同服务之间的调用关系串联起来,形成完整的链路追踪数据。

在 Sleuth 3.1.3 版本中,X-B3-TraceId 的打印逻辑发生了变化,导致了某些情况下 X-B3-TraceId 不再被打印出来,这直接影响了链路追踪功能的正常使用。

解决方案

要解决这个问题,我们需要对 Sleuth 的配置进行调整。具体来说,我们需要在 application.yml 配置文件中添加如下配置:

spring:
  sleuth:
    sampler:
      probability: 1.0
    propagation:
      traceContext: b3
  • sampler.probability: 该配置项用于设置采样率,值范围为 0.0-1.0。采样率越高,被追踪的请求越多。为了确保所有的请求都被追踪,我们可以将该值设置为 1.0。
  • propagation.traceContext: 该配置项用于设置传播的上下文信息,可选值有 "b3" 和 "w3c"。对于 Sleuth 来说,默认值是 "b3",因此我们需要将其显式地设置为 "b3"。

验证结果

配置完成后,重新启动应用程序,并再次访问系统。此时,您应该可以看到 X-B3-TraceId 再次出现在日志中,并且链路追踪功能也恢复了正常使用。

总结

Sleuth 版本升级后 X-B3-TraceId 打印不出来的原因是 Sleuth 3.1.3 版本中 X-B3-TraceId 的打印逻辑发生了变化。要解决这个问题,我们需要在 application.yml 配置文件中添加配置项 spring.sleuth.sampler.probabilityspring.sleuth.propagation.traceContext,并将它们的取值分别设置为 1.0 和 "b3"。

常见问题解答

  1. 为什么 X-B3-TraceId 在 Sleuth 3.1.3 版本中不再打印?
    答:这是因为 Sleuth 3.1.3 版本中 X-B3-TraceId 的打印逻辑发生了变化。

  2. 如何解决 X-B3-TraceId 不打印的问题?
    答:在 application.yml 配置文件中添加如下配置:

    spring:
      sleuth:
        sampler:
          probability: 1.0
        propagation:
          traceContext: b3
    
  3. 配置项 sampler.probabilitypropagation.traceContext 的作用是什么?
    答:sampler.probability 用于设置采样率,确保所有的请求都被追踪。propagation.traceContext 用于设置传播的上下文信息,对于 Sleuth 来说,默认值是 "b3"。

  4. 如何验证解决方案是否有效?
    答:重新启动应用程序,并再次访问系统。此时,您应该可以看到 X-B3-TraceId 再次出现在日志中,并且链路追踪功能也恢复了正常使用。

  5. Sleuth 的哪些版本受此问题影响?
    答:仅 Sleuth 3.1.3 版本受此问题影响。