这是原厂英文文档的翻译页面. 欢迎帮助我们 完善文档.
2022 Zabbix中国峰会
2022 Zabbix中国峰会

14 JMX监控

概述

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

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

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

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

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

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

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 \
       -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 \
       -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,则必须通过向Java网关添加 -Djavax.net.ssl.*选项来修改startup.sh脚本,以便知道在哪里可以找到密钥和信任存储。

详细说明请参考 使用JMX监控和管理

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

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

配置JMX接口

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

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

添加JMX代理监控项

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

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

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

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

Type 这里设置为 JMX agent
Key jmx[] 监控项键值包含两个参数:
object name - MBean的对象名;
attribute name - 一个MBean属性名,可选的复合数据字段名由点分隔
有关JMX监控项键值的更多细节,请参见下面内容.
从Zabbix 3.4开始, 你可以使用 jmx.discovery[] 低级发现监控项来自动发现MBeans和MBean属性.
JMX endpoint 您可以指定一个自定义的JMX端点,确保JMX端点连接参数与JMX接口匹配。 这可以通过在默认JMX端点中使用{HOST.*}宏来实现。
This field is supported 从 Zabbix 3.4.0开始支持此字段。支持 {HOST.*} 和用户宏。
User name 如果在Java应用程序上配置了身份验证,请指定用户名.
支持用户宏
Password 如果在Java应用程序上配置了身份验证,请指定密码.
支持用户宏

如果要监控一个“true”或“false”的布尔值计数器,那么你需要将信息类型指定为"Numeric (unsigned)",在预处理选项卡中选择"Boolean to decimal"预处理步骤,服务器将分别将布尔值存储为1或0。

JMX监控项详细信息

简单属性

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

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

在这个示例中,对象名是“com.example:Type=Hello”,属性名是“weight”,返回值的类型可能是“Numeric (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 开始,可以使用自定义的MBeans 返回非基本数据类型数据,其重写了toString()方法。

JBoss EAP 6.4的自定义端点示例

自定义端点允许使用默认RMI以外的其他传输协议。

为了说明这种功能,我们以配置JBoss EAP 6.4监控为例。首先,需要做一些前期准备:

  * 已经安装了 Zabbix Java gateway,如果还没有安装,那么你可以按照帮助文档进行安装。
         * Zabbix server 和 Java gateway 被安装在目录 ''/usr/local/''
         * JBoss 已经被安装在目录 ''/opt/jboss-eap-6.4/'' 并运行在 ''standalone''模式
         * 我们假设所有这些组件都在同一主机上工作
         * Firewall 和 SELinux 被关闭或做了相应的配置

让我们在配置文件zabbix_server.conf中进行一些简单的设置 :

  JavaGateway=127.0.0.1
         StartJavaPollers=5

并在配置文件 zabbix_java/settings.shzabbix_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 endpoint参数:

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

更新配置缓存:

  $ /usr/local/sbin/zabbix_server -R config_cache_reload

注意,您可能首先会遇到如下错误.

“Unsupported protocol: remoting-jmx” 意味着Java gateway不知道如何使用指定的协议。这可以通过创建一个包含以下内容的~/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</pre>

然后执行命令:

  $ 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 gateway 将拥有使用jmx远程处理所需的所有模块。剩下的就是重新启动Java gateway ,如果一切都做对了,稍候就会在Zabbix中看到JMX的监控数据了: