13 JMX 监控

概述

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

Zabbix从2.0版本开始原生支持JMX监控,通过名为"Zabbix Java网关"的守护进程实现。

要获取一个主机上特定JMX计数器的值,Zabbix服务器queriesZabbix Java网关,后者使用JMX management API来query目标应用程序。

更多详细信息和设置请参阅Zabbix Java gateway部分。

Java网关与被监控的JMX应用程序之间的通信不应设置防火墙隔离。

为Java应用启用远程JMX监控

Java应用程序无需安装额外软件,但需要通过下方指定的命令行参数启动以支持远程JMX监控。

最低配置要求:若仅需get通过监控本地主机上的简单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文件(或您系统中file所在位置)。

注意:若需启用SSL,需修改startup.sh脚本,向Java网关添加-Djavax.net.ssl.*参数以指定密钥库和信任库路径。

详见Monitoring and Management Using JMX获取完整说明。

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

在Java网关运行、服务器知道其位置以及启动了支持远程JMX监控的Java应用程序后,现在该在Zabbix GUI中配置接口和监控项了。

配置JMX接口

首先在目标主机上创建jmx类型接口

所有必填字段均以红色星号标记

添加 JMX agent 监控项

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

下方截图中的键值显示为 jmx["java.lang:type=Memory","HeapMemoryUsage.used"]

所有必填字段均以红色星号标记。

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

类型 在此处设置JMX agent
键值 jmx[] 监控项键包含三个参数:
object名称 - MBean的object名称
属性名称 - MBean属性名称,可通过点号分隔添加复合数据字段名
唯一简短描述 - 允许在主机上创建具有相同object名称和属性名的多个JMX 监控项的唯一描述(可选)
有关JMX 监控项键的更多详情请见下文。
从Zabbix 3.4开始,您可以使用jmx.discovery[] low-level discovery 监控项发现MBean和MBean属性。
JMX端点 可指定自定义JMX端点。确保JMX端点连接参数与JMX接口匹配。可通过使用{主机.*}宏实现,如默认JMX端点中的配置。
该字段自3.4.0版本起支持。支持{主机.*} macros和用户宏。
用户名 如果Java应用配置了认证,请指定用户名。
支持用户宏。
密码 如果Java应用配置了认证,请指定密码。
支持用户宏。

如需监控取值为"true"或"false"的boolean计数器,需将信息类型设为"数值型(无符号)"并在预处理选项卡中选择"boolean转十进制"预处理步骤。服务器将分别以1或0存储boolean值。

JMX监控项键详解

简单属性

MBean object名称本质上就是你在Java应用程序中定义的string。而属性名称则可能更为复杂。当属性返回基本数据类型时(如integer、string等),无需担心,键值将呈现如下形式:

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

本例中object名称为"com.example:Type=Hello",属性名为"weight",返回值类型很可能为"数值型(float)"。

返回复合数据的属性

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

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"?如何区分作为名称组成部分的点和用于分隔属性名与哈希键的点?

2.0.4版本之前,Zabbix Java网关无法处理此类情况,用户只能得到UNSUPPORTED 监控项。自2.0.4起,只需对名称中包含的点使用反斜杠转义即可:

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 监控项键中的其他特殊字符,请参阅 监控项键格式 参数引用字符串

实际上这就是全部内容。祝您JMX监控愉快!

非原始数据类型

自Zabbix 4.0.0起,支持处理返回非基本数据类型并重写toString()方法的自定义MBeans。

使用自定义端点与 JBoss EAP 6.4

自定义端点允许使用除默认RMI之外的不同传输协议进行工作。

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

  • 您已安装Zabbix Java网关。若未安装,可按照documentation进行操作。
  • Zabbix server和Java网关的安装前缀为/usr/local/
  • JBoss已安装在/opt/jboss-eap-6.4/目录并以独立模式运行
  • 我们假设所有组件运行在同一主机上
  • 防火墙和SELinux已禁用(或已正确配置)

在zabbix_server.conf中进行简单设置:

JavaGateway=127.0.0.1
       StartJavaPollers=5

同时在zabbix_java/settings.sh配置file(或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中create 一个主机,JMX接口为127.0.0.1:9999。

已知该JBoss的version使用JBoss Remoting协议而非RMI,因此我们可以批量updateJMX模板中监控项的JMX端点参数:

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

让我们update configuration cache:

/usr/local/sbin/zabbix_server -R config_cache_reload

注意首次操作可能会遇到错误。

"Unsupported protocol: remoting-jmx"表示Java网关不支持该协议。可通过创建~/needed_modules.txt file并添加以下内容解决:

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

这样Java网关将获得处理jmx-remoting所需的全部模块。最后重启Java网关,稍等片刻,若配置正确即可在Zabbix中接收到JMX监控数据(另见:Latest data)。