You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:12:09