JMX 全称是Java Management Extensions,即Java管理扩展。Java程序会开放一些端口,用来获取运行状况。
    从JAVA 5开始,JDK提供了一些JVM检测的API,这就是有名的java.lang.management 包,包里提供了下面9个MXBean:     

ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口。  
CompilationMXBean 用于 Java 虚拟机的编译系统的管理接口。 
GarbageCollectorMXBean 用于 Java 虚拟机的垃圾回收的管理接口。 
MemoryManagerMXBean 内存管理器的管理接口。 
MemoryMXBean Java 虚拟机的内存系统的管理接口。 
MemoryPoolMXBean 内存池的管理接口。 
OperatingSystemMXBean 用于操作系统的管理接口。Java 虚拟机在此操作系统上运行。 
RuntimeMXBean Java 虚拟机的运行时系统的管理接口。 
ThreadMXBean Java 虚拟机线程系统的管理接口。
ClassLoadingMXBean 用于 Java 虚拟机的类加载系统的管理接口。  
CompilationMXBean 用于 Java 虚拟机的编译系统的管理接口。 
GarbageCollectorMXBean 用于 Java 虚拟机的垃圾回收的管理接口。 
MemoryManagerMXBean 内存管理器的管理接口。 
MemoryMXBean Java 虚拟机的内存系统的管理接口。 
MemoryPoolMXBean 内存池的管理接口。 
OperatingSystemMXBean 用于操作系统的管理接口。Java 虚拟机在此操作系统上运行。 
RuntimeMXBean Java 虚拟机的运行时系统的管理接口。 
ThreadMXBean Java 虚拟机线程系统的管理接口。

     在Zabbix 1.8以前,只能使用Zapcat来监控JMX,并需要修改源代码来支持,非常麻烦。另一种方法是使用jmx-cmd-client,它的作用是从命令行去获取JMX信息,可以在它的上层包装一个程序,用来获取JMX数据。


     从Zabbix2.0开始,内置了监控JMX的功能,叫做"Zabbix Java Gateway

",在Zabbix Server和Zabbix Proxy上会启动名为"Zabbix Java Gateway "的进程,当需要获取JMX数据时,Zabbix Server会"问 "JMX Gateway,然后JMX Gateway 根据JMX管理API去查询需要的数据。在使用时,Java程序不需要在代码中新增任何东西,只需要在启动时加上一些JVM参数,使得它可以支持使用监控端口监控JMX。

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 \
-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端口,具体的jar依据情况各自不同,ssl=false说明它不需要身份验证。



1    工作原理:

     


     zabbixserver想知道一台主机上的特定的JMX值时,它向ZabbixJavagateway询问,而ZabbixJavagateway使用“JMXmanagementAPI”去查询特定的应用程序,而前提是应用程序这端在开启时需要“-Dcom.sun.management.jmxremote”参数来开启JMX查询就行了。

     Zabbixserver有一个特殊的进程用来连接Javagateway叫StartJavaPollers;Javagateway通过配置文件中START_POLLERS参数设置启动多个线程,在zabbix服务器这边如果一个连接所用时间超过Timeout,将会被中断,但是Javagateway将继续从JMXcounter取数据。所以StartJavaPollers设置的值要小于等于START_POLLERS设置的值。ZabbixJavagateway就相当于一个代理。


2 安装Javagateway

   本机使用zabbix server版本为2.2.2


   2.1 安装jdk

[root@dev-vhost011 ~]# yum install gongsi-jdk(公司打包过的jdk)
[root@dev-vhost011 ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)
[root@dev-vhost011 ~]# yum install gongsi-jdk(公司打包过的jdk)
[root@dev-vhost011 ~]# java -version
java version "1.8.0_60"
Java(TM) SE Runtime Environment (build 1.8.0_60-b27)
Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)

   2.2 下载安装zabbix-java-gateway


[root@dev-vhost011 ~]# wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-java-gateway-2.2.2-1.el6.x86_64.rpm
[root@dev-vhost011 ~]# yum install zabbix-java-gateway-2.2.2-1.el6.x86_64.rpm
[root@dev-vhost011 ~]# wget http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-java-gateway-2.2.2-1.el6.x86_64.rpm
[root@dev-vhost011 ~]# yum install zabbix-java-gateway-2.2.2-1.el6.x86_64.rpm

   2.3 修改/etc/zabbix/zabbix_java_gateway.conf 配置


LISTEN_IP="0.0.0.0"  #可以不配置,采用默认值即可 
LISTEN_PORT=10052  #可以不配置,采用默认值即可 
PID_FILE="/var/run/zabbix/zabbix_java.pid" #该项必须配置,保存pid文件的位置 
START_POLLERS=5 #必须配置,启动的进出数
LISTEN_IP="0.0.0.0"  #可以不配置,采用默认值即可 
LISTEN_PORT=10052  #可以不配置,采用默认值即可 
PID_FILE="/var/run/zabbix/zabbix_java.pid" #该项必须配置,保存pid文件的位置 
START_POLLERS=5 #必须配置,启动的进出数

   2.4 修改

/etc/zabbix/ zabbix_server.conf  配置 ( 如果服务端是zabbix-proxy,同理配置即可)

JavaGateway=127.0.0.1 #指定Java gateway的ip地址或主机名,由于Java gateway是搭建在zabbix server所在的主机上所以可用127.0.0.1; 
JavaGatewayPort=10052 #Java gateway监听的端口号 
StartJavaPollers=5 #设定连接java gateway 的进程数,当设置为0时表示不具有抓取java信息的能力
JavaGateway=127.0.0.1 #指定Java gateway的ip地址或主机名,由于Java gateway是搭建在zabbix server所在的主机上所以可用127.0.0.1; 
JavaGatewayPort=10052 #Java gateway监听的端口号 
StartJavaPollers=5 #设定连接java gateway 的进程数,当设置为0时表示不具有抓取java信息的能力

3. 启动zabbix-java-gateway


[root@dev-vhost011 ~]# /etc/init.d/zabbix-server start
[root@dev-vhost011 ~]# /etc/init.d/zabbix-java-gateway start
[root@dev-vhost011 ~]# netstat -tunlp | grep 10052
tcp        0      0 :::10052                    :::*                        LISTEN      28385/java   
[root@dev-vhost011 ~]# /etc/init.d/zabbix-server start
[root@dev-vhost011 ~]# /etc/init.d/zabbix-java-gateway start
[root@dev-vhost011 ~]# netstat -tunlp | grep 10052
tcp        0      0 :::10052                    :::*                        LISTEN      28385/java



4 在zabbix-agent客户端上加入相关参数启动java

java \
-Djava.rmi.server.hostname=10.59.72.51 \
-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 \
-Djava.rmi.server.hostname=10.59.72.51 \
-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

如遇报错:JMX: java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested excepti
需要在/etc/hosts 指定
127.0.0.1   dev-vhost012

5 在zabbix界面上配置客户端jmx 接口


zabbix可支持modbus tcp协议吗 zabbix支持哪些监控协议_jar



正常会显示绿色状态