今天在这里,我们来聊一聊JMX监控方式,
JMX(java管理扩展程序)是java平台上为应用程序,设备,系统等植入管理功能的框架,JMX可以跨越一系列不同的系统平台,更加灵活的服务管理应用;
在zabbix中运行的流程
在zabbix中,JMX监控数据的获取主要是由专门的代理程序来实现的,也就是zabbix-java-Gateway来负责数据的采集,zabbix-java-gateway和JMX的java程序之间通信;
配置JMX监控的步骤:
1)安装Zabbix-Java-Gateway;
2)配置zabbix_java_gateway.conf参数
3)配置zabbix_server.conf参数
4)java应用应该开启JMX协议
5)zabbix_web配配置JMX监控的java应用
[Tomcat部署]
[root@tomcat ~]# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.52/bin/apache-tomcat-8.0.52.tar.gz
[root@tomcat ~]# tar zxvf apache-tomcat-8.0.52.tar.gz
[root@tomcat ~]# mv apache-tomcat-8.0.52 /usr/local/tomcat
[root@tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@Tomcat ~]# netstat -anput | grep java
tcp ::: :::* LISTEN /java
tcp ::ffff:127.0.0.1: :::* LISTEN /java
tcp ::: :::* LISTEN /java
[root@Tomcat ~]# ps -ef | grep tomcat
root : pts/ :: /usr/local/java//bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root : pts/ :: grep tomcat
【Zabbix监控Tomcat工作原理】
Zabbix-server要知道java应用程序的某项性能的使用时候 ,会启动自身的一个Zabbix-JavaPollers进程去链接zabbix-JavaGateway请求数据,而zabbix-Javagateway收到请求后并使用;
“JMXmanagentAPI"去查询特定的应用程序,而前提是应用程序这端在开启的时候 需要“-Dcom.sun.management.jmxremote”参数来开启JMX远程查询就行,JAVA程序会启动自身的一个简单的小程序端口向Zabbix-JavaGatway提供请求数据
【zabbix监控Tomcat配置】
上图中我们可以得知,配置zabbix监控Java应用程序的关键点在于:配置Zabbix-JavaGatway,让Zabbix-server能够连接zabbix-JavaGatway,Tomcat开启JVM远程监控功能等;
1)编译安装zabbix server的时候需要加上--enable-java这个模块,以便支持JMX监控,如果之前预编译的时候没有加上这个模块,那么需要重新预编译,在这个在这里需要的注意的是,重新编译只需两步即可,
不要make install,否则的话配置都重置了~
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql --enable-net-snmp --with-libcurl --enable-java make
Ps:如果./configure预编译的过程中出现error报错,那么这个 原因是 缺少javac软件,我们直接yum install javac*安装便完事了~在此重新编译即可;
承接./configure预编译,make之后,我们我们进入zabbix的目录,查看去config.log这个日志,我们可以看到加上的java模块
[root@localhost ~]# cd /usr/src/zabbix-3.4.10/
[root@localhost zabbix-3.4.10]# ls
aclocal.m4 bin ChangeLog conf config.log config.sub configure.ac database frontends INSTALL m4 Makefile.am man missing README src
AUTHORS build compile config.guess config.status configure COPYING depcomp include install-sh Makefile Makefile.in misc NEWS sass upgrades
[root@localhost zabbix-3.4.10]# !grep
grep ./configure config.log
$ ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql --enable-net-snmp --with-libcurl --enable-java
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
【Tomcat被控端配置】
配置zabbix-agen客户端Tomcat JVM,也就是tomcat的远程调用脚本,配置jvm编辑catalina.sh,并加入以下配置
[root@Tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote #开启远程监控
-Dcom.sun.management.jmxremote.port=12345 #远程监控端口
-Dcom.sun.management.jmxremote.ssl=false #远程ssl验证端口
-Dcom.sun.management.jmxremote.authenticate=false #关闭权限认证
-Djava.rmi.server.hostname=192.168.17.134" #被监控tomcat主机地址,默认就写本地即可
3)随后重启tomcat服务
[root@Tomcat ~]# /usr/local/tomcat/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java/
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@Tomcat~ bin]# netstat -anput | egrep "12345|8080|8005|8009"
tcp6 0 0 :::8080 :::* LISTEN 20422/java
tcp6 0 0 :::12345 :::* LISTEN 20422/java
tcp6 0 0 192.168.17.134:8005 :::* LISTEN 20422/java
tcp6 0 0 :::8009 :::* LISTEN 20422/java
【问题汇总】
我们重新启动的时候,可能发现执行是正确的,并没有出现任何错误,但实际上这个tomcat没有起来,在这里一定要netstat或者ps -ef进一步检查一下服务是否正常运行,进一步判断
netstat发现,tomcat是没有启动的,查看日志,发现配置jmx的catalina.sh脚本没有生效,导致tomcat服务启动异常,这个原因是由于配置的时候位置写错了;
图A
解决方法如下所示,加到最下面即可(在这里,注意一下,这里有很大的坑,配置参数位置必须要注意,否则无法生效,导致12345端口未启动,最终导致链接拒绝,详见图A就知道)
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Djava.rmi.server.hostname=192.168.17.134
-Dcom.sun.management.jmxremote.port=
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
[root@localhost bin]# /usr/local/tomcat/bin/startup.sh
[root@localhost bin]# netstat -anput | egrep "12345|8080|8005|8009"
tcp6 ::: :::* LISTEN /java
tcp6 ::: :::* LISTEN /java
tcp6 192.168.2.144: :::* LISTEN /java
tcp6 ::: :::* LISTEN /java
【监听测试&验证】
到目前 位置还没完事,还要 验证jmx监听是否成功。那么如何验证呢?
首先在tomcat下载页面extra类别中下载 JMX Remote jar二进制包放在tomcat/libx路径下
[root@Tomcat ~]# cd /usr/local/tomcat/lib/
[root@Tomcat lib]# wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.88/bin/extras/catalina-jmx-remote.jar
下载jmxcmd.jar文件测试时候能够获取数据
[root@Tomcat lib]# wget http://nchc.dl.sourceforge.net/project/jmxcmd/jmxcmd.jar
[root@localhost lib]# java -jar cmdline-jmxclient-0.10..jar - 192.168.17.134: java.lang:type=Memory NonHeapMemoryUsage #ps:这里的cmdline-jmxcline软件包如果没有的话,
// :: + org.archive.jmx.Client NonHeapMemoryUsage: 可以在博客下方留言,私信给你~
committed: 27721728
init: 2555904
max: -1
used: 2695680
第二种方式检测也可以
[root@tomcat lib]# java -jar jmxcmd.jar - 192.168.17.134:12345 java.lang:type=Memory NonHeapMemoryUsage
06/10/2018 18:30:06 +0800 de.layereight.jmxcmd.Client NonHeapMemoryUsage:
committed: 27721728
init: 2555904
max: -1
used: 2695680
【Tomcat所在的Zabbix-agent端配置】
[root@tomcat etc]# grep -vE "#|^$" zabbix_agentd.conf
LogFile=/tmp/zabbix_agentd.log
EnableRemoteCommands=
Server=192.168.17.135
ListenPort=
ServerActive=192.168.17.135
Hostname=192.168.17.134
Timeout=
AllowRoot=
UnsafeUserParameters=
【zabbix-server端配置】
在这里Zabbix_server开启java poller,zabbix_java开启JavaGwateway,端口为10050,Tomcat JMX开启12345提供性能数据
数据获取的过程如下:
Java Poller----->JavaGatway:10052--->Tomcat:12345
1)修改zabbix_server.conf配置文件,内容如下(ps:只做陌生参数详解):
[root@zabbix_server ~]# grep -vE "#|^$" /usr/local/zabbix/etc/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix.log
DBHost=localhost
DBName=zabbixdb
DBUser=xiaoyu
DBPassword=
DBPort=
StartPollers=50 #指定启动多少个进程
StartPingers=
JavaGateway=192.168.17.135 #Java网关地址,即zabbixserver端IP地址
JavaGatewayPort=10052 #java网关监听端口
StartJavaPollers=5 #启动时所指定的java pollers数量
Timeout=
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts/
FpingLocation=/usr/sbin/fping
LogSlowQueries=
AllowRoot=
2)编译zabbix的时候 ,我们添加了--enable-java这个模块,在这里就会生成jmx目录
[root@zabbix_server ~]# vim /usr/local/zabbix/sbin/zabbix_java/settings.sh
[root@zabbix_server ~]# grep -vE "#|^$" /usr/local/zabbix/sbin/zabbix_java/settings.sh
LISTEN_IP="0.0.0.0"
LISTEN_PORT=
PID_FILE="/tmp/zabbix_java.pid"
START_POLLERS=
TIMEOUT=3
[root@zabbix_server ~]# /usr/local/zabbix/sbin/zabbix_java/startup.sh
[root@zabbix_server fonts]# netstat -anput | grep 10052
tcp6 0 0 :::10052 :::* LISTEN 40649/java
tcp6 0 0 192.168.17.135:10052 192.168.17.135:51584 TIME_WAIT -
【ZabbixWeb端配置】
zabbix端自带一些版本,直接链接即可