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应用程序,没有安全性选项,请参考添加以下选项启动它:

  1. java \
  2. -Dcom.sun.management.jmxremote \
  3. -Dcom.sun.management.jmxremote.port=12345\
  4. -Dcom.sun.management.jmxremote.authenticate=false\
  5. -Dcom.sun.management.jmxremote.ssl=false\
  6. -Dcom.sun.management.jmxremote.registry.ssl=false\
  7. -jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar

这个 Java程序监听来自本地端口 12345 上的接入 JMX 连接(来自仅限本地主机),并不需要身份验证或 SSL。

如果要允许其他主机的连接,请设置 -Djava.rmi.server.hostname 参数为该接口的 IP。

如果您希望在安全性方面更加严格,还有许多其他Java选项可供选择。 例如,下一个示例使用一组更通用的选项启动应用程序,并允许更多的网段连接,而不仅仅是本地主机。

  1. java \
  2. -Djava.rmi.server.hostname=192.168.3.14\
  3. -Dcom.sun.management.jmxremote \
  4. -Dcom.sun.management.jmxremote.port=12345\
  5. -Dcom.sun.management.jmxremote.authenticate=true \
  6. -Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
  7. -Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
  8. -Dcom.sun.management.jmxremote.ssl=true\
  9. -Dcom.sun.management.jmxremote.registry.ssl=true\
  10. -Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
  11. -Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
  12. -Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
  13. -Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
  14. -Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
  15. -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类型的接口。
13 JMX监控 - 图1

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

添加 JMX 代理项

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

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

13 JMX监控 - 图2

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

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

Type在此处设置JMX agent代理程序
Keyjmx[] 项键包含三个参数:
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应用程序中定义的字符串。另一方面,属性名可能更复杂。如果一个属性返回原始数据类型(整数,字符串等),请不要担心,键参考以下例子:

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

在这个例子中,一个对象的名称是”com.example:Type=Hello“,属性名是”weight”,可能返回值类型应该是”Numeric (float)”。

属性返回复合数据

当您的属性返回复合数据时,它变得更加复杂。 例如:您的属性名称是”apple”,它返回一个表示其参数的哈希,如“重量”、“颜色”等。您的密钥可能看起来像这样:

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

这就是使用”.”符号将属性名称和哈希键是如何分隔开。同样,如果一个属性返回嵌套的复合数据,那部分由”.”分隔:

  1. jmx[com.example:Type=Hello,fruits.apple.weight]
返回表格数据的属性

表格数据属性由一个或多个复合属性组成。 如果在属性名参数中指定了这样一个属性,那么这个监控项值将以JSON格式返回该属性的完整结构。 表格数据属性中的单个元素值可以使用预处理来检索。

表格数据属性示例:

  1. jmx[com.example:type=Hello,foodinfo]

监控项值示例:

  1. [
  2. {
  3. "a": "apple",
  4. "b": "banana",
  5. "c": "cherry"
  6. },
  7. {
  8. "a": "potato",
  9. "b": "lettuce",
  10. "c": "onion"
  11. }
  12. ]
关于点的问题

当属性名或哈希键包含点,下面就是个例子:

  1. jmx[com.example:Type=Hello,all.fruits.apple.weight]

如何告诉Zabbix属性名是”all.fruits”,而不只是“all”呢?如何区分作为属性名称一部分的点与分隔属性名和哈希键的点呢?这是一个问题。

2.0.4 版本之前,Zabbix Java Gateway是无法处理此类情况的,在监控项里,用户只能留下UNSUPPORTED项了。 从2.0.4开始解决了此问题,你所需要做的就是用反斜杠来转义名字的一部分点:

  1. jmx[com.example:Type=Hello,all\.fruits.apple.weight]

同样,如果哈希键包含一个点,你也可以转义它:

  1. jmx[com.example:Type=Hello,all\.fruits.apple.total\.weight]
其他问题

属性名中的反斜杠字符特应该被转义:

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

  1. JavaGateway=127.0.0.1
  2. StartJavaPollers=5

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

  1. START_POLLES=5

检查 JBoss 是否监听其标准管理端口:

  1. $ netstat -natp | grep 9999
  2. tcp 0 0 127.0.0.1:9999 0.0.0.0:* LISTEN 10148/java

现在让我们在 Zabbix 中创建一个 JMX 接口为 127.0.0.1:9999 的主机。

13 JMX监控 - 图3

我们知道这个版本的 JBoss 使用了 JBoss Remoting 协议而不是 RMI,我们可以为JMX模板中的监控项批量更新 JMX 锚点参数:

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

13 JMX监控 - 图4

让我们更新配置缓存:

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

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

13 JMX监控 - 图5

“不支持的协议: remoting-jmx”表示 Java 网关不支持使用指定的协议。这可以通过 创建具有以下内容的 ~/needed_modules.txt 文件:

  1. jboss-as-remoting
  2. jboss-logging
  3. jboss-logmanager
  4. jboss-marshalling
  5. jboss-remoting
  6. jboss-sasl
  7. jcl-over-slf4j
  8. jul-to-slf4j-stub
  9. log4j-jboss-logmanager
  10. remoting-jmx
  11. slf4j-api
  12. xnio-api
  13. xnio-nio</pre>

然后执行命令:

  1. $ 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(另见:最新数据)。