Datadog的Kafka集成DD_Kafka_CLIENT_PROPAGION_ENABLED-Magic v1不支持



问题:

[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

最新更新