问题:
[org.springframework.kafka.KafkaListenerEndpointContainer#30-kafka-consumer-1]警告o.a.k.c.consumer.internals.Fetcher-为主题分区获取数据时出现未知错误
环境设置:
- Kafka版本:Kafka_2.11-1.00
-
Producer详细信息:
Spring Boot版本:2.5.0
Kafka客户端:2.7.1 -
消费者详细信息:
Spring Boot版本:1.5.19.发布
Kafka客户端:0.10.0.1 - DataDog
场景1:
我们知道Kafka旧版本不支持消息头,所以我们没有在生产者中设置任何消息头。所以,若我们在没有数据狗的情况下运行应用程序,并且当我们发布来自生产者的消息时,消费者能够消费消息。
结论:有了混合卡夫卡版本,没有了数据狗,消费者和生产者都工作得很好。
场景2:
添加数据狗后,消息不会传递给消费者,在消费者端,我们可以看到异常:[org.springframework.cafka.KafkaListenerEndpointContainer#30-kafka-consumer-1]WARN o.a.k.c.consumer.internals.Fetcher-为主题分区获取数据时出现未知错误
当检查Kafka服务器日志时,我们可以看到Magic V1错误。java.lang.IollegalArgumentException:Magic v1不支持记录头
结论:有了添加消息头的datadog,消息就不会传递给消费者。
解决方案(但不起作用)在浏览了数据狗文档后,我找到了这个问题的解决方案,它是:https://docs.datadoghq.com/fr/tracing/compatibility_requirements/java/在"网络跟踪"部分下提供以下功能:
Datadog文档:Kafka/Datadog集成适用于支持Header API的Kafka 0.11+版本。此API用于注入和提取跟踪上下文。如果您使用的是混合版本环境,Kafka broker可能会错误地传递最新版本的Kafka,然后绘图仪会尝试注入本地生产者不支持的头。此外,由于存在标头,较老的使用者无法使用消息。为了避免这些问题,如果您使用0.11之前的Kafka版本的混合版本环境,请使用以下环境变量禁用排列的上下文:DD_KAFKA_CLIENT_PROPAGATION_ENABLED=false
。
因此,我们在windows上使用以下命令添加并运行应用程序和数据狗代理(添加了标志Ddd.kafka.client.propagation.enabled=false
):
java -javaagent:D:ToolsDatadogdd-java-agent-0.9.0.jar -Ddd.profiling.enabled=true -XX:FlightRecorderOptions=stackdepth=256 -Ddd.logs.injection=true -**Ddd.kafka.client.propagation.enabled=false** -Ddd.trace.sample.rate=1 -Ddd.service=my-app -Ddd.env=staging -jar -Dspring.profiles.active=local-postgres <Application Jar File> -Ddd.version=1.0
预期行为:数据狗不应添加标头。
实际行为:数据狗仍在添加标头,因此我们仍会收到Magic V1错误。
请请求帮助那些面临类似问题的人,如果你解决了问题,请提供指导
我们也遇到了类似的问题,我们想使用Datadog代理,但不想使用Kafka集成。相反,我们希望对跨度注入有更多的控制。设置DD_KAFKA_CLIENT_PROPAGATION_ENABLED=false
没有禁用Datadog逻辑;然而,设置DD_TRACE_CLASSES_EXCLUDED
环境变量确实:
DD_TRACE_CLASSES_EXCLUDE="org.apache.kafka.clients.producer.KafkaProducer,org.apache.kafka.clients.consumer.ConsumerRecords"
有了这个环境变量集,不应该启用Datadog代码,因此不会向Kafka标头添加任何内容。我假设等效的系统属性dd.trace.classes.exclude
将具有相同的效果。
相关Datadog文档:https://docs.datadoghq.com/tracing/setup_overview/setup/java/?tab=containers相关数据狗代码:
- 制作人:https://github.com/DataDog/dd-trace-java/blob/069ffa9a637bd4bffce1bbb80e089e26a95adaeb/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaProducerInstrumentation.java#L38
- 消费者:https://github.com/DataDog/dd-trace-java/blob/069ffa9a637bd4bffce1bbb80e089e26a95adaeb/dd-java-agent/instrumentation/kafka-clients-0.11/src/main/java/datadog/trace/instrumentation/kafka_clients/KafkaConsumerInstrumentation.java#L30