Spring cloud Sleuth 开始新的跟踪而不是在单个跟踪中继续跨度

Spring cloud Sleuth starts a new trace instead of continuing spans in a single trace

我有 4 个 spring-引导应用程序(A、B、C 和 D)。 一笔交易的生命周期如下:

  1. 应用程序 A 是一个 kafka 流应用程序,它最终生成一个主题是 由应用程序 B 使用。
  2. 应用程序 B 然后使用 @KafkaListener 从主题中消费,进行一些处理,然后使用 spring 的 jmsTemplate 生成到 IBMMQ 队列。
  3. 作为@JMSListener 的应用程序 C 从上述队列中消费并生成到另一个 使用 spring 的 JMSTemplate 排队。
  4. 再次是@JmsListener 的应用程序 D 从上述队列中使用,然后生成一个 kafka 主题,该主题再次被应用程序 A 使用

现在,对于单个事务,我希望在所有四个应用程序中进行单个跟踪,但我却得到了

  1. 从应用程序 A 到应用程序 B 的一个跟踪(它在其中生成到 IBM MQ)
  2. 从应用程序 C 开始到应用程序 A 结束的一条跟踪

我会上传图片来显示 zipkin 跨度,但由于某些原因我无法这样做。

以上所有应用程序都是 Spring 启动应用程序,它们利用 spring-cloud-sleuth 来生成事务跟踪。我依赖 spring 引导的自动配置,这些是我在所有应用程序中设置的属性:

  zipkin:
   enabled: ${ZIPKIN_ENABLED:false}
   sender:
    type: kafka
   baseUrl: ${ZIPKIN_URL:http://localhost:9411}
   service:
    name: ${spring.application.name}
 sleuth:
  messaging:
   kafka:
    enabled: true
   jms:
    enabled: true

我无法理解这里到底发生了什么。为什么跨度分散在 2 条轨迹上而不是一条轨迹上?

我正在使用 spring-boot 2.3.3 和 spring-cloud-dependencies Hoxton.SR8。

所以是应用程序 B 没有传递 header。结果 queue uri 有一个 属性 targetClient 被设置为 1。uri 类似于

queue:///DESTINATION_QUEUE?targetClient=1

现在我还不是 IBM MQ 专家,但是 documentation 声明将此 属性 设置为 1 意味着 Messages do not contain an MQRFH2 header. 我将其切换为 0 瞧,所有跨度就位。