这里是weihubeats ,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党
Kafka version
- kafka_2.13-3.5.0
Kafka 监控
Kafka自带JMX监控
JMX
我们不用过多介绍,如果你用过Spring Boot Actuator
就算用过JMX
,Spring 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
来暴露监控
一般来说我们要自定义JMX
的MBean
就需要如下方式
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);
}
主要是调用MBeanServer
的registerMBean
这里我们可以看看Kafka
的源码
Kafka
的源码对这一块进行了封装。因为Kafka
支持多种监控方式
目前看源码MetricsReporter
的主要实现类有两个
- JmxReporter
- PushHttpMetricsReporter
总结
总的来说kafka的监控支持有两种一种是Jmx
,一种是http
.各种需要监控的指标也是应有尽有,非常齐全。