Zabbix通过JMX(Java Management Extensions)可以对Java Application进行监控,Zabbix利用原生的Zabbix Java gateway,一个Java守护进程监控JMX应用。当Zabbix想要知道某个JMX counter当前的数据时,它只去询问ZabbixJava gateway,而gateway会去查询需要的数据,所有这些查询都是通过JMX管理API完成的。
使用时,一个Java应用不需要额外安装任何其他的软件,也不需要实现或扩展新的代码来处理Zabbix的查询,仅仅需要在Java 应用的配置文件中设置一些参数,支持远程JMX的监控。
这些参数主要有:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<你要设置的端口号>
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
例如:
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar/usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar
上面的配置定义了Java程序使用12345端口监听来自本地的JMX的连接,并不需要身份验证和加密。如果你想从其他主机访问,需要配置 -Djava.rmi.server.hostname 参数。
在实际环境中从安全的角度考虑,需要设置身份验证和加密。具体设置步骤如下:
1、 启用身份验证并指定一个包含密码的文件。
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.password.file=/etc/java-6-penjdk/management/jmxremote.password
jmxremote.password文件内容:
monitorRole
controlRole
2、 指定用户的配置文件。
-Dcom.sun.management.jmxremote.access.file=/etc/java-6-penjdk/management/jmxremote.access
jmxremote.access文件内容:
monitorRole readonly
controlRole readwrite
3、 启用SSL。
-Dcom.sun.management.jmxremote.ssl=true
绑定下面的参数:
-Djavax.net.ssl.keyStore=<你的keyStore >
-Djavax.net.ssl.keyStorePassword=<你的 keyStorePassword >
-Djavax.net.ssl.trustStore=<你的trustStore >
-Djavax.net.ssl.trustStorePassword=<你的trustStorePassword >
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true
完整的例子如下:
java \
-Djava.rmi.server.hostname=192.168.3.14 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password\
-Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access\
-Dcom.sun.management.jmxremote.ssl=true \
-Djavax.net.ssl.keyStore=<你的KeyStore> \
-Djavax.net.ssl.keyStorePassword=<你的KeyStorePassword> \
-Djavax.net.ssl.trustStore=<你的trustStore > \
-Djavax.net.ssl.trustStorePassword=<你的trustStorePassword > \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
-jar/usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar
-D参数需要写到你的应用或应用服务器的启动文件中,在完成上述的各项配置后,你的启动文件中将包含一些敏感的内容(keyStore和trustStore密码),因此需要保护好你的启动文件。
为了在Zabbix server使用JMX agent,还需要在Zabbix server中安装Java gateway。
# yum install zabbix-java-gateway
# systemctl enablezabbix-java-gateway
# systemctl start zabbix-java-gateway
如果你是编译源码安装的Zabbix server,一定要使用 --enable-java选项。
在zabbix_server.conf文件中进行配置。
# vi zabbix_server.conf
Java gateway = 127.0.0.1
Java Gateway Port = 10052
Start Java pollers = 5
不要忘记修改zabbix_server.conf文件后要重启Zabbixserver服务。
# systemctl restart zabbix-server
下面我们就可以配置一个JMX agent监控项,步骤如下:
1、 在Configuration --> Host页面中,单击Name列中的主机名称,例如Zabbix server,在主机配置页面Host标签下添加JMX接口配置,如下图3-10所示。
图 3-10
2、 单击Update按钮保存主机的配置。
3、 创建一个新的监控项。
Name中填写监控项名称。
Type中选择JMX agent。
Key中填写你要监控的项目,格式为jmx[
jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
Host interface中选择JMX接口。
安装JMX控制台后为了安全,通常我们会设置一个登录控制台的用户名和密码,Zabbix中支持这种方式,在User name和Password中填写就可以了。
Type of information选择Numeric(unsigned)。
Data type中选择Decimal。
Unit中设置单位,如:B。
其他参数可以保持不变,单击Add按钮保存。
如下图3-11所示。