基于JMX实现消息队列监控

引言

实时监控中间件保障集群的可用性是极其重要的,本篇文章以JAVA语音基于JMX来实现对Kafka消息队列的监控

实现

添加依赖

在 pom.xml 中添加以下依赖:

复制代码
<dependencies>
    <!-- Kafka 客户端依赖 -->
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>3.4.0</version>
    </dependency>
    <!-- JMX 依赖 -->
    <dependency>
        <groupId>javax.management</groupId>
        <artifactId>javax.management-api</artifactId>
        <version>1.4.0</version>
    </dependency>
</dependencies>

Java实现

java 复制代码
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import java.util.Set;

public class KafkaPerformanceMonitor {

    private static final String JMX_URL = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";

    public static void main(String[] args) {
        try {
            // 连接到 JMX 服务器
            JMXServiceURL url = new JMXServiceURL(JMX_URL);
            JMXConnector connector = JMXConnectorFactory.connect(url);
            MBeanServerConnection mbeanServerConnection = connector.getMBeanServerConnection();

            // 获取所有 MBean 的名称
            Set<ObjectName> mbeanNames = mbeanServerConnection.queryNames(null, null);

            // 遍历 MBean 名称,查找 Kafka 相关的 MBean
            for (ObjectName mbeanName : mbeanNames) {
                if (mbeanName.getDomain().startsWith("kafka")) {
                    System.out.println("Found Kafka MBean: " + mbeanName);
                    // 获取 MBean 的属性
                    Set<String> attributeNames = mbeanServerConnection.getMBeanInfo(mbeanName).getAttributes().stream()
                           .map(attr -> attr.getName())
                           .collect(java.util.stream.Collectors.toSet());
                    for (String attributeName : attributeNames) {
                        try {
                            Object attributeValue = mbeanServerConnection.getAttribute(mbeanName, attributeName);
                            System.out.println("  Attribute: " + attributeName + " = " + attributeValue);
                        } catch (Exception e) {
                            System.err.println("Error getting attribute " + attributeName + " for MBean " + mbeanName + ": " + e.getMessage());
                        }
                    }
                }
            }

            // 关闭连接
            connector.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • JMX 连接 :通过 JMXServiceURL 和 JMXConnectorFactory 连接到 Kafka 的 JMX 服务器。这里假设 Kafka 的 JMX 服务运行在本地的 9999 端口,你需要根据实际情况修改 JMX_URL。
  • 获取 MBean 信息 :使用 MBeanServerConnection 查询所有的 MBean 名称,并筛选出 Kafka 相关的 MBean。
  • 获取属性值:对于每个 Kafka 相关的 MBean,获取其所有属性的名称,并尝试获取属性的值进行打印。
  • 异常处理:在获取属性值时,可能会抛出异常,需要进行异常处理。
相关推荐
专业程序开发源3 分钟前
springboot外卖系统94294-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Moshow郑锴2 小时前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
Wang's Blog9 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
\光辉岁月/11 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang11 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理11 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_9620715711 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat12 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源12 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog12 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言