Spring Boot服务2.x和3.0版本之间丢失traceId

问题描述 投票:0回答:3

我有多个使用 Spring Boot 2.7 运行的服务,并且我开始使用 Spring Boot 3.0 创建新服务。我遇到了与另一个问题相同的问题,但接受的解决方案和附加的迁移指南都不起作用。 请求期间的行为如下:

Service (2.7 - TraceId-X) -> Service (3.0 - TraceId-X) => OK
Service (3.0 - TraceId-X) -> Service (3.0 - TraceId-Y) => TraceId-X lost
Service (3.0 - TraceId-X) -> Service (2.7 - TraceId-Y) => TraceId-X lost

简而言之,当请求启动或通过 3.0 版本的服务时,

traceId
会丢失(已被新的替换)。

application.yml(2.7):

spring.sleuth.propagation.type: w3c,b3
spring.sleuth.traceId128: true
spring.sleuth.supportsJoin: false

application.yml(3.0):

logging.pattern.level: "%5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}]"

主要依赖的版本有: 2.7版本的服务:

  • 弹簧启动:2.7.7
  • spring-cloud-starter-sleuth:3.1.5

3.0版本服务:

  • 弹簧启动:3.0.6
  • 微米追踪:1.0.4
  • 微米追踪桥勇敢:1.0.4

我可以理解不同版本的服务之间存在集成问题,但Spring 3.0服务之间也存在集成问题。 配置中我可能缺少什么?

spring-boot spring-cloud-sleuth spring-micrometer micrometer-tracing
3个回答
5
投票

我不想回答自己的问题,但我找到了解决方案,也许它会对将来的某人有所帮助。

我没有意识到,在互联网上的大多数指南和教程中,他们使用

RestTemplate
在服务之间进行通信。就我而言,我正在使用
Feign
客户端。他们需要一个特定的库来
micrometer

<dependency>
  <groupId>io.github.openfeign</groupId>
  <artifactId>feign-micrometer</artifactId>
</dependency>

参考:https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#micrometer-support


3
投票

您还必须更新 Spring Boot 3 项目中的

propagation.type
属性。

management.tracing.propagation.type=b3

并且确保添加这些依赖项。

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>

<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
</dependency>

0
投票

以下解决方案对我有用。

应用程序 A 使用 Spring boot 3.x 来使用使用 Spring boot 2.7/x 的应用程序 B

应用程序 A 使用 RestClient 对应用程序 B 进行 HTTP 调用。

Spring boot 3.x 不直接支持 Sleuth,但可以通过 Micrometer Brave Tracing 来实现。

Micrometer 跟踪默认支持格式为 w3c,Spring Sleuth 支持格式为 b3。

为了正确的分布式跟踪,要在两个应用程序(应用程序 A 和应用程序 B)中添加相关属性

在应用程序A中, 依赖关系

  • org.springframework.boot:spring-boot-starter-actuator
  • io.micrometer:微米-追踪-bridge-brave

应用程序属性

  • 管理.跟踪.采样.概率=1.0

  • management.tracing.propagation.type=b3

  • management.tracing.brave.span-joining-supported=true

确保创建一个像下面这样的bean

@Bean public RestClient restClient(RestClient.Builder builder){ return builder.build();}

RestClient.Builder 应该位于 arg 中才能使其正常工作。不喜欢 RestClient.builder().build,因为它无法在传播过程中在标头中添加跟踪属性。

在应用程序B中, 应用程序属性 文件应具有

  • spring.sleuth.propagation.type=b3
  • spring.sleuth.traceId128=true
  • spring.sleuth.supportsJoin=false

上述配置可以很好地将跟踪 ID 从应用程序 A 传播到应用程序 B。

这不会中断,如果您有应用程序 C,它使用 2.7 来使用应用程序 B。

并且,如果应用程序 A 要调用也使用 3.x 的应用程序 D。建议更新App A属性management.tracing.propagation.type=b3,w3c(或)更新App D配置为management.tracing.propagation.type=b3

© www.soinside.com 2019 - 2024. All rights reserved.