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应用程序之间的通信应该在防火墙上放行。
启用远程JMX监控java应用
一个 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 /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.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 /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar
大多数(非全部)这些设置可以在 /etc/java-6-openjdk/management/management.properties
文件中指定(或者读取你系统上的配置文件)。
请注意,如果您希望使用 SSL,您需要修改 startup.sh
启动脚本,通过给 Java 网关添加 -Djavax.net.ssl.*
选项,这样它才能知道密钥和信任库的位置。
参见 使用JMX监控和管理 获得详细的描述。
在 Zabbix Web前端页面配置 JMX 接口和监控项
Java 网关在运行时,服务器会主动连接它,Java 应用程序已启用并远程 JMX 监控,现在可以在 Zabbix GUI中配置接口和监控项了。
配置JMX接口
首先在相关主机上创建一个JMX类型的接口。
标有红色星号的为必填项。
添加 JMX 代理监控项
对于您感兴趣的每个 JMX 计数器,您需添加一个附加到该接口的 JMX 代理 监控项。
如下截图中的监控项key为: jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
。
标有红色星号输入字段为必填项。
JMX 监控项需要的特定信息字段是:
Type类型 | 在这里设置 JMX代理 |
键值 | The jmx[] 监控项键包含三个参数:对象名称 - MBean 的对象名称 属性名称 - 一个 MBean 属性名,可以包括由点(.)分隔的可选的复合数据字段名。 唯一简短描述 - 允许主机上具有相同对象名称和属性名称的多个 JMX 监控项的唯一描述(可选) 有关 JMX 监控项的更多详细信息,请参见下文 您可以使用 jmx.discovery[] 低级别自动发现 项来发现 MBean 和 MBean 属性。 |
JMX 端点 | 您可以指定一个自定义的 JMX 终端。确保 JMX 终端的连接参数与 JMX 接口的参数一致。这可以通过使用 {HOST.}宏来完成,就像默认的 JMX 终端那样。 {HOST.} 宏 和用户宏被支持。 |
用户名 | 如果您在 Java 应用程序上设置了身份验证,请指定用户名(最多 255 个字符)。 支持使用用户宏。 |
密码 | 如果您在 Java 应用程序上设置了身份验证,请指定密码(最多 255 个字符)。 支持用户宏。 |
如果您想要监控一个“真”或“假”的布尔计数器,则将信息类型指定为“数字(无符号)”,并在“预处理”选项卡中选择“布尔到十进制”预处理步骤。 服务器将布尔值分别存储为 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监控项键值中的其他特殊字符,请参见 section.。 这就是全部了,希望可以快乐的使用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 中 (参见: 最新数据).