尝试以编程方式通过 jmx 访问 kafka 指标时出错
error trying to access kafka metrics through jmx programmatically
我只是从一个简单的示例开始阅读 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 指标的正确方法吗?
我不确定你的 Kafka 版本,但是当我使用 JConsole 查看我的 (v1.1.0) 时,没有你描述的用于消费者延迟的 bean。因此,我认为您的 JMX 查询预计会失败。
相反,我认为此类信息已移至 Kafka Admin API 界面。因此,如果您不想使用 kafka-consumer-groups.sh
命令行实用程序,您现在必须使用它来获取滞后设置。
对于我们来说,我们只需要这些统计数据进行监控,所以我们使用 https://github.com/danielqsj/kafka_exporter 来获取 Prometheus 的信息。
我只是从一个简单的示例开始阅读 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 指标的正确方法吗?
我不确定你的 Kafka 版本,但是当我使用 JConsole 查看我的 (v1.1.0) 时,没有你描述的用于消费者延迟的 bean。因此,我认为您的 JMX 查询预计会失败。
相反,我认为此类信息已移至 Kafka Admin API 界面。因此,如果您不想使用 kafka-consumer-groups.sh
命令行实用程序,您现在必须使用它来获取滞后设置。
对于我们来说,我们只需要这些统计数据进行监控,所以我们使用 https://github.com/danielqsj/kafka_exporter 来获取 Prometheus 的信息。