KafkaMetrics - 无法绑定仪表:kafka.consumer*
Posted
技术标签:
【中文标题】KafkaMetrics - 无法绑定仪表:kafka.consumer*【英文标题】:KafkaMetrics - Failed to bind meter: kafka.consumer* 【发布时间】:2021-11-03 13:08:03 【问题描述】:我已经在 OpenShift 上部署了一个应用程序作为容器。该应用程序由四个线程(即消费者)组成 - 每个线程都轮询一个独特的主题。我想为每个消费者/主题显示 KafkaMetrics。我已经建立了一个正常运行的 Prometheus 端点。
每个消费者的指标都通过以下方式绑定到这个 Prometheus Registry:
KafkaClientMetrics(consumer).bindTo(promRegistry)
此外,我遇到了 Prometheus 端点上显示的指标不一致的情况。对于某些指标,仅显示其中一个消费者的数据。我还在 OpenShift 日志中收到以下警告:
"@timestamp":"2021-09-06T12:45:43.608+02:00","@version":"1","message":"Failed to bind meter:
kafka.consumer.fetch.manager.records.lag.max [tag(client.id=client2), tag(topic=my_topic), tag(partition=2), tag(kafka.version=6.2.0-ccs)].",
"logger_name":"io.micrometer.core.instrument.binder.kafka.KafkaMetrics","thread_name":"micrometer-kafka-metrics","level":"WARN","level_value":30000,
"stack_trace":"java.lang.IllegalArgumentException: Collector already registered that provides name:
kafka_consumer_fetch_manager_records_lag_max\n\t
at io.prometheus.client.CollectorRegistry.register(CollectorRegistry.java:54)\n\t
at io.prometheus.client.Collector.register(Collector.java:139)\n\t
at io.micrometer.prometheus.PrometheusMeterRegistry.lambda$applyToCollector$16(PrometheusMeterRegistry.java:410)\n\t
at java.base/java.util.concurrent.ConcurrentHashMap.compute(Unknown Source)\n\t
at io.micrometer.prometheus.PrometheusMeterRegistry.applyToCollector(PrometheusMeterRegistry.java:406)\n\t
at io.micrometer.prometheus.PrometheusMeterRegistry.newGauge(PrometheusMeterRegistry.java:208)\n\t
at io.micrometer.core.instrument.MeterRegistry.lambda$gauge$1(MeterRegistry.java:298)\n\t
at io.micrometer.core.instrument.MeterRegistry.lambda$registerMeterIfNecessary$5(MeterRegistry.java:562)\n\t
at io.micrometer.core.instrument.MeterRegistry.getOrCreateMeter(MeterRegistry.java:620)\n\t
at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:569)\n\t
at io.micrometer.core.instrument.MeterRegistry.registerMeterIfNecessary(MeterRegistry.java:562)\n\t
at io.micrometer.core.instrument.MeterRegistry.gauge(MeterRegistry.java:298)\n\t
at io.micrometer.core.instrument.Gauge$Builder.register(Gauge.java:190)\n\t
at io.micrometer.core.instrument.binder.kafka.KafkaMetrics.registerGauge(KafkaMetrics.java:224)\n\t
at io.micrometer.core.instrument.binder.kafka.KafkaMetrics.registerMeter(KafkaMetrics.java:216)\n\t
at io.micrometer.core.instrument.binder.kafka.KafkaMetrics.bindMeter(KafkaMetrics.java:208)\n\
at io.micrometer.core.instrument.binder.kafka.KafkaMetrics.lambda$checkAndBindMetrics$1(KafkaMetrics.java:191)\n\t
at java.base/java.util.concurrent.ConcurrentHashMap.forEach(Unknown Source)\n\t
at java.base/java.util.Collections$UnmodifiableMap.forEach(Unknown Source)\n\t
at io.micrometer.core.instrument.binder.kafka.KafkaMetrics.checkAndBindMetrics(KafkaMetrics.java:161)\n\t
at io.micrometer.core.instrument.binder.kafka.KafkaMetrics.lambda$bindTo$0(KafkaMetrics.java:112)\n\t
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)\n\t
at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)\n\t
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)\n\t
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)\n\t
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)\n\t
at java.base/java.lang.Thread.run(Unknown Source)\n"
这些类型的警告出现在三个未显示所有指标的消费者身上。
以前有人遇到过这种异常吗?
如有必要,我很乐意提供更多信息或代码,但目前我不知道应该包含哪些代码。
【问题讨论】:
我不认为您可以使用一组完全不同的标签发布相同的指标名称(如果您绑定多个消费者,就会发生这种情况)。您可以让一个消费者订阅多个主题 主题产生具有不同类型值的记录。因此,有必要创建几个具有唯一值反序列化器的客户。我认为将所有客户合并为一个会很麻烦。 但有趣/奇怪的是,一些指标显示给所有消费者,而一些指标只显示给一个消费者(即其他三个消费者缺乏这些指标)。 【参考方案1】:我发现了问题!在设置 Promotheus 端点时,我还在promregistry
中添加了两个common_tags
。在绑定到promregistry
时,这些常见标签似乎对消费者设置的默认标签造成了麻烦。通过移除通用标签的设置,所有的指标都会显示给所有消费者。
【讨论】:
以上是关于KafkaMetrics - 无法绑定仪表:kafka.consumer*的主要内容,如果未能解决你的问题,请参考以下文章