获取应用内 JMX 统计信息的编程方式 这篇文章将指导你如何在那里 Java 在应用程序中通过编程获取 JMX 无需建立任何外部连接的统计信息。正如上面所述关键是访问应用程序本身 MBeanServer 并使用 ObjectName 进行查询。访问 MBeanServerJava 应用程序的 JMX 统计信息由 MBeanServer 管理。你可以通过 ManagementFactory 类获取 MBeanServer 的实例。import javax.management.MBeanServer; import java.lang.management.ManagementFactory; public class JMXExample { public static void main(String[] args) { MBeanServer mbs ManagementFactory.getPlatformMBeanServer(); // 后续操作将在那里 mbs 上进行 } }该代码首先导入必要的类然后使用 ManagementFactory.getPlatformMBeanServer() 获取平台的方法 MBeanServer 的实例。 mbs 现在对象可以用来访问和注册 JMX 的 MBeans 了。使用 ObjectName 查询 MBeans每个 MBean 都有独一无二的 ObjectName。你需要知道要查询什么 MBean 的 ObjectName 访问它的属性和操作。import javax.management.ObjectName; import javax.management.MBeanServer; import java.lang.management.ManagementFactory; import java.util.Set; public class JMXExample { public static void main(String[] args) throws Exception { MBeanServer mbs ManagementFactory.getPlatformMBeanServer(); // Kafka 消费者群体 ObjectName (需根据实际情况进行调整) ObjectName kafkaConsumerGroupObjectName new ObjectName(kafka.consumer:typeconsumer-fetch-manager-metrics,client-idyour-consumer-group-id,topicyour-topic,partitionyour-partition); // 查询 MBean SetObjectName mbeans mbs.queryNames(kafkaConsumerGroupObjectName, null); if (!mbeans.isEmpty()) { ObjectName mbean mbeans.iterator().next(); // 获取 MBean 的属性 Object lag mbs.getAttribute(mbean, records-lag-max); System.out.println(Kafka Consumer Group Lag: lag); } else { System.out.println(找不到匹配的 MBean); } } }注意ObjectName 格式 ObjectName 格式通常是 domain:type...,name...。 您需要根据实际情况替换 domain、type 和 name 的值。 对于 Kafka 消费群体ObjectName 具体格式取决于 Kafka 版本和配置。 在示例中使用 kafka.consumer:typeconsumer-fetch-manager-metrics,client-idyour-consumer-group-id,topicyour-topic,partitionyour-partition根据你的要求 Kafka 调整配置。 特别是 client-id (消费群体 ID)、topic 和 partition 实际值需要替换。异常处理 在代码中使用 throws Exception在实际应用中应进行更精细的异常处理如 MalformedObjectNameException、AttributeNotFoundException、InstanceNotFoundException、MBeanException、ReflectionException 等。属性名称 getAttribute 方法中的 records-lag-max 用于获取示例属性名 Kafka 延迟消费群体。 您需要根据 Kafka JMX 调整指标的实际名称。依赖 确保您的项目包含在内 JMX 例如相关依赖 java.management。Kafka JMX 配置 确保 Kafka 已配置为暴露 JMX 指标。 通常需要在 Kafka 的 server.properties 文件中设置 kafka.metrics.reporters 和相关的 JMX 配置。完整示例获取 Kafka 延迟消费群体以下是一个更完整的例子展示如何获得它 Kafka 消费者群体的延迟import javax.management.*; import java.lang.management.ManagementFactory; import java.util.Set; public class KafkaConsumerLagExample { public static void main(String[] args) { try { MBeanServer mbs ManagementFactory.getPlatformMBeanServer(); String consumerGroupId your-consumer-group-id; // 用你的消费群体代替你的消费群体 ID String topic your-topic; // 替换你的主题 int partition 0; // 用你的分区代替 // 构建 ObjectName ObjectName kafkaConsumerGroupObjectName new ObjectName(String.format(kafka.consumer:typeconsumer-fetch-manager-metrics,client-id%s,topic%s,partition%d, consumerGroupId, topic, partition)); // 查询 MBean SetObjectName mbeans mbs.queryNames(kafkaConsumerGroupObjectName, null); if (!mbeans.isEmpty()) { ObjectName mbean mbeans.iterator().next(); // 获取 records-lag-max 属性 Object lag mbs.getAttribute(mbean, records-lag-max); System.out.println(Kafka Consumer Group Lag for group consumerGroupId , topic topic , partition partition : lag); } else { System.out.println(找不到匹配的 MBean for group consumerGroupId , topic topic , partition partition); } } catch (MalformedObjectNameException e) { System.err.println(ObjectName 格式错误: e.getMessage()); } catch (AttributeNotFoundException e) { System.err.println(未找到属性 e.getMessage()); } catch (InstanceNotFoundException e) { System.err.println(MBean 未找到实例 e.getMessage()); } catch (MBeanException e) { System.err.println(MBean 异常: e.getMessage()); } catch (ReflectionException e) { System.err.println(反射异常: e.getMessage()); } catch (Exception e) { System.err.println(其他异常: e.getMessage()); } } }使用 Reactor Kafka 注意事项如果您使用 Reactor Kafka可能需要检查 Reactor Kafka 暴露的 JMX 指标。Reactor Kafka 可能有自己的 MBean 和属性用于监控消费者和生产者的性能。 您需要查阅 Reactor Kafka 了解它的文档 JMX 指标的详细信息。总结这样您就可以访问应用程序内部 JMX 不依赖外部统计信息 JMX 客户端。 这对监控应用程序本身的性能和状态非常有用特别是对图像 Kafka 对于消费者群体等组件可以实时获得延迟等关键指标。 请务必根据您的具体需要和 JMX 调整指标的实际名称。 同时应进行适当的异常处理以确保代码的强度。