一、概述
Zabbix server查询zabbix-java-gateway,然后zabbix-java-gateway使用JMX远程查询指定的应用程序,将结果返回给zabbix server。
上图已经告诉了我们zabbix进行jmx取值时的操作及其顺序。server通过jmx监控时,向gateway发送一个查询请求,gateway再通过jmx远程连接至被监控java程序,然后取数据,将取回的数据发送给server。
因此,要给机器添加jmx监控,则需要满足以下的前提条件:
- 被监控端已开启jmx远程访问
- 已配置好server和gateway
假设有3台centos7机器,ip地址分别为192.168.4.1、192.168.4.2和192.168.4.3。3台机器上的环境如下:
假设已经安装好了zabbix server和kafka3.3.1,我们要通过jmx获取kafka的数据,那么应该是这样:
按照下面的步骤进行配置。
二、安装zabbix-java-gateway并配置
1.安装zabbix-java-gateway
在192.168.4.2的机器上安装zabbix-java-gateway.
yum install zabbix-java-gateway
注意:如果想让server和gateway在一台机器上,则无需额外安装zabbix-java-gateway, 因为zabbix server中已经内置了zabbix-java-gateway。
安装好zabbix-java-gateway后,默认的配置文件在/etc/zabbix/zabbix_java_gateway.conf中,同时也在系统中注册并启动了service服务,server服务的配置文件为:/usr/lib/systemd/system/zabbix-java-gateway.service
2.配置zabbix-java-gateway
编辑配置文件/etc/zabbix/zabbix_java_gateway.conf,修改如下:
LISTEN_IP="0.0.0.0" # 监听地址,保持默认"0.0.0.0"
LISTEN_PORT=10052 # 监听端口,保持默认10052
PID_FILE="/var/run/zabbix/zabbix_java.pid" # PID_FILE文件,默认为/tmp/zabbix_java.pid,这里我们不使用默认文件
START_POLLERS=5 # 开启的工作线程数,这些线程会与zabbix server通信
TIMEOUT=3 # 超时时间
重启zabbix-java-gateway进程:
systemctl restart zabbix-java-gateway
3.配置zabbix-server
编辑zabbix server的配置文件/etc/zabbix/zabbix_server.conf, 添加如下配置
JavaGateway=192.168.4.2 # zabbix-java-gateway的所在服务器IP地址
JavaGatewayPort=10052 # zabbix-java-gateway的服务端口
StartJavaPollers=5 # 从zabbix-java-gateway采集数据的进程数
修改zabbix-server的配置后,一定要重启服务:
systemctl restart zabbix-server
三、被监控程序开启jmx
这里的被监控程序指的是kafka3.3.1。(实际上tomcat、springbot等用java编写的应用程序都可以通过jmx监控,都可以看成是java程序,只不过开启jmx的方式略有区别)
涉及Kafka启动的有如下两个脚本,实质上上还是通过kafka-run-class.sh启动kafka(kafka-server-start.sh调用了kafka-run-class.sh)
<kafka>/bin/kafka-run-class.sh
<kafka>/bin/kafka-server-start.sh
通过查看得知,kafka-run-class.sh中JMX_PORT变量指定了JMX的接口。脚本中涉及jmx设置的部分如下:
上面shell脚本的含义大致如下:
如果变量KAFKA_JMX_OPTS长度为0,则KAFKA_JMX_OPTS等于”-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false “
如果变量JMX_PORT有值,则KAFKA_JMX_OPTS再多加一个设置 “-Dcom.sun.management.jmxremote.port=$JMX_PORT”
解释一下上面的值:
-Dcom.sun.management.jmxremote # 远程连接,例如zabbix-java-gateway通过jmx获取本机的数据就是远程连接-
Dcom.sun.management.jmxremote.authenticate=false # 关闭验证
-Dcom.sun.management.jmxremote.ssl=false # 关闭ssl
-Dcom.sun.management.jmxremote.port=$JMX_PORT # 连接的端口
因为kafka启动的时候没有设置JMX_PORT,所以远端程序想要链接到本端时找不到对应的接口,造成连接失败。
要想让远端程序(zabbix-java-gateway)链接到本端,只需给JMX_PORT设置一个端口即可,通常设置为12345。如下图所示:
重启kafka服务后,zabbix-java-gateway就可以通过jmx协议取值了。
四、zabbix web页面增加jmx类型的监控项
做完以上三步后,就可以在zabbix web里添加jmx监控项了。
1.添加jmx接口
找到ip为192.168.4.3的主机(kafka程序所在主机),添加jmx接口。
注意:jmx的ip地址为kafka机器的ip地址,端口为刚才设置的端口。
2.添加监控项
在主机中添加监控项,监控项类型选择“jmx agent代理程序”,如下图所示:
键值:上图中的键值是jmx取值的语法格式(当然还有2种格式,可以通过右侧的“选择”按钮查看用法):
jmx[object_name,attribute_name]object_name和attribute_name均来自与MBean
主机接口:刚才添加的jmx接口
jmx端点:上图的service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi也是固定的语法格式,其中{HOST.CONN}和{HOST.PORT}是宏变量(分别指zabbix-java-gateway的ip和服务端口)。可以在【管理】【一般】【宏】中设置,也可以分别用192.168.4.3、12345来代替