【问题标题】:Spring cloud Sleuth starts a new trace instead of continuing spans in a single traceSpring cloud Sleuth 开始一个新的跟踪,而不是在单个跟踪中继续跨越
【发布时间】:2021-02-25 07:48:49
【问题描述】:

我有 4 个 spring-boot 应用程序(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 Boot 应用程序,它们使用 spring-cloud-sleuth 来生成事务跟踪。我依赖于 Spring Boot 的自动配置,这些是我在所有应用程序中设置的属性:

  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。

【问题讨论】:

  • 这很可能是与 JMS 模板集成相关的错误。我们为此使用 OpenZipkin Brave,所以它要么是 Sleuth 或 Brave 中的错误。您必须对此进行调试,以查看是否在出站消息中设置了跟踪标头,或者它们是否未在接收方传播。
  • 我可以看到,当应用程序 B 向 IBMMQ 生成消息时,它使用 b3 属性来执行此操作,例如 b3=00d37562420424e5-b78b8a0a2b6eb173-1,但是当应用程序 C 使用它时,消息中缺少它。另一方面,ApplicationC 向 IBMMQ 生产时,它在消息中具有类似的属性,而当 Application D 消费它时,该属性仍然存在。跨所有应用程序的所有 Spring JMS 组件的配置完全相同。似乎很微妙,我错过了某个地方。
  • 您可以尝试调试应用程序 c 及其接收方检测代码,以查看为什么标头未解析

标签: spring-boot ibm-mq spring-jms spring-cloud-sleuth zipkin


【解决方案1】:

所以是应用程序 B 没有传递标头。原来队列 uri 有一个属性 targetClient 设置为 1。uri 类似于

queue:///DESTINATION_QUEUE?targetClient=1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2021-09-03
    • 1970-01-01
    • 2017-09-28
    • 2020-11-25
    相关资源
    最近更新 更多