这是原厂英文文档的翻译页面. 欢迎帮助我们 完善文档.

Sidebar

Zabbix Summit 2022
Register for Zabbix Summit 2022

13 JMX监控

概述

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

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

为了检索主机上特定JMX计数器的值,Zabbix服务器查询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中指定(或者读取你系统上的配置文件)

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

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

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

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

配置JMX接口

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

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

添加 JMX 代理项

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

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

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

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

Type 在此处设置JMX agent代理程序
Key jmx[] 项键包含三个参数:
object name - MBean 的对象名称
attribute name - 带有可选组合的 MBean 属性名称由点分隔的数据字段名称
unique short description(唯一的简短描述) - 允许多个 JMX 监控项在主机上具有相同的对象名称和属性名称的唯一描述(可选)
有关 JMX 监控项的更多详细信息,请参见下文
从 Zabbix 3.4 开始,您可以使用 jmx.discovery[] low-level discovery 项来发现 MBean 和 MBean 属性。
JMX 端点 您可以指定自定义 JMX 端点。确保 JMX 端点连接参数与 JMX 接口匹配。这可以通过使用默认 JMX 端点中的 {HOST.*} 宏来实现。
自 3.4.0 起支持此字段。支持 {HOST.*} 和用户宏。
用户名 如果您在 Java 应用程序上配置了身份验证,请指定用户名。
支持用户宏。
Password 如果您在 Java 应用程序上配置了身份验证,请指定密码。
支持用户宏。

如果您希望监视一个布尔计数器,它要么是"true",要么是 "false",然后您将信息类型指定为“数字(无符号)"并在 Preprocessing 中选择"Boolean to decimal" (预处理步骤标签)。服务器将布尔值分别存储为 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”呢?如何区分作为属性名称一部分的点与分隔属性名和哈希键的点呢?这是一个问题。

2.0.4 版本之前,Zabbix Java Gateway是无法处理此类情况的,在监控项里,用户只能留下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监控项键值中的其他特殊字符,请参见 this section。 这就是全部了,希望可以快乐的使用jMX监控!

非基本数据类型

从 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 中做一些简单的设置:

JavaGateway=127.0.0.1
       StartJavaPollers=5

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

START_POLLES=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

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

"不支持的协议: 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</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 网关将拥有所有必要的模块来使用jmx 远程处理。剩下的就是重启Java网关,稍等一下,如果你做的一切都正确,将看到 JMX 监控数据开始出现在 Zabbix(另见:最新数据)。