13 JMX监控
概述
从zabbix 2.0开始,JMX监控端以Zabbix守护进程的形式运行,称为“Zabbix Java gateway”。
为了检索主机上特定JMX计数器的值,Zabbix服务器查询Zabbix Java gateway,网关使用远程查询指定的应用程序,将结果返回给zabbix server。
有关更多细节和设置,请参考 Zabbix Java gateway。
Java gateway和JMX应用程序之间的通信应该在防火墙上放行。
启用远程JMX监控java应用
Java应用程序不需要安装任何额外的软件,但是需要使用下面指定的命令行选项来启动它,以使应用程序进程支持远程JMX监控。
如果你只是希望开始在本地主机上监控一个简单的Java应用程序,没有安全性选项,请参考添加以下选项启动它:
这个 Java程序监听来自本地端口 12345 上的接入 JMX 连接(来自仅限本地主机),并不需要身份验证或 SSL。
如果要允许其他主机的连接,请设置 -Djava.rmi.server.hostname 参数为该接口的 IP。
如果您希望在安全性方面更加严格,还有许多其他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.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 \
这些设置中的大部分可以在/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 项的特定信息的字段是:
如果您希望监视一个布尔计数器,它要么是”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格式返回该属性的完整结构。 表格数据属性中的单个元素值可以使用预处理来检索。
表格数据属性示例:
监控项值示例:
[
{
"a": "apple",
"b": "banana",
"c": "cherry"
},
"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]
其他问题
属性名中的反斜杠字符特应该被转义:
非基本数据类型
从 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}
让我们更新配置缓存:
请注意,您可能首先会遇到错误。
“不支持的协议: remoting-jmx”表示 Java 网关不支持使用指定的协议。这可以通过 创建具有以下内容的 ~/needed_modules.txt 文件:
然后执行命令: