【问题标题】:error trying to access kafka metrics through jmx programmatically尝试以编程方式通过 jmx 访问 kafka 指标时出错
【发布时间】:2018-09-12 04:36:19
【问题描述】:

我刚从一个简单的示例开始读取 jmx 指标,并使用 HeapMemoryUsage、CPUTime 等简单值来感受它。我需要尝试访问 kafka 服务器/消费者指标,特别是滞后,我可以看到它在 FetcherLagMetrics-ConsumerLag 下的 jconsole 应用程序中作为一个键可见。但程序上我收到以下错误:

javax.management.InstanceNotFoundException: kafka.consumer:type=consumer- 
  fetch-manager-metrics

这告诉我 consumer-fetch-manager 指标是问题所在,因为它甚至在 jconsole 中也不存在。我将其更改为以下内容并且仍然是相同的问题:

consumerBean = jmxCon.getMBeanServerConnection().getAttribute(new 
   ObjectName("kafka.server:type=FetcherLagMetrics"),"ConsumerLag");
            cd = (CompositeData) consumerBean;

尝试访问这些值的代码如下:

        jmxCon.getMBeanServerConnection().invoke(new 
         ObjectName("java.lang:type=Memory"), "gc", null, null);

        for (int i = 0; i < 100; i++) {

            //get an instance of the HeapMemoryUsage Mbean
            memoryMbean = jmxCon.getMBeanServerConnection().getAttribute(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage");
            cd = (CompositeData) memoryMbean;

            //get an instance of the OperatingSystem Mbean
            osMbean = jmxCon.getMBeanServerConnection().getAttribute(new ObjectName("java.lang:type=OperatingSystem"),"ProcessCpuTime");

            //get an instance of the kafka metrics Mbean
            consumerBean = jmxCon.getMBeanServerConnection().getAttribute(new ObjectName("kafka.consumer:type=consumer-fetch-manager-metrics"),"MaxLag");
            cd = (CompositeData) consumerBean;

            consumerBeanII = jmxCon.getMBeanServerConnection().getAttribute(new ObjectName("kafka.server:type=FetcherLagMetrics,name=ConsumerLag"),"Lag");


            System.out.println("Used memory: " + " " + cd.get("MaxLag") + " Used cpu: " + consumerBean); //print memory usage

            tempMemory = tempMemory + Long.parseLong(cd.get("used").toString());
            Thread.sleep(1000); //delay for one second

        }

它在 consumerBean = ......行失败了,有人可以解释或提供使用 jmx /JMI 实现访问 kafka 指标的正确方法吗?

【问题讨论】:

  • 您是否尝试提供客户端 ID? kafka.consumer:type=consumer-fetch-manager-metrics,client-id=([-.w]+)
  • 我不了解 MBean 中的层次结构,因此不确定哪个是客户端 ID,因为有多个子文件夹 - kafka.server ---> FetcherLagMetrics --> ConsumerLag ---> ReplicaFetcherThread- 0-2 ---> data.in ---> 5 ---> 属性 ---> 值

标签: java apache-kafka jmx


【解决方案1】:

我不确定您的 Kafka 版本,但是当我使用 JConsole 查看我的 (v1.1.0) 时,没有您描述的用于消费者滞后的 bean。因此,我认为您的 JMX 查询会失败。

相反,我相信此类信息已移至Kafka Admin API 界面。因此,如果您不想使用kafka-consumer-groups.sh 命令行实用程序,您现在必须使用它来获取延迟设置。

对我们来说,我们只需要这些统计信息进行监控,因此我们使用https://github.com/danielqsj/kafka_exporter 来获取 Prometheus 的信息。

【讨论】:

  • 感谢您的回复。我过于关注从代理获取消费者指标,但考虑到我们使用的版本 1.0.0,这是一个错误。消费者指标仅在消费者进程服务器上公开。所以只是为了确认;你是说这只能使用 kafka admin api 来检索,它会在代理服务器上,对吗?
  • 是的,您可以使用 Kafka Admin API 连接到代理服务器并查询消费者组的详细信息。这是 kafka-consumer-groups.sh 工具内部使用的相同 api,所以如果你想编写自己的代码,请使用这个。
猜你喜欢
  • 1970-01-01
  • 2020-06-24
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多