当前位置: 首页 > 知识库问答 >
问题:

Datadog的Kafka集成DD_KAFKA_CLIENT_PROPAGATION_ENABLED-Magic v1不支持记录头

诸葛雅达
2023-03-14

问题:

[org.springframework.kafka.KafkaListenerEndpointContainer#3-0-kafka-consumer-1]WARN o.a.k.c.consumer.internals公司。Fetcher-获取主题分区的数据时出现未知错误

环境设置:

    < li >Kafka版本:kafka_2.11-1.0.0 < li >制作者详细信息:< br> Spring Boot版本:2 . 5 . 0 < br > Kafka-客户端:2.7.1 < li >消费者详细信息:< br> Spring Boot版本:1 . 5 . 19 . release < br > Kafka-Client:0 . 10 . 0 . 1 < li >数据狗

场景1:

我们知道Kafka旧版本不支持消息头,所以我们不会在生产者中设置任何消息头。因此,如果我们在没有datadog的情况下运行应用程序,并且当我们从生产者发布消息时,消费者可以使用消息。

结论:在混合Kafka版本和没有数据的情况下,消费者和生产者工作正常。

场景2:

添加datadog后,消息不会传递给使用者,在使用者端我们可以看到异常:[org . spring framework . Kafka . kafkalistenerendpointcontainer # 3-0-Kafka-consumer-1]WARN o . a . k . c . consumer . internals . fetcher-获取主题分区的数据时出现未知错误

当检查Kafka服务器日志时,我们可以看到Magic V1错误。java.lang.IllegalArgumentException:Magic v1不支持记录头

结论:使用数据狗明确添加消息头,消息不会传递给消费者。

解决方案(但不起作用)在浏览了datadog文档之后,我发现了这个问题的解决方案,即:https://docs.datadoghq.com/fr/tracing/compatibility_requirements/java/ 在以下部分下:网络跟踪提供以下功能:

数据狗文档:Kafka/数据狗集成适用于Kafka版本0.11,该版本支持标头API。此 API 用于注入和提取跟踪上下文。如果您使用的是混合版本环境,则 Kafka 代理可能会错误地传递最新版本的 Kafka,然后绘图仪会尝试注入本地创建者不支持的标头。此外,由于存在标头,较旧的使用者无法使用消息。为避免这些问题,如果将混合版本环境与 0.11 之前的 Kafka 版本一起使用,请使用以下环境的变量禁用传播上下文:DD_KAFKA_CLIENT_PROPAGATION_ENABLED=false

因此,我们在windows上使用以下命令添加并运行应用程序和datadog代理(添加了flag < code > 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

预期行为:数据狗不应添加标头。

实际行为:数据狗仍在添加标头,因此我们仍然收到Magic V1错误。

请帮助那些面临类似问题的人,如果你解决了问题,请指导。

共有1个答案

相化
2023-03-14

我们还遇到了类似的问题,我们想使用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相关Datadog代码:

    < li >生成器:https://github . com/DataDog/DD-trace-Java/blob/069 FFA 9 a 637 BD 4 BFF FCE 1 BBB 80 e 089 e 26 a 95 adaeb/DD-Java-agent/instrumentation/Kafka-clients-0.11/src/main/Java/DataDog/trace/instrumentation/Kafka _ clients/kafkaproducerinstrumentation . Java # L38 < li >消费者:https://github . com/data dog/DD-trace-Java/blob/069 FFA 9 a 637 BD 4 BFF FCE 1 BBB 80 e 089 e 26 a 95 adaeb/DD-Java-agent/instrumentation/Kafka-clients-0.11/src/main/Java/data dog/trace/instrumentation/Kafka _ clients/kafconsumerinstrumentation . Java # L30

 类似资料:
  • 我试图用这个版本来反对Cloudera安装: 我的KafkaProducerConfig类非常简单: 我已经从生产者应用程序端尝试了以下几点: 降级到Spring Kafka 2.0.4。我希望通过Kafka的0.11.0版本来解决这个问题,但没有效果。 验证节点都是同一个版本。根据我的管理员,他们是。 与我的管理员验证,我们没有混合安装。我再次被告知我们没有。 基于类似的堆栈溢出问题,我返回到2

  • 我正在使用此docker compose设置在本地设置Kafka:https://github.com/wurstmeister/kafka-docker/ < code>docker-compose up运行良好,通过shell创建主题运行良好。 现在我尝试通过连接到Kafka 启动Spring应用程序时,它会打印正确版本的Kafka: 我试着传达这样一个信息 客户端发送失败,原因是 在服务器控

  • 我发布了这个问题,我可以通过删除WebLogic startups参数来解决这个问题: 有人能解释一下吗?

  • 我试图建立一个具有联合数据类型支持成员记录类型的AVRO复杂记录。 我在尝试读取这种模式时出错。 我想知道-是否有可能声明这样的AVRO模式-其中一个字段类型是复杂用户定义消息结构的联合。 如果可能的话,你能让我知道我做错了什么吗?或者用union类型字段的类型定义举例说明这种结构吗? 我想使用AVRO的动态架构用法 - 因此请指定此架构文件运行时并将传入缓冲区解析为“request”/“resp

  • 问题内容: 我试图拨打https并收到以下错误:记录版本不受支持SSLv2Hello 谁能告诉我我在做什么错?谢谢你的帮助。 这是StackTrace: 这是工作示例: 问题答案: 弄清楚了。我在鞋带上绊倒的两个地方是: 需要在PoolingHttpClientConnectionManager中注册https 将TLSv1设置为SSLConnectionSocketFactory中唯一受支持的协