聊聊Kafka如何基于JMX监控

这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党

Kafka version

  • kafka_2.13-3.5.0

Kafka 监控

Kafka自带JMX监控

JMX我们不用过多介绍,如果你用过Spring Boot Actuator就算用过JMXSpring Boot Actuator的实现就是基于JMX

Kafka如何开启JMX监控

之前我们在Linux Kafka 3.5 KRaft模式集群部署中的启动脚本是如下方式:

bash 复制代码
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G"&&nohup sh /data/kafka_2.13-3.5.0/bin/kafka-server-start.sh /data/kafka_2.13-3.5.0/config/kraft/server.properties &

要开启JMX我们只需添加如下参数

ini 复制代码
JMX_PORT=9988

端口我们自己指定就行

所以我们的脚本就变成了

bash 复制代码
export KAFKA_HEAP_OPTS="-Xmx4G -Xms4G"&&JMX_PORT=9988 nohup sh /data/kafka_2.13-3.5.0/bin/kafka-server-start.sh /data/kafka_2.13-3.5.0/config/kraft/server.properties &

监控指标

如果不自定义一些JMX里面的MBean,自带的监控指标属实很少,我们可以看看kafka支持那些JMX的监控指标

这里我们直接看官网就行

可以看到支持的监控指标非常丰富,基本需要监控的指标都有了 总得是这些

  • KRaft Monitoring
  • Selector Monitoring
  • Common Node Monitoring
  • Producer Monitoring
  • Consumer Monitoring
  • Connect Monitoring
  • Streams Monitoring
  • Others

原理分析

之前我们使用过VisualVM分析java项目的时候就要开启JMX 一般java应用要开启JMX就需要添加如下启动参数

ini 复制代码
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8777
-Dcom.sun.management.jmxremote.rmi.port=8777
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

详细内容可以参考我之前的博文

所以我们来看看为什么kafka的启动脚本为什么加了JMX_PORT=9988就可以了

我们打开kafka-run-class.sh的启动脚本就会发现如下内容

可以看到我们添加了$JMX_PORT参数后kafka会给我添加如下启动参数

ini 复制代码
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=$JMX_PORT
-Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT

如何定制JMX的监控

JMX本身就可以自定义各种MBean来暴露监控

一般来说我们要自定义JMXMBean就需要如下方式

java 复制代码
public static void main(String[] args) throws Exception {
        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
        ObjectName userName = new ObjectName("FengZheng:type=customer,name=customerUserBean");
        server.registerMBean(new User(), userName);
  
        try {
            //这个步骤很重要,注册一个端口,绑定url后用于客户端通过rmi方式连接JMXConnectorServer
            LocateRegistry.createRegistry(8999);
            //URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi
            JMXServiceURL url = new JMXServiceURL
                    ("service:jmx:rmi:///jndi/rmi://localhost:8999/jmxrmi");
            JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
            System.out.println("begin rmi start");
            jcs.start();
            System.out.println("rmi start");
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Thread.sleep(60 * 60 * 1000);
}

代码来源 juejin.cn/post/685694...

主要是调用MBeanServerregisterMBean

这里我们可以看看Kafka的源码

Kafka的源码对这一块进行了封装。因为Kafka支持多种监控方式

目前看源码MetricsReporter的主要实现类有两个

  • JmxReporter
  • PushHttpMetricsReporter

总结

总的来说kafka的监控支持有两种一种是Jmx,一种是http.各种需要监控的指标也是应有尽有,非常齐全。

相关推荐
Du_chong_huan3 分钟前
《计算机网络:自顶向下方法》第 2 章 应用层|核心知识梳理 + 原版习题解析
后端·asp.net
百度一见8 分钟前
2026年CRAIC“百度智能云智能服务机器人赛”正式启动!
后端·百度·机器人
代码探秘者12 分钟前
【算法篇】4.前缀和
java·数据库·后端·python·算法·spring
华科易迅18 分钟前
Spring AOP(注解前置+后置通知)
java·后端·spring
神奇小汤圆19 分钟前
一个 Spring Boot 项目,为什么要拆成 bootstrap、web、business、foundation、components、iot?
后端
Lear22 分钟前
【SpringBoot】 前后端参数命名踩坑记录:小驼峰变下划线导致接收不到参数
后端
希望永不加班43 分钟前
SpringBoot 配置 HTTPS(自签名证书+正式证书)
java·spring boot·后端·spring·https
小马爱打代码1 小时前
Spring Boot内嵌容器深度解析:Tomcat是如何被启动的?
spring boot·后端·tomcat
小江的记录本1 小时前
【反射】Java反射 全方位知识体系(附 应用场景 + 《八股文常考面试题》)
java·开发语言·前端·后端·python·spring·面试