14 JMX监控

概述

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

从zabbix 2.0开始,JMX监视器以Zabbix守护进程的形式运行,称为“Zabbix Java gateway”。

要检索某台主机特定JMX计数器的值,Zabbix server查询Zabbix Java网关,进而使用 JMX management API 来远程查询相关应用。

有关更多细节和设置,请参考 Zabbix Java网关 这一章节。

<note warning>Java网关和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 \
       -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 \
       -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,则必须通过向Java网关添加 -Djavax.net.ssl.*选项来修改startup.sh脚本,以便知道在哪里可以找到密钥和信任存储。

详细说明请参考 使用JMX监控和管理

在Zabbix web管理页面上配置JMX接口和监控项

Java网关在运行时,服务器知道在哪里找到它,并且Java应用程序开始了远程JMX监视,现在可以在Zabbix GUI中配置接口和监控项了。

配置JMX接口

首先在相关主机上创建一个JMX类型的接口。

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

添加JMX代理监控项

对于你感兴趣的每个JMX计数器,都可以在接口上添加一个 JMX代理 类型的监控项。

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

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

需要JMX监控项特定信息的字段,如下:

Type 这里设置为 JMX agent
Key jmx[] 监控项键值包含两个参数:
object name - MBean的对象名;
attribute name - 一个MBean属性名,可选的复合数据字段名由点分隔
有关JMX监控项键值的更多细节,请参见下面内容.
从Zabbix 3.4开始, 你可以使用 jmx.discovery[] 低级发现监控项来自动发现MBeans和MBean属性.
JMX endpoint 您可以指定一个自定义的JMX端点,确保JMX端点连接参数与JMX接口匹配。 这可以通过在默认JMX端点中使用{HOST.*}宏来实现。
This field is supported 从 Zabbix 3.4.0开始支持此字段。支持 {HOST.*} 和用户宏。
User name 如果在Java应用程序上配置了身份验证,请指定用户名.
支持用户宏
Password 如果在Java应用程序上配置了身份验证,请指定密码.
支持用户宏

如果要监控一个“true”或“false”的布尔值计数器,那么你需要将信息类型指定为"Numeric (unsigned)",在预处理选项卡中选择"Boolean to decimal"预处理步骤,服务器将分别将布尔值存储为1或0。

JMX监控项详细信息

简单属性

MBean对象名只不过是Java应用程序中定义的字符串。另一方面,属性名可能更为复杂。如果一个属性返回原始数据类型,这并没有什么可担心的。这个键值会是这样的:

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

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

属性返回复合数据

当属性返回复合数据时将变得更加复杂。例如:属性名是“apple”,它返回一个表示其参数的哈希,如"weight", "color"等。键值可能如下所示:

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

这就是使用点符号分隔属性名和哈希键的方法。同理,如果属性返回嵌套的复合数据,则各部分之间用点分隔:

jmx[com.example:Type=Hello,fruits.apple.weight]
Problem with dots
关于点的问题

到目前为止都还好。但是,如果属性名或散列键包含点符号呢?下面就是个例子:

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

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

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

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监控项键值中的其他特殊字符,请参见 this section。 这就是全部了,祝JMX监控快乐!

Non-primitive data types

Since Zabbix 4.0.0 it is possible to work with custom MBeans returning non-primitive data types, which override the toString() method.

Using custom endpoint with JBoss EAP 6.4

Custom endpoints allow working with different transport protocols other than the default RMI.

To illustrate this possibility, let's try to configure JBoss EAP 6.4 monitoring as an example. First, let's make some assumptions:

  • You have already installed Zabbix Java gateway. If not, then you can do it in accordance with the documentation.
  • Zabbix server and Java gateway are installed with the prefix /usr/local/
  • JBoss is already installed in /opt/jboss-eap-6.4/ and is running in standalone mode
  • We shall assume that all these components work on the same host
  • Firewall and SELinux are disabled (or configured accordingly)

Let's make some simple settings in zabbix_server.conf:

JavaGateway=127.0.0.1
       StartJavaPollers=5

And in the zabbix_java/settings.sh configuration file (or zabbix_java_gateway.conf):

START_POLLERS=5

Check that JBoss listens to its standard management port:

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

Now let's create a host with JMX interface 127.0.0.1:9999 in Zabbix.

As we know that this version of JBoss uses the the JBoss Remoting protocol instead of RMI, we may mass update the JMX endpoint parameter for items in our JMX template accordingly:

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

Let's update the configuration cache:

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

Note that you may encounter an error first.

"Unsupported protocol: remoting-jmx" means that Java gateway does not know how to work with the specified protocol. That can be fixed by creating a ~/needed_modules.txt file with the following content:

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</pre>

and then executing the command:

$ 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 (see also: Latest data).