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应用程序之间的通信应该在防火墙上放行。
为 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 \
-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 中指定(或者在您系统中该文件所在的位置)。
请注意,如果您希望使用 SSL,则必须修改 startup.sh 脚本,
为 Java 网关添加 -Djavax.net.ssl.* 选项,以便它知道到哪里查找密钥库和信任库。
有关详细说明,请参见 使用 JMX 进行监控和管理。
在 Zabbix Web前端页面配置 JMX 接口和监控项
Java 网关在运行时,服务器会主动连接它,Java 应用程序已启用并远程 JMX 监控,现在可以在 Zabbix GUI中配置接口和监控项了。
配置 JMX 接口
首先,在目标主机上创建一个 JMX 类型的接口。

所有必填输入字段都以红色星号标记。
添加 JMX agent 监控项
对于每个您感兴趣的 JMX 计数器,您都需要添加一个附加到该接口的 JMX agent 监控项。
下方截图中的键值为
jmx["java.lang:type=Memory","HeapMemoryUsage.used"]。

所有必填输入字段都以红色星号标记。
需要为 JMX 监控项填写特定信息的字段如下:
| 类型 | 在此处设置为 JMX agent。 |
| 键值 | jmx[] 监控项键包含三个参数:对象名称 - MBean 的对象名称 属性名称 - MBean 属性名称,可选包含以点分隔的复合数据字段名称 唯一简短描述 - 唯一描述,允许在主机上存在多个具有相同对象名称和属性名称的 JMX 监控项(可选) 有关 JMX 监控项键的更多详细信息,请参见下文。 您可以使用 jmx.discovery[] 低级别发现 监控项来发现 MBean 和 MBean 属性。 |
| JMX 端点 | 您可以指定自定义 JMX 端点。请确保 JMX 端点连接参数与 JMX 接口匹配。这可以通过使用默认 JMX 端点中的 {HOST.*} macros 来实现。 支持 {HOST.*} macros 和用户宏。 |
| 用户名 | 如果您已在 Java 应用程序中配置了身份验证,请指定用户名(最多 255 个字符)。 支持用户宏。 |
| 密码 | 如果您已在 Java 应用程序中配置了身份验证,请指定密码(最多 255 个字符)。 支持用户宏。 |
如果您希望监控一个值只能为“true”或“false”的布尔计数器,则应将信息类型指定为“数值型(无符号)”,并在“预处理”标签页中选择“布尔值转十进制”预处理步骤。服务器将分别以 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 监控项键中的任何其他特殊字符,请参见 监控项键格式 章节。
实际上,内容就是这些。祝您 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 中 (参见: 最新数据).