Apache Camel在OpenTelemetry环境下未正确传递traceparent问题
问题描述
我有一个基于Spring Boot的Apache Camel应用,用来从Kafka Topic读取消息。在编写Spring Boot测试时,我通过KafkaTemplate向嵌入式Kafka Broker发送消息,并手动添加了OpenTelemetry的traceparent头。但调试路由时发现,traceparent头的值和我通过KafkaTemplate设置的不一致。我已经添加了Camel与OpenTelemetry所需的依赖库,但问题仍然存在。
代码示例:
KafkaTemplate<String, ByteArray> producer.send(ProducerRecord( topic, identifier, eventin.toByteArray() )).apply { headers().add(RecordHeader("traceparent", "00-mytrace-b7ad6b7169203331-01".toByteArray(UTF_8))) }
排查与解决方法
1. 修正ProducerRecord头的设置方式
你当前是在send方法返回的ListenableFuture实例上添加头,这不会作用到实际发送的消息上。正确的做法是在创建ProducerRecord时就配置好头信息:
val record = ProducerRecord<String, ByteArray>( topic, identifier, eventin.toByteArray() ).apply { headers().add(RecordHeader("traceparent", "00-mytrace-b7ad6b7169203331-01".toByteArray(UTF_8))) } producer.send(record)
2. 禁用Camel Kafka组件的自动OpenTelemetry追踪
Camel Kafka组件默认会集成OpenTelemetry,消费消息时会自动生成或覆盖traceparent头。如果需要手动指定追踪上下文,可禁用该自动功能:
- 通过配置文件:
camel.component.kafka.otel-enabled=false
- 通过Java配置类:
@Bean public KafkaComponent kafkaComponent() { KafkaComponent component = new KafkaComponent(); component.setOtelEnabled(false); return component; }
3. 临时禁用OpenTelemetry的Kafka Instrumentation
如果应用中配置了OpenTelemetry的Kafka Instrumentation,它会自动为生产者/消费者处理traceparent头。测试时可临时禁用:
@SpringBootTest(properties = { "otel.instrumentation.kafka.enabled=false" })
4. 检查Camel路由是否修改了头
排查路由中是否存在自定义Processor、过滤器或其他组件修改traceparent头。可在路由中添加日志输出,追踪头的变化:
from("kafka:{{kafka.topic}}") .log("Received traceparent: ${header.traceparent}") // 后续路由逻辑
内容的提问来源于stack exchange,提问作者TheCoder
相关产品推荐
相关产品推荐

