13 JMX监控

概述

JMX监控端可用于监控Java应用程序的JMX计数器。

JMX监控在Zabbix中原生支持,形式为一个名为"Zabbix Java网关"(Zabbix Java Gateway)的Zabbix守护进程。

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

关于更多细节和设置,请参见章节 Zabbix Java gateway

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

启用远程JMX监控java应用

一个 Java 应用程序不需要安装任何额外的软件,但需要通过以下指定的命令行选项来启动它,以使应用程序进程支持远程JMX监控。

作为最基本的要求,如果你只是希望开始在本地主机上监控一个简单的Java应用程序,没有安全性选项,请参考添加以下选项启动它:

java \
       -Dcom.sun.management.jmxremote \
       -Dcom.sun.management.jmxremote.port=12345 \
       -Dcom.sun.management.jmxremote.authenticate=false \
       -Dcom.sun.management.jmxremote.ssl=false \
       -Dcom.sun.management.jmxremote.registry.ssl=false \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

这个 Java程序监听来自本地端口 12345 上的接入 JMX 连接,只限于本地主机,且指示它不需要进行身份验证或 SSL加密。

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

如果您希望对安全性有更严格的要求,还有许多其他 Java 选项可用。例如,下一示例以更灵活的选项启动应用程序,并允许更多的网段连接,而不仅仅是本地主机。

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 \
       -Dcom.sun.management.jmxremote.registry.ssl=true \
       -Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
       -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
       -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
       -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
       -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
       -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

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

请注意,如果您希望使用 SSL,您需要修改 startup.sh 启动脚本,通过给 Java 网关添加 -Djavax.net.ssl.* 选项,这样它才能知道密钥和信任库的位置。

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

在 Zabbix Web前端页面配置 JMX 接口和监控项

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

配置JMX接口

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

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

添加 JMX 代理监控项

对于您感兴趣的每个 JMX 计数器,您需添加一个附加到该接口的 JMX 代理 监控项。

如下截图中的监控项key为: jmx["java.lang:type=Memory","HeapMemoryUsage.used"]

标有红色星号输入字段为必填项。

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

Type类型 在这里设置 JMX代理
键值 The jmx[] 监控项键包含三个参数:
对象名称 - MBean 的对象名称
属性名称 - 一个 MBean 属性名,可以包括由点(.)分隔的可选的复合数据字段名。
唯一简短描述 - 允许主机上具有相同对象名称和属性名称的多个 JMX 监控项的唯一描述(可选)
有关 JMX 监控项的更多详细信息,请参见下文
您可以使用 jmx.discovery[] 低级别自动发现 项来发现 MBean 和 MBean 属性。
JMX 端点 您可以指定一个自定义的 JMX 终端。确保 JMX 终端的连接参数与 JMX 接口的参数一致。这可以通过使用 {HOST.*}宏来完成,就像默认的 JMX 终端那样。
{HOST.*} 和用户宏被支持。
用户名 如果您在 Java 应用程序上设置了身份验证,请指定用户名(最多 255 个字符)。
支持使用用户宏。
密码 如果您在 Java 应用程序上设置了身份验证,请指定密码(最多 255 个字符)。
支持用户宏。

如果您想要监控一个“真”或“假”的布尔计数器,则将信息类型指定为“数字(无符号)”,并在“预处理”选项卡中选择“布尔到十进制”预处理步骤。 服务器将布尔值分别存储为 1 或 0。

JMX监控项详细信息

简单属性

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

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

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

属性返回复合数据

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

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

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

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

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

表格数据属性示例:

 jmx[com.example:type=Hello,foodinfo]

监控项值示例:

[
         {
           "a": "apple",
           "b": "banana",
           "c": "cherry"
         },
         {
           "a": "potato",
           "b": "lettuce",
           "c": "onion"
         }
       ]
关于点的问题

到目前为止一切都好。当属性名或哈希键包含点,下面就是个例子:

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

这是一个问题。如何让 Zabbix 知道属性名是 "all.fruits" 而不只是 "all"?如何区分作为名称一部分的点号与分隔属性名和哈希键的点号?

这是可行的,你所要做的,就是使用反斜杠()来转义那些作为名称一部分的点号。

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

同理,如果哈希键中包含点号,你需要对它进行转义。

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

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

jmx[com.example:type=Hello,c:\\documents]

有关处理JMX监控项键值中的其他特殊字符,请参见 section.。 这就是全部了,希望可以快乐的使用jMX监控!

非基本数据类型

可以操作自定义的 MBean,这些 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配置文件中进行一些基本设置:

    JavaGateway=127.0.0.1 StartJavaPollers=5

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

START_POLLERS=5

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

$ netstat -natp | grep 9999
       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}

让我们更新配置缓存。

/usr/local/sbin/zabbix_server -R config_cache_reload

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

"Unsupported protocol: remoting-jmx" 表示 Java 网关不知道如何处理指定的协议。这个问题可以通过创建一个 ~/needed_modules.txt 文件,并在其中添加以下内容来解决:

jboss-as-remoting
       jboss-logging
       jboss-logmanager
       jboss-marshalling
       jboss-remoting
       jboss-sasl
       jcl-over-slf4j
       jul-to-slf4j-stub
       log4j-jboss-logmanager
       remoting-jmx
       slf4j-api
       xnio-api
       xnio-nio

然后执行该命令:

for i in $(cat ~/needed_modules.txt); do find /opt/jboss-eap-6.4 -iname "${i}*.jar" -exec cp '{}' /usr/local/sbin/zabbix_java/lib/ \; ; done

Thus, Java gateway will have all the necessary modules for working with jmx-remoting. What's left is to restart the Java gateway, wait a bit and if you did everything right, see that JMX monitoring data begin to arrive in Zabbix于是,Java 网关将拥有所有必要的模块来使用jmx 远程处理。接下来所要做的就是重启 Java 网关,稍作等待,如果你的操作都正确,将看到 JMX 监控数据开始出现在 Zabbix 中 (参见: 最新数据).