【问题标题】:Datadog’s Kafka integration DD_KAFKA_CLIENT_PROPAGATION_ENABLED - Magic v1 does not support record headersDatadog 的 Kafka 集成 DD_KAFKA_CLIENT_PROPAGATION_ENABLED - Magic v1 不支持记录头
【发布时间】: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


    【解决方案1】:

    我们也遇到了类似的问题,我们想使用 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 会产生相同的效果。

    相关数据狗文档:https://docs.datadoghq.com/tracing/setup_overview/setup/java/?tab=containers 相关Datadog代码:

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2018-04-26
      相关资源
      最近更新 更多