基于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 连接 :通过 JMXServiceURLJMXConnectorFactory 连接到 Kafka 的 JMX 服务器。这里假设 Kafka 的 JMX 服务运行在本地的 9999 端口,你需要根据实际情况修改 JMX_URL
  • 获取 MBean 信息 :使用 MBeanServerConnection 查询所有的 MBean 名称,并筛选出 Kafka 相关的 MBean。
  • 获取属性值:对于每个 Kafka 相关的 MBean,获取其所有属性的名称,并尝试获取属性的值进行打印。
  • 异常处理:在获取属性值时,可能会抛出异常,需要进行异常处理。
相关推荐
customer083 分钟前
【开源免费】基于SpringBoot+Vue.JS医院后台管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
安清h27 分钟前
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户登录
java·后端·mysql·spring
生产队队长1 小时前
SpringSecurity:There is no PasswordEncoder mapped for the id “null“
java·spring
优人ovo2 小时前
Kafka架构
分布式·架构·kafka
迟來北风2 小时前
idea找不到或无法加载主类怎么解决
java·spring boot·intellij-idea
qq_338432372 小时前
IntelliJ IDEA远程开发代理远程服务器端口(免费内网穿透)
java·ide·intellij-idea·远程开发
南宫生3 小时前
力扣动态规划-19【算法学习day.113】
java·学习·算法·leetcode·动态规划
fly spider3 小时前
每日 Java 面试题分享【第 20 天】
java·开发语言·面试·io