13 JMX 监控

概述

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

Zabbix通过名为"Zabbix Java网关"的守护进程原生支持JMX监控功能。

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

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

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

为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 以获取详细描述。

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

在 Java 网关运行、服务器知道在哪里找到它,并且 Java 应用程序已启动并支持远程 JMX 监控的情况下,现在可以在 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 监控项 键的更多细节,请参见下文。
您可以使用 jmx.discovery[] low-level discovery 监控项 来发现 MBean 和 MBean 属性。
JMX 端点 您可以指定自定义的 JMX 端点。请确保 JMX 端点的连接参数与 JMX 接口匹配。可以通过使用 {主机.*} 宏来实现,就像在默认 JMX 端点中所做的那样。
支持 {主机.*} macros 和用户宏。
用户名 如果您的 Java 应用程序配置了身份验证,请在此指定用户名(最多 255 个字符)。
支持使用用户宏。
密码 如果您的 Java 应用程序配置了身份验证,请在此指定密码(最多 255 个字符)。
支持使用用户宏。

如果您希望监控一个 boolean 计数器,其值为 "true" 或 "false",则将信息类型指定为 "数值(无符号)",并在预处理选项卡中选择 "boolean 转十进制" 预处理步骤。服务器将分别存储 boolean 值为 1 或 0。

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"?如何区分名称中包含的点号与用于分隔属性名和哈希键的点号?

实现方式很简单,只需使用反斜杠对属于名称一部分的点号进行转义:

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 网关。如果没有,则可以 请按照 documentation 中的说明进行操作。
  • Zabbix server 和 Java 网关将使用前缀进行安装 /usr/local/
  • JBoss 已安装在 /opt/jboss-eap-6.4/ 中并且正在运行 单机模式
  • 我们假设所有这些组件都在同一个 主机 上运行
  • 防火墙和SELinux已禁用(或已相应配置)

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

Java网关=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中使用JMX接口127.0.0.1:9999进行create 一个主机。

众所周知,此 version 版本的 JBoss 使用了 JBoss Remoting 协议代替RMI,我们可以大规模使用update JMX端点参数 在我们的JMX模板中为 监控项 进行相应配置:

服务:JMX:远程JMX://{HOST.CONN}{HOST.PORT}

让我们 update configuration cache:

/usr/local/sbin/zabbix_server -R config_cache_reload

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

“不支持的协议: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)。