【发布时间】:2021-02-25 07:48:49
【问题描述】:
我有 4 个 spring-boot 应用程序(A、B、C 和 D)。 事务的生命周期如下:
- 应用程序 A 是一个 kafka 流应用程序,它最终生成一个主题,即 由应用程序 B 使用。
- 然后应用程序 B 使用 @KafkaListener 从主题中消费,进行一些处理,然后使用 spring 的 jmsTemplate 生成到 IBMMQ 队列。
- 作为@JMSListener 的应用程序C 从上述队列消费并产生到另一个 使用 spring 的 JMSTemplate 进行队列。
- 同样是@JmsListener 的应用程序 D 从上述队列中消费,然后生成一个 kafka 主题,该主题再次被应用程序 A 消费
现在对于单个事务,我希望在所有四个应用程序中进行单个跟踪,但我得到了
- 从应用程序 A 开始到应用程序 B 的一条跟踪(它生成到 IBM MQ)
- 从应用程序 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