Quarkus集成OpenTracing实现Kafka消息透传时traceId不一致问题
问题解决方案
出现traceId不匹配是手动配置的Kafka链路拦截器与Quarkus内置的Reactive Messaging链路处理逻辑冲突导致,按以下步骤调整即可:
- 第一步:移除生产者、消费者配置中手动添加的TracingProducerInterceptor、TracingConsumerInterceptor配置项,Quarkus smallrye-opentracing扩展已经内置了Reactive Messaging场景下的链路上下文注入能力,额外添加的客户端拦截器会导致上下文处理冲突。
- 第二步:删除消费者
process方法上的@Traced注解,该注解默认会为方法调用创建全新链路,直接覆盖了从Kafka消息头中提取的原有链路上下文。 - 第三步:在生产者和消费者的配置文件中新增开启Reactive Messaging链路追踪的开关:
quarkus.opentracing.mp.messaging.enabled=true
- 第四步:补全Kafka消息序列化/反序列化配置,在生产者配置中添加:
mp.messaging.outgoing.people.value.serializer=com.example.PersonSerializer
在消费者配置中添加:
mp.messaging.incoming.people.value.deserializer=com.example.PersonDeserializer
调整完成后重启两个服务,再次调用生产者接口即可看到消费者日志打印的traceId与生产者完全一致,仅spanId为消费链路生成的子span ID,满足全链路日志查询的需求。
内容的提问来源于stack exchange,提问作者Mihai P.
相关产品推荐
相关产品推荐

