【发布时间】:2021-08-31 08:04:40
【问题描述】:
问题:
[org.springframework.kafka.KafkaListenerEndpointContainer#3-0-kafka-consumer-1] WARN o.a.k.c.consumer.internals.Fetcher - 获取主题分区数据的未知错误
环境设置:
- 卡夫卡版本: kafka_2.11-1.0.0
-
制片人详情:
Spring Boot 版本:2.5.0
卡夫卡客户端:2.7.1 -
消费者详情:
Spring Boot 版本:1.5.19.RELEASE
卡夫卡客户端:0.10.0.1 - 数据狗
场景 1:
我们知道 Kafka 旧版本不支持消息头,所以我们没有在生产者中设置任何消息头。因此,如果我们在没有 datadog 的情况下运行应用程序,并且当我们从生产者发布消息时,消费者可以消费消息。
结论:混合kafka版本,没有datadog,消费者和生产者工作正常。
场景 2:
添加数据狗后,消息不会传递给消费者,在消费者端我们可以看到异常:[org.springframework.kafka.KafkaListenerEndpointContainer#3-0-kafka-consumer-1] WARN o.a.k.c.consumer.internals.Fetcher - Unknown为主题分区获取数据时出错
当检查 Kafka 服务器日志时,我们可以看到 Magic V1 错误。 java.lang.IllegalArgumentException: Magic v1 不支持记录头
结论:明确添加了消息头的datadog,消息没有传递给消费者。
解决方案(但不起作用) 在浏览了 datadog 文档后,我找到了解决此问题的方法:https://docs.datadoghq.com/fr/tracing/compatibility_requirements/java/ 在部分下:网络跟踪提供以下功能:
Datadog 文档:
Kafka / Datadog 集成适用于支持 Header API 的 Kafka 版本 0.11+。此 API 用于注入和提取跟踪上下文。如果您使用的是混合版本环境,Kafka 代理可能会错误地传递最新版本的 Kafka,然后绘图仪会尝试注入本地生产者不支持的标头。此外,由于标头的存在,年长的消费者无法使用该消息。为避免这些问题,如果您将混合版本环境与 0.11 之前的 Kafka 版本一起使用,请使用以下环境变量禁用传播的上下文:DD_KAFKA_CLIENT_PROPAGATION_ENABLED=false。
所以我们在 Windows 上使用以下命令添加并运行应用程序和数据狗代理(添加标志 Ddd.kafka.client.propagation.enabled=false):
java -javaagent:D:\Tools\Datadog\dd-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
预期行为: Datadog 不应添加标头。
实际行为: Datadog 仍在添加标头,因此我们仍然收到 Magic V1 错误。
恳请遇到类似问题的人帮助,如果解决了,请指导。
【问题讨论】:
标签: apache-kafka datadog