概述

    从zabbix 2.0开始,JMX监视器以Zabbix守护进程的形式运行,称为“Zabbix Java gateway”。

    要检索某台主机特定JMX计数器的值,Zabbix server查询Zabbix Java网关,进而使用 来远程查询相关应用。

    有关更多细节和设置,请参考 Zabbix Java网关 这一章节。

    Java网关和JMX应用程序之间的通信不应被防火墙阻止.

    为Java应用程序启用远程JMX监控

    Java应用程序不需要安装任何附加的软件,但需要使用以下指定的命令行,设置启动,以支持远程JMX监控。

    最小化的情况下,如果你只希望通过在本地主机上监控一个简单的Java应用程序,不考虑其安全性,那么可以使用以下设置进行启动:

    这使得Java可以侦听来自本地主机12345端口上传入的JMX连接,并告知不需要身份验证或SSL。

    如果要允许其它接口上的连接,请将-Djava.rmi.server.hostname参数设置为该接口的IP。

    如果您对安全性有更严格的要求,可以使用许多其他的Java设置。例如,下一个示例以一组更通用的设置启动应用程序,适用于更广泛的网络,而不仅仅是本地主机。

    1. -Djava.rmi.server.hostname=192.168.3.14 \
    2. -Dcom.sun.management.jmxremote \
    3. -Dcom.sun.management.jmxremote.port=12345 \
    4. -Dcom.sun.management.jmxremote.authenticate=true \
    5. -Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
    6. -Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
    7. -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
    8. -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
    9. -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
    10. -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
    11. -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

    这些设置的大部分(或许全部)可以在/etc/java-6-openjdk/management/management.properties文件中指定(或者此文件在系统的其他存放)。

    详细说明请参考 。

    在Zabbix web管理页面上配置JMX接口和监控项

    Java网关在运行时,服务器知道在哪里找到它,并且Java应用程序开始了远程JMX监视,现在可以在Zabbix GUI中配置接口和监控项了。

    配置JMX接口

    首先在相关主机上创建一个JMX类型的接口。

    标有红色星号的为必填项。

    添加JMX代理监控项

    对于你感兴趣的每个JMX计数器,都可以在接口上添加一个 JMX代理 类型的监控项。

    下面截图中的键值参数是这样配置的 jmx["java.lang:type=Memory","HeapMemoryUsage.used"]

    标有红色星号的为必填项。

    需要JMX监控项特定信息的字段,如下:

    JMX监控项详细信息

    简单属性

    MBean对象名只不过是Java应用程序中定义的字符串。另一方面,属性名可能更为复杂。如果一个属性返回原始数据类型,这并没有什么可担心的。这个键值会是这样的:

    1. jmx[com.example:Type=Hello,weight]

    在这个示例中,对象名是“com.example:Type=Hello”,属性名是“weight”,返回值的类型可能是“Numeric (float)”。

    属性返回复合数据

    当属性返回复合数据时将变得更加复杂。例如:属性名是“apple”,它返回一个表示其参数的哈希,如“weight”, “color”等。键值可能如下所示:

    这就是使用点符号分隔属性名和哈希键的方法。同理,如果属性返回嵌套的复合数据,则各部分之间用点分隔:

    1. jmx[com.example:Type=Hello,fruits.apple.weight]
    Problem with dots
    关于点的问题

    到目前为止都还好。但是,如果属性名或散列键包含点符号呢?下面就是个例子:

    1. jmx[com.example:Type=Hello,all.fruits.apple.weight]

    如何告诉Zabbix属性名是“all.fruits”,而不只是“all”呢?如何区分作为属性名称一部分的点与分隔属性名和散列键的点呢?这是一个问题。

    2.0.4 版本之前,Zabbix Java网关是无法处理此类情况的,在监控项里,用户只能留下UNSUPPORTED项了。从2.0.4开始解决了此问题,你所需要做的就是用反斜杠来转义名字的一部分点:

    同样,如果哈希键包含一个点,你也可以转义它:

    其他问题

    属性名中的反斜杠字符特应该被转义:

      有关处理JMX监控项键值中的其他特殊字符,请参见 this section。 这就是全部了,祝JMX监控快乐!