因为公司大量使用tomcat作为应用服务,所以,这两天催生了一个想法,通过zabbix监控tomcat的运行状态,从而能够更快的发现tomcat服务出现的问题以及判断问题出现在哪块。

在网上找了一些资料来看,写的都不是很全面(PS:对于我这种菜鸟来说,还有很多东西不知道的,所以需要有解释的详细点的文档来帮助我更好理解原理,于是就有了本篇博文的诞生!)

首先,zabbix监控tomcat等这一类java平台的应用不是直接通过agentd来实现的,而是使用jmx来获取到tomcat这类应用的状态,然后再将数据交给server端,生成监控图。

好了,废话不多说,我们开始tomcat监控的配置之旅吧!

首先,如果需要用到jmx监控的话需要在客户端和服务端都安装java环境,至于java环境可以通过源码安装

[root@zabbix local]# tar -zxvf jdk-8-linux-x64.tar.gz
[root@zabbix local]# vim /etc/profile

设置环境变量

在末尾输入以下内容:

JAVA_HOME=/usr/local/jdk1.8.0/
JAVA_BIN=/usr/local/jdk1.8.0/bin
JRE_HOME=/usr/local/jdk1.8.0/jre
PATH=$PATH:/usr/local/jdk1.8.0/bin:/usr/local/jdk1.8.0/jre/bin
CLASSPATH=/usr/local/jdk1.8.0/jre/lib:/usr/local/jdk1.8.0/lib:/usr/local/jdk1.8.0/jre/lib/charsets.jar
export  JAVA_HOME  JAVA_BIN JRE_HOME  PATH  CLASSPATH

保存文件后,使其生效:

source /etc/profile

检测是否设置正确:

java -version

如果显示如下内容,则配置正确:

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

然后是服务端的配置:

服务端需要重新安装zabbix服务端,需要将--enable-java添加到编译参数中去,参数如下所示:

[root@zabbix zabbix-3.0.4]# ./configure --prefix=/usr/local/zabbix-3.0.4/ --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java

安装好服务端之后可以在软件安装目录找到如下这个目录:

[root@zabbix zabbix_java]# pwd
/usr/local/zabbix/sbin/zabbix_java
[root@zabbix zabbix_java]# ls
bin  lib  settings.sh  shutdown.sh  startup.sh

修改settings.sh中得参数,其中大部分都是以#开头的,修改的参数如下面所示:

[root@zabbix zabbix_java]# egrep -v "^#|^$" settings.sh
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/tmp/zabbix_java.pid"
START_POLLERS=5

然后修改zabbix_server.conf的配置,修改的参数如下面所示:

LogFile=/tmp/zabbix_server.log
PidFile=/tmp/zabbix_server.pid
DBHost=localhost
DBName=zabbix
DBUser=root
DBPassword=********
JavaGateway=192.168.100.115
JavaGatewayPort=10052
StartJavaPollers=5
Timeout=4
LogSlowQueries=3000

修改完以后,重启zabbixserver并且启动zabbix_java_Gateway启动zabbix_java_Gateway的方法为

[root@zabbix zabbix_java]# sh /usr/local/zabbix-3.0.4/sbin/zabbix_java/startup.sh
[root@zabbix zabbix_java]# sh /usr/local/zabbix-3.0.4/sbin/zabbix_server

启动之后,在服务端会多出一个侦听端口10052来,效果如下:

[root@zabbix zabbix_java]# netstat -lntup |grep 10052
tcp        0      0 :::10052                    :::*                        LISTEN      22663/java

看到上面这些信息,证明服务端已经配置好了,接下来需要配置tomcat客户端了。


tomcat客户端的配置为如下:

首先安装java环境

和上面的方法一样就不在叙述了

然后下载tomcat的源码包,解压后放在相应的目录,我这里放在/usr/local/src/apache-tomcat-7.0.79.tar.gz/目录下。

然后需要下载对应tomcat的jmx版本,我这里安装的是最新的tomcat,版本是7.0.79,于是下载路径为如下:

wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.79/bin/extras/catalina-jmxremote.jar

使用其他版本的可以自行选择相对应的jmx版本下载。

下载后将该文件放在tomcat的lib目录下,然后修改catalina.sh文件,catalina.sh文件在tomcat的bin目录下。在#!bin/sh下方添加一行参数,如下所示:

CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.100.245"

其中的192.168.100.245是该tomcat客户端的IP。然后需要修改服务器的配置文件server.xml:

[root@ntp conf]# vim server.xml

如上面所示,最后一行就是我们添加进去的配置,其中的8090就是zabbix server端监控tomcat需要使用的端口。

保存之后退出,然后启动tomcat和zabbix的agentd,至于zabbix_agentd怎么配置,在我之前写的博客中有记载,有兴趣的可以去看看。

启动完成之后通过ps命令和netstat命令查看是否正常的侦听了相应的端口,zabbix_agentd默认侦听10050端口,tomcat默认侦听8080端口,8090端口是开给jmx使用的,应该也是开启的,效果如下:

[root@ntp conf]# netstat -lntup |grep java
tcp        0      0 :::10052                    :::*                        LISTEN      2005/java
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN      3775/java
tcp        0      0 :::41639                    :::*                        LISTEN      3775/java
tcp        0      0 :::8009                     :::*                        LISTEN      3775/java
tcp        0      0 :::8080                     :::*                        LISTEN      3775/java
tcp        0      0 :::8090                     :::*                        LISTEN      3775/java

这时候可以在zabbix_server端尝试获取tomcat的相关数据了。这时候需要使用到一个工具cmdline-jmxclient-0.10.3.jar

[root@ntp zabbix_java]# java -jar /root/cmdline-jmxclient-0.10.3.jar - 192.168.100.245:8090 java.lang:type=Memory NonHeapMemoryUsage
09/09/2017 17:56:49 +0800 org.archive.jmx.Client NonHeapMemoryUsage: 
committed: 24313856
init: 24313856
max: 224395264
used: 20066808

上面已经获取到了相应的tomcat数据,好了,到这里配置就差不多要大功告成了,但是还需要在web端配置相应的模版,刚开始我使用系统自带的模板,发现出不来数据,于是我去网上找到了某个网友自己做的模板,终于可以获取到tomcat的数据了,模板我也将一并打包放在附件中。

好了,在web端开始配置了,配置如下图所示:

zabbix通过JMX监控tomcat状态_第1张图片

其中的端口需要填写两个,第一个是agentd的侦听端口,第二个是jmx的侦听端口,这个端口8090是我们在tomcat客户端的server.xml文件中定义的。

将该主机关联到相应的模板上去:

zabbix通过JMX监控tomcat状态_第2张图片


之后就等待出数据了,该模板中的某些键值在tomcat中不支持,我目前还不知道是什么情况,可能和tomcat中得配置参数有关系吧。下面展示一下出图的效果,这个模板各位也可以拿回去自己进行修改:

zabbix通过JMX监控tomcat状态_第3张图片

zabbix通过JMX监控tomcat状态_第4张图片

zabbix通过JMX监控tomcat状态_第5张图片