聊聊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.各种需要监控的指标也是应有尽有,非常齐全。

相关推荐
明月与玄武2 小时前
Spring Boot中的拦截器!
java·spring boot·后端
菲兹园长2 小时前
SpringBoot统一功能处理
java·spring boot·后端
muxue1782 小时前
go语言封装、继承与多态:
开发语言·后端·golang
开心码农1号2 小时前
Go语言中 源文件开头的 // +build 注释的用法
开发语言·后端·golang
北极象2 小时前
Go主要里程碑版本及其新增特性
开发语言·后端·golang
lyrhhhhhhhh3 小时前
Spring框架(1)
java·后端·spring
喝养乐多长不高4 小时前
Spring Web MVC基础理论和使用
java·前端·后端·spring·mvc·springmvc
莫轻言舞4 小时前
SpringBoot整合PDF导出功能
spring boot·后端·pdf
玄武后端技术栈5 小时前
什么是死信队列?死信队列是如何导致的?
后端·rabbitmq·死信队列
老兵发新帖7 小时前
NestJS 框架深度解析
后端·node.js