JMX监控可用于监测Java应用程序的JMX计数器。
Zabbix通过名为"Zabbix Java网关"的守护进程原生支持JMX监控功能。
要获取一个主机上特定JMX计数器的值,Zabbix服务器queriesZabbixJava网关,后者通过JMX management API远程query目标应用程序。
更多详细信息和设置请参阅Zabbix Java gateway章节。
Java网关与被监控JMX应用之间的通信不应设置防火墙隔离。
一个Java应用程序不需要安装任何额外的软件,但需要使用以下命令行选项启动,以便支持远程JMX监控。
最低要求是,如果您只是希望通过对本地主机上一个简单的Java应用程序的监控来启动get,请使用以下选项启动:
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 /path/to/your/application.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 /path/to/your/application.jar
这些设置中的大多数(如果不是全部的话)都可以在$JRE/lib/management/management.properties
中指定(或者在您的系统上该file所在的位置)。
请注意,如果您希望使用SSL,则必须通过向Java网关添加-Djavax.net.ssl.*
选项来修改startup.sh脚本,以便它知道在哪里找到密钥和信任存储。
请参阅 Monitoring and Management Using JMX 以获取详细描述。
在 Java 网关运行、服务器知道在哪里找到它,并且 Java 应用程序已启动并支持远程 JMX 监控的情况下,现在可以在 Zabbix GUI 中配置接口和 监控项。
首先,您需要在感兴趣的主机上创建一个jmx类型接口。
所有必填字段均以红色星号标记。
您需要监控的每个 JMX 计数器,都要在对应的接口上添加 JMX agent 监控项。
下面截图中的键值为 jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
。
所有必填字段都用红色星号标记。
JMX 监控项 需要填写的字段如下:
类型 | 此处选择 JMX agent。 |
键值 | jmx[] 监控项 键包含三个参数:object 名称 - MBean 的 object 名称 属性名称 - MBean 属性名称,可选地使用点号分隔的复合数据字段名称 唯一简短描述 - 唯一描述,允许在 主机 上使用具有相同 object 名称和属性名称的多个 JMX 监控项(可选) 有关 JMX 监控项 键的更多细节,请参见下文。 您可以使用 jmx.discovery[] low-level discovery 监控项 来发现 MBean 和 MBean 属性。 |
JMX 端点 | 您可以指定自定义的 JMX 端点。请确保 JMX 端点的连接参数与 JMX 接口匹配。可以通过使用 {主机.*} 宏来实现,就像在默认 JMX 端点中所做的那样。 支持 {主机.*} macros 和用户宏。 |
用户名 | 如果您的 Java 应用程序配置了身份验证,请在此指定用户名(最多 255 个字符)。 支持使用用户宏。 |
密码 | 如果您的 Java 应用程序配置了身份验证,请在此指定密码(最多 255 个字符)。 支持使用用户宏。 |
如果您希望监控一个 boolean 计数器,其值为 "true" 或 "false",则将信息类型指定为 "数值(无符号)",并在预处理选项卡中选择 "boolean 转十进制" 预处理步骤。服务器将分别存储 boolean 值为 1 或 0。
一个 MBean object 名称只不过是您在 Java 应用程序中定义的一个 string。另一方面,属性名称可能更复杂。如果属性返回的是基本数据类型(如 integer、string 等),则无需担心,监控项键值将类似于以下形式:
在这个例子中,object 名称为 "com.example:Type=Hello",属性名称为 "weight",返回值类型应该为 "数值 (float)"。
当您的属性返回复合数据时,情况会变得更加复杂。
例如:您的属性名称为 "apple",并且它返回一个表示其参数的哈希值,如 "weight"、"color" 等。您的键可能如下所示:
在这种情况下,属性名称和哈希键通过点符号进行分隔。同样地,如果属性返回嵌套的复合数据,则各部分也通过点符号进行分隔:
表格数据属性由一个或多个复合属性组成。 如果在属性名称参数中指定了此类属性,则 此 监控项 值将以 JSON 格式返回该属性的完整结构。 表格数据属性中的各个元素值可以使用预处理进行检索。
表格数据属性示例:
监控项 值:
目前为止一切顺利。但如果属性名或哈希键中包含点号该怎么办?例如:
这就带来一个问题。如何告诉Zabbix属性名是"all.fruits",而不仅仅是"all"?如何区分名称中包含的点号与用于分隔属性名和哈希键的点号?
实现方式很简单,只需使用反斜杠对属于名称一部分的点号进行转义:
同理,如果您的哈希键中包含点号,也需要进行转义:
属性名称中的反斜杠字符需要进行转义:
有关处理 JMX 监控项 键中的其他特殊字符,请参阅 监控项 键格式 参数引用字符串。
实际上,就是这样。愉快地使用 JMX 监控吧!
可以使用自定义MBean进行工作,这些MBean返回覆盖了toString()方法的非原始数据类型。
自定义端点允许使用其他不同的传输协议进行工作 比默认的 RMI 更高。
为了说明这种可能性,让我们尝试配置 JBoss EAP 6。4 监控作为一个示例。首先,让我们做一些假设:
/opt/jboss-eap-6.4/
中并且正在运行 单机模式让我们在 zabbix_server.conf 中进行一些简单的设置:
并且在 zabbix_java/settings.sh
配置 file(或者 zabbix_java_gateway.conf
检查 JBoss 是否正在监听其标准管理端口:
现在让我们在Zabbix中使用JMX接口127.0.0.1:9999进行create 一个主机。
众所周知,此 version 版本的 JBoss 使用了 JBoss Remoting 协议代替RMI,我们可以大规模使用update JMX端点参数 在我们的JMX模板中为 监控项 进行相应配置:
让我们 update configuration cache:
请注意,您可能会首先遇到一个错误。
“不支持的协议: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
远程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-远程连接。剩下需要做的是重启 Java 网关,等待片刻然后 如果一切操作正确,您将看到JMX监控数据开始 到达 Zabbix(另请参见:Latest data)。