[spring-projects/spring-boot]SpringBoot升级后kafka消费者指标以微米为单位缺失

2024-05-14 509 views
6

SpringBoot 升级后,我不再有 micrometer 或 prometheus 中的 kafka 消费者指标。

听起来与https://github.com/spring-cloud/spring-cloud-stream-binder-kafka/issues/914类似 ,但我尝试了该票证中提到的内容,但没有解决我的问题。

这是我的改变:

  • SpringBoot从2.1.18升级到2.5.7。
  • Spring从5.1.19升级到5.3.13。
  • 将Kafka从2.8.0升级到2.8.1。
  • 千分尺从 1.6.9 升级到 1.7.6。
  • Springfox Swagger从2.9.2升级到3.0.0。
  • 添加org.springframework.kafka:spring-kafka:2.7.9
  • 添加org.jolokia:jolokia-core:jar:1.6.2
  • 删除了 spring-cloud,因为我们没有从服务器加载配置
  • 添加spring.jmx.enabled:true到我的 application.yml

回答

2

我们不知道 Spring Boot 2.5.7 中的 Kafka 指标有任何问题。如果您希望我们花一些时间进行调查,请花一些时间提供一个完整但最小的样本来重现问题。您可以通过将其推送到 GitHub 上的单独存储库或将其压缩并附加到此问题来与我们共享。

8

我创建了一个非常简单的例子。我可以确认这有效

  • SpringBoot 2.2.13.RELEASE
  • 卡夫卡客户端 2.8.1
  • 千分尺1.7.6
  • spring.jmx.enabled=true
  • 不需要 spring-kafka 和 jolokia-core,没有它们也可以工作。我尝试将它们添加到下面的几种组合中,因为另一张票上有提示它们可能会有所帮助,但它们没有。

但我尝试了所有这些组合,但它们不起作用

  • SpringBoot 2.3.0.RELEASE,micrometer 1.7.6,无 jolokia,无 spring-kafka
  • SpringBoot 2.3.12.RELEASE,micrometer 1.7.6,无 jolokia,无 spring-kafka
  • SpringBoot 2.4.13,micrometer 1.7.6,没有 jolokia,没有 spring-kafka
  • SpringBoot 2.5.7,micrometer 1.7.6,没有 jolokia,没有 spring-kafka
  • SpringBoot 2.5.7,微米1.7.6,jolokia-core 1.6.2,spring-kafka 2.7.9
  • SpringBoot 2.6.1、Micrometer 1.8.1(不适用于 Micrometer 1.7.6)、无 jolokia、无 spring-kafka
  • SpringBoot 2.6.1,微米1.8.1,jolokia-core 1.7.1,spring-kafka 2.8.0

我通过运行生产者并在消费者日志中确认它已消费消息(因为可能需要实际消费来创建这些指标)来测试所有这些,然后运行

  • curl http://localhost:8080/manage/prometheus
  • curl http://localhost:8080/manage/metrics | jq

我的示例代码:

1

为了澄清,我手动创建我的消费者和流(不使用),并且我可以通过手动调用or spring-kafka来获取指标 ,但如果能像 SpringBoot 2.2.x 中那样自动发生这种情况,那就太好了。我有很多应用程序需要更新,一次修改每个应用程序是一项艰巨的工作,而且也是犯错误的原因。new KafkaStreamsMetrics(stream).bindTo(registry)new KafkaClientMetrics(consumer).bindTo(registry)

这是一种回归,因为它在 SpringBoot 2.2.x 中以这种方式工作,但在 2.3.x 或更高版本中则不然。

7

自 Spring Boot 2.3 起,Kafka 指标名称已更改。

kafka_consumer_records_consumed_total_records_total -> kafka_consumer_fetch_manager_records_consumed_total
kafka_consumer_records_lag_records -> kafka_consumer_fetch_manager_records_lag
kafka_consumer_records_lag_max_records -> kafka_consumer_fetch_manager_records_lag_max
kafka_consumer_fetch_latency_max_seconds -> kafka_consumer_fetch_manager_fetch_latency_max
kafka_consumer_bytes_consumed_total_bytes_total -> kafka_consumer_fetch_manager_bytes_consumed_total
kafka_consumer_records_per_request_avg_records -> kafka_consumer_fetch_manager_records_per_request_avg
kafka_consumer_heartbeat_rate_heartbeats -> kafka_consumer_coordinator_heartbeat_rate

如果您有自定义消费者工厂,请添加 customizers.orderedStream().forEach(customizer -> customizer.customize(consumerFactory));

@Bean
public ConsumerFactory<Integer, String> customConsumerFactory(ObjectProvider<DefaultKafkaConsumerFactoryCustomizer> customizers) {
    DefaultKafkaConsumerFactory<Integer, String> consumerFactory = new DefaultKafkaConsumerFactory<>(customConsumerConfigs());
    customizers.orderedStream().forEach(customizer -> customizer.customize(consumerFactory));
    return consumerFactory;
}
3

@ivan909020 这些工厂是spring-kafka,我没有使用spring-kafka,只是new KafkaConsumer(...)new KafkaStreams(...)

我注意到名字的变化,这很令人惊讶。为什么 SpringBoot 名称发生变化?我认为它会基于kafka本身的版本或micrometer的版本,但事实并非如此。这很令人沮丧,因为我在 datadog 中有一堆已建立的仪表板和警报。

3

@dlipofsky好的,那么你可以通过Spring创建KafkaConsumer - DefaultKafkaConsumerFactory。

@Autowired
private final PrometheusMeterRegistry meterRegistry;

DefaultKafkaConsumerFactory<String, String> consumerFactory = new DefaultKafkaConsumerFactory<>(props);
consumerFactory.addListener(new MicrometerConsumerListener<>(meterRegistry));

Consumer<String, String> consumer = consumerFactory.createConsumer();
7

@ivan909020,重点是我试图不重写所有要使用的应用程序spring-kafka,我希望能够升级spring-boot(出于安全原因),但我的这种回归给我带来了痛苦。我还有一个应用程序,它KafkaConsumer是由第三方 SDK 创建的,因此不受我的控制。

8

@dlipofsky 好的,那么您可以创建 KafkaClientMetrics 并绑定到 PrometheusMeterRegistry。

@Autowired
private final PrometheusMeterRegistry meterRegistry;

Consumer<String, String> consumer = new KafkaConsumer<>(props);

KafkaClientMetrics metrics = new KafkaClientMetrics(consumer);
metrics.bindTo(meterRegistry);
8

是的,这就是我正在做的事情(请参阅上面我昨天的评论),但它仍然涉及更改我的所有应用程序。现在我已经做到了,所以那艘船已经为我航行了,但这仍然是一个回归,我想看看它是否可以解决,因为旧的方式更好。也许它可以帮助其他人。

1

好的我知道了。抱歉我没注意到。我想这是因为在 Spring Boot 2.3 之前,Kafka 指标通过 JMX 工作,JMX 在 KafkaConsumer 内部实现,为此您不需要配置任何内容,但从 2.3 开始,它通过 KafkaClientMetrics 工作,为此您需要手动配置它。

7

@dlipofsky 这个更改包含在2.3 的发行说明中,当时已经不再支持 OSS。不依赖 JMX 很重要,因为它在以前的版本中默认被禁用,这也导致了问题。

就像你说的,船已经航行到这里,但我可以想象,你可以很容易地在你的定制安排中改造这种行为。

1

@snicoll,发行说明中确实没有涵盖这一点。发行说明只是假设您正在使用自spring-kafka定义工厂,并且仅讨论如果您使用自定义工厂该怎么做。我没有使用自定义工厂,或者根本没有使用任何工厂,因为我没有使用spring-kafka.

5

Kafka 指标是为自动配置的 ConsumerFactory 和 ProducerFactory 创建的消费者和生产者本地发布的。

您说得对,从查看 JMX 指标到使用更强大的本机安排的转变依赖于spring-kafka.话虽这么说,我相信您可能会认为 Spring Boot 应该为您提供与 Kafka 相关的功能,即使您没有使用 Spring Kafka 并且该部分不准确。阅读参考文档中相关部分的第一句。