Spring Boot集成OpenTelemetry+Jaeger v2:Kafka Span未显示问题
核心排查与修复步骤
1. 补充Kafka专属Instrumentation依赖
当前仅引入opentelemetry-spring-boot-starter不足以自动捕获Kafka链路,需添加对应版本的Kafka客户端 instrumentation 依赖到pom.xml:
<dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-kafka-clients-2.6</artifactId> <scope>runtime</scope> </dependency>
注意:artifactId中的版本号需与项目实际使用的kafka-clients版本匹配(如用Kafka 3.0+则替换为
opentelemetry-kafka-clients-3.0),且需保证该版本与opentelemetry-instrumentation-bom的2.6.0版本兼容。此前手动添加kafka-clients导致项目结构异常,建议先移除手动添加的kafka-clients依赖,由Spring Boot依赖管理自动适配版本。
2. 修正配置参数
调整application.yml中的两处关键配置:
- 移除
resource.attributes下重复的service属性,仅保留service.name避免冲突:otel: resource: attributes: service.name: acq-txn-processor - 添加传播协议配置,明确使用W3C Trace Context确保链路传递:
otel: propagators: tracecontext,baggage
3. 规范Java Agent使用(若启用)
若使用Java Agent方式,必须保证agent版本与opentelemetry依赖版本完全一致(均为2.6.0),VM启动参数示例:
-javaagent:path/to/opentelemetry-javaagent-2.6.0.jar
注意:
opentelemetry-spring-boot-starter与Java Agent二选一即可,同时使用可能引发重复 instrumentation 问题。
4. 清理冲突依赖
移除所有micrometer-opentracing相关依赖,@NewSpan属于OpenTracing体系,与当前OpenTelemetry方案完全不兼容,会干扰链路捕获逻辑。
5. 验证Kafka客户端使用方式
确保代码中通过Spring Kafka的KafkaTemplate发送消息、@KafkaListener消费消息,而非手动创建KafkaProducer/KafkaConsumer实例——OpenTelemetry的自动 instrumentation 基于标准Kafka客户端拦截器实现,手动创建客户端会绕过拦截器导致Span丢失。
验证方法
- 重启服务后发送一条Kafka消息
- 在Jaeger UI中筛选
acq-txn-processor服务,检查是否出现kafka.producer/kafka.consumer类型的Span - 若问题仍存在,开启OpenTelemetry调试日志排查:
查看日志中是否有Kafka instrumentation初始化信息,或拦截器加载失败的报错。logging: level: io.opentelemetry: debug
内容的提问来源于stack exchange,提问作者lemelitaf

