13 JMX监控

    概述

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

    为了检索主机上特定JMX计数器的值,Zabbix服务器查询Zabbix Java gateway,网关使用远程查询指定的应用程序,将结果返回给zabbix server。

    有关更多细节和设置,请参考 Zabbix Java gateway

    Java gateway和JMX应用程序之间的通信应该在防火墙上放行。

    启用远程JMX监控java应用

    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.access.file=/etc/java-6-openjdk/management/jmxremote.access \
    6. -Dcom.sun.management.jmxremote.ssl=true\
    7. -Dcom.sun.management.jmxremote.registry.ssl=true\
    8. -Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
    9. -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
    10. -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
    11. -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
    12. -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \

    这些设置中的大部分可以在/etc/java-6-openjdk/management/management中指定(或者读取你系统上的配置文件)

    请注意,如果您希望使用SSL,您必须修改startup.sh脚本,为Java网关添加“-Djavax.net.ssl.*”选项,以便它知道在哪里找到密钥和信任存储库

    参见使用JMX监控和管理获得详细的描述。

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

    Java网关在运行时,服务器会主动连接它,Java应用程序启用了远程JMX监视,现在可以在Zabbix GUI中配置接口和监控项了。

    配置JMX接口

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

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

    添加 JMX 代理项

    对于需要监控的每个 JMX 计数器,请添加 JMX agent代理程序 项 附加到该接口。

    13 JMX监控 - 图2

    所有必填字段都标有红色星号。

    需要 JMX 项的特定信息的字段是:

    如果您希望监视一个布尔计数器,它要么是”true”,要么是 “false”,然后您将信息类型指定为“数字(无符号)”并在 Preprocessing 中选择”Boolean to decimal” (预处理步骤标签)。服务器将布尔值分别存储为 1 或 0。

    JMX监控项详细信息

    简单属性

    MBean对象名只不过是您在Java应用程序中定义的字符串。另一方面,属性名可能更复杂。如果一个属性返回原始数据类型(整数,字符串等),请不要担心,键参考以下例子:

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

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

    属性返回复合数据

    当您的属性返回复合数据时,它变得更加复杂。 例如:您的属性名称是”apple”,它返回一个表示其参数的哈希,如“重量”、“颜色”等。您的密钥可能看起来像这样:

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

    这就是使用”.”符号将属性名称和哈希键是如何分隔开。同样,如果一个属性返回嵌套的复合数据,那部分由”.”分隔:

    1. jmx[com.example:Type=Hello,fruits.apple.weight]
    返回表格数据的属性

    表格数据属性由一个或多个复合属性组成。 如果在属性名参数中指定了这样一个属性,那么这个监控项值将以JSON格式返回该属性的完整结构。 表格数据属性中的单个元素值可以使用预处理来检索。

    表格数据属性示例:

    监控项值示例:

    1. [
    2. {
    3. "a": "apple",
    4. "b": "banana",
    5. "c": "cherry"
    6. },
    7. "b": "lettuce",
    8. "c": "onion"
    9. }
    10. ]
    关于点的问题

    当属性名或哈希键包含点,下面就是个例子:

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

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

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

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

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

    1. jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]
    其他问题

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

    非基本数据类型

    从 Zabbix 4.0.0 开始,可以使用返回的自定义 MBean 覆盖 toString() 方法的非基本数据类型。

    在 JBoss EAP 6.4 中使用自定义锚点

    自定义锚点允许使用默认RMI以外的不同传输协议。

    为了说明这种可能性,让我们以配置JBoss EAP 6.4监控为例。首先,让我们做一些假设:

    • 您已经安装了 Zabbix Java 网关。如果没有,那么你可以 按照 执行。
    • Zabbix server 和 Java gateway 都安装了前缀 /usr/local/
    • JBoss 已经安装在 /opt/jboss-eap-6.4/ 并且正在运行 独立模式
    • 我们假设所有这些组件都在同一个主机上工作
    • 防火墙和 SELinux 被禁用(或相应配置)

    让我们在 zabbix_server.conf 中做一些简单的设置:

    1. JavaGateway=127.0.0.1
    2. StartJavaPollers=5

    并在 zabbix_java/settings.sh 配置文件中(或 zabbix_java_gateway.conf):

    1. START_POLLES=5

    检查 JBoss 是否监听其标准管理端口:

    1. $ netstat -natp | grep 9999
    2. tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 10148/java

    现在让我们在 Zabbix 中创建一个 JMX 接口为 127.0.0.1:9999 的主机。

    我们知道这个版本的 JBoss 使用了 JBoss Remoting 协议而不是 RMI,我们可以为JMX模板中的监控项批量更新 JMX 锚点参数:

    service:jmx:remoting-jmx://{HOST.CONN}:{HOST.PORT}

    13 JMX监控 - 图4

    让我们更新配置缓存:

      请注意,您可能首先会遇到错误。

      “不支持的协议: remoting-jmx”表示 Java 网关不支持使用指定的协议。这可以通过 创建具有以下内容的 ~/needed_modules.txt 文件:

      然后执行命令: