zabbix3.0部署jmx监控tomcat

Posted by Yancy on 2016-06-21

zabbix提供了一个java gateway的应用去监控jmx(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。

一. Zabbix 的JMX监控架构

一:部署环境

1
2
3
Centos 6.7
Zabbix 3.0.3
Tomcat 7.0.55

服务端配置

1、安装jdk(版本1.7.0_79)

JDK 各自的版本7.0 还是8.0 版本官网下载:JDK

我这里也上传了7.0.67 版本的和8.0版本的jdk源码包:

7.0JDK源码包

8.0JDK源码包

并上传到zabbix server

直接解压下载下来的包到自定义的目录:

1
tar -zxvf jdk1.7.0_67.tar.gz -C /srv/

安装成功之后添加系统环境变量

1
2
3
4
5
6
cd /etc/profile.d
vim java.sh
export JAVA_HOME=/srv/jdk1.7.0_67
export CLASS_PATH="$JAVA_HOME/lib:$JAVA_HOME/jre/lib"
export PATH=$PATH:$JAVA_HOME/bin

使配置生效

1
source /etc/profile

安装与配置比较简单。执行java -version命令,出现类似界面表示成功。

1
2
3
4
java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

如果出现问题,查看下环境变量是否设置。

2、安装Zabbix-Java-gateway

Zabbix2.0起添加了支持用于监控JMX应用程序的服务进程,称为“Zabbix-Java-gateway”,它是用java写的一个程序。

可使用rpm进行安装,我使用源码安装,大家可在安装zabbix时启用–enable-java参数即可安装zabbix java gateway,如果第一次没有加载,可重新加载编译安装

有两种方法可以安装Zabbix-Java-gateway,第1种是编译安装zabbix时添加–enable java参数。第2种是单独安装,步骤如下:

  • 第一种方法

安装gateway,需要java,java-devel依赖

1
2
3
yum install -y 
http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm                安装yum源
yum install -y java java-devel zabbix-java-gateway  安装gateway

测试是否成功:

第一:测试java是否成功

1
2
3
4
java -version
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)

第二:测试gateway是否安装成功

1
2
service zabbix-java-gateway status
zabbix-java-gateway is stopped
  • 第二种方法

我这里升级3.0.3版本的时候已经安装好了。所以如果没有安装上的可以单独安装没关系的:

不受影响步骤如下:

1
2
3
4
# tar zxvf zabbix-3.0.3.tar.gz
# cd zabbix-3.0.3
# ./configure --enable-java --prefix=/data/zabbix/zabbix_java #/data/zabbix是我的zabbix安装目录
# make && make install

我的目录是默认在/usr/local/zabbix/sbin/zabbix_java/

3、修改Java-gateway的配置文件并启动它

配置文件单独安装的路径为/data/zabbix/zabbix_java/sbin/zabbix_java/settings.sh
我这里是这个目录。具体根据实际安装情况) /usr/local/zabbix/sbin/zabbix_java/settings.sh
启用以下参数:

1
2
3
LISTEN_IP="127.0.0.1" #监听地址
LISTEN_PORT=10052 #监听端口
START_POLLERS=50 # 开启的工作线程数(必须大于等于后面zabbix_server.conf文件的StartJavaPollers参数) #必须配置,启动的进出数

注意事项:

  1. 配置文件PID_FILE的路径必须是正确的,可以自己去cd找,yum安装默认情况下不用改动。
  2. START_POLLERS项是配置启动的进出数,该值必须大于等于Zabbix-Server里面的startJavaPollers项。

进入/usr/local/zabbix/sbin/zabbix_java/目录,执行./startup.sh

检查端口是否监听:

1
2
netstat -anp|grep 10052
tcp 0 0 0.0.0.0:10052 0.0.0.0:* LISTEN 21949/java

查看是否已经监听10052端口,如果已监听,表示启动成功,如果没有,可通过zabbix_server日志查看解决

4、修改zabbix_server的配置文件并重启

1
2
3
4
5
vim /usr/local/zabbix/etc/zabbix_server.conf
JavaGateway=127.0.0.1 # JavaGateway 服务器地址,zabbix_server与zabbix_java_gateway在同一台主机
JavaGatewayPort=10052 #端口
StartJavaPollers=5 # #设定连接java gateway 的进程数,当设置为0时表示不具有抓取java信息的能力

5、 添加catalina-jmx-remote.jar

添加catalina-jmx-remote.jar到zabbix java gateway的lib目录下,catalina-jmx-remote.jar包可在http://archive.apache.org/dist/tomcat/下,在各版本目录的bin/extras/子目录下

1
2
cd /usr/local/zabbix/sbin/zabbix_java/lib/
wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.55/bin/extras/catalina-jmx-remote.jar

重启服务zabbix和java gateway 并加入启动项并验证:

1
2
3
/etc/init.d/zabbix_server restart
/usr/local/zabbix/sbin/zabbix_java/shutdown.sh
/usr/local/zabbix/sbin/zabbix_java/startup.sh

6.下载测试工具cmdline-jmxclient-0.10.3.jar

cmdline-jmxclient-0.10.3.jar为一个测试工具,可用来测试jmx是否配置正确,下载cmdline-jmxclient-0.10.3.jar(下载到任意目录)

1
wget http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar

二、被监控tomcat 配置[被监控tomcat操作]

下载catalina-jmx-remote.jar

1
2
3
4
cd /srv/tomcat/tomcat-account/lib/
wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.55/bin/extras/catalina-jmx-remote.jar #我的tomcat版本是7.0.55
chown -R tomcat:tomcat catalina-jmx-remote.jar
chmod +x catalina-jmx-remote.jar

我的tomcat版本是7.0.55 将下载后后的jar包放到被监控的tomcat实例的lib目录下。

查看tomcat的版本

  • 这里之前也自己也忘记了tomcat的版本是多少了,所以我先查看下然后在下载:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd /srv/tomcat/tomcat_account/bin
[root@tomcat_A1 bin]# ./version.sh --
Using CATALINA_BASE: /srv/tomcat/tomcat_account
Using CATALINA_HOME: /srv/tomcat/tomcat_account
Using CATALINA_TMPDIR: /srv/tomcat/tomcat_account/temp
Using JRE_HOME: /srv/jdk1.7.0_67
Using CLASSPATH: /srv/tomcat/tomcat_account/bin/bootstrap.jar:/srv/tomcat/tomcat_account/bin/tomcat-juli.jar
Server version: Apache Tomcat/7.0.55
Server built: Jul 18 2014 05:34:04
Server number: 7.0.55.0
OS Name: Linux
OS Version: 2.6.32-573.8.1.el6.x86_64
Architecture: amd64
JVM Version: 1.7.0_67-b01
JVM Vendor: Oracle Corporation

在tomcat端配置JMX。(tomcat/bin/catalina.sh)自己安装的tomcat路径,找到catalina.sh文件。

网上很多人修改tomcat/bin/下的catalina.sh,添加如下内容:

1
2
3
4
5
CATALINA_OPTS="-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=12345 #定义jmx监听端口
-Djava.rmi.server.hostname=192.168.7.186"
  • 我这里是直接在bin目录下面创建自定义的脚本。

修改setenv.sh

vi /srv/tomcat/tomcat-account/bin/setenv.sh

添加如下

1
2
3
4
5
CATALINA_OPTS="${CATALINA_OPTS} -Djava.rmi.server.hostname=192.168.7.186"
CATALINA_OPTS="${CATALINA_OPTS} -Djavax.management.builder.initial="
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote=true"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.ssl=false"
CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote.authenticate=false"

注意:hostname位机器ip地址,即被监控机器对外服务地址

3.修改server.xml

vi /opt/apache-tomcat/conf/server.xml
添加如下,注意添加位置在

1
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

之后添加如下代码

1
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="12345" rmiServerPortPlatform="12345" />

3、重启tomcat
这里我之前是用写好的启动脚本去启动的,发现一个问题。
因为我都是用/etc/init.d/tomcat stop start 来启动。
可是发现服务启动了,可是之前的tomcat服务端口不见了。我之前的tomcat服务端口10001

然后查看日志出现报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.commons.daemon.support.DaemonLoader.start(DaemonLoader.java:243)
Caused by: java.lang.IllegalArgumentException: jmxremote.access (没有那个文件或目录)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:373)
at org.apache.catalina.mbeans.JmxRemoteLifecycleListener.createServer(JmxRemoteLifecycleListener.java:313)
at org.apache.catalina.mbeans.JmxRemoteLifecycleListener.lifecycleEvent(JmxRemoteLifecycleListener.java:259)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:402)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:347)
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 11 more
Caused by: java.io.FileNotFoundException: jmxremote.access (没有那个文件或目录)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at com.sun.jmx.remote.security.MBeanServerFileAccessController.propertiesFromFile(MBeanServerFileAccessController.java:294)
at com.sun.jmx.remote.security.MBeanServerFileAccessController.<init>(MBeanServerFileAccessController.java:133)
at javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:371)
... 19 more

这里先kill -9 tomcat进程
只需要在/bin/目录下面启动服务。./startup.sh
然后查看有下面的12345 12346 进程 和tomcat进程10001 说明就对了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@tomcat_A1 bin]# netstat -ntulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.46.72.172:10050 0.0.0.0:* LISTEN 8483/zabbix_agentd
tcp 0 0 127.0.0.1:8006 0.0.0.0:* LISTEN 8942/java
tcp 0 0 0.0.0.0:4041 0.0.0.0:* LISTEN 8942/java
tcp 0 0 0.0.0.0:10001 0.0.0.0:* LISTEN 8942/java
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1363/sshd
tcp 0 0 0.0.0.0:36440 0.0.0.0:* LISTEN 8942/java
tcp 0 0 0.0.0.0:12345 0.0.0.0:* LISTEN 8942/java
tcp 0 0 0.0.0.0:12346 0.0.0.0:* 1374/ntpd
udp 0 0 10.46.72.172:123 0.0.0.0:* 1374/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1374/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1374/ntpd

重启zabbix agent

1
service zabbix-agent restart

注:防火墙需要开放12345,12346端口

1
2
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 12345 -j ACCEPT
-A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 12346 -j ACCEPT

###4、服务端测试是否可以获取数据

命令行下测试需要cmdline-jmxclient-0.10.3.jar这个包,测试结果如下:

这个包下载地址:cmdline-jmxclient-0.10.3.jar

在zabbix server上执行

1
java -jar /tmp/cmdline-jmxclient-0.10.3.jar - 192.168.7.186:12345 java.lang:type=Memory NonHeapMemoryUsage

如果有如下回显表示jmx配置正确,如不正确,请检查配置,看下端口启动是否正常,server.xml 配置。

1
2
3
4
5
07/22/2016 14:45:28 +0800 org.archive.jmx.Client NonHeapMemoryUsage:
committed: 80347136
init: 24576000
max: 136314880
used: 46634984

写个脚本自动判断:

1
2
3
vim context.sh
#!/bin/bash
java -jar /opt/tomcat/cmdline-jmxclient-0.10.3.jar - 10.46.72.172:12345 Catalina:type=Manager,*| awk -F "," '{ print $1 }'|awk -F: '{ print $2 }'>/tmp/tomcat/context.csv

三、导入模板到zabbix,并关联到主机,添加监控

这样也可以选择系统自带的,我这里zabbix版本是3.0的,系统自带的可以选择:
选择配置:主机-模板-选择-模板-:
Template JMX Tomcat
Template JMX Generic

从网上下载了一个不错的模板,导入后如下:


导入模板以后主机添加端口:

然后查看图形:

就有了。

四、如何监控单主机多个tomcat

监控多个tomcat实例,网上的详细的配置文档很少,几乎没有。比较好的办法是使用自动发现,但刚使用zabbix,来不及研究,所以采用笨法,修改模板、监控项、图形来达到最终目的。
关键配置:
1、添加主机时添加多个jmx端口

2、修改监控项、键值
在同一主机上,zabbix不允键值重复,但是监控的项目是一样的,不可能键值写的不重复,经过几番搜索,找到方法如下:
只要在箭头处添加1个空格就可以,也可以是多个。(注意位置不要错,在逗到后面)

剩下的就是体力活了,克隆监控项、修改监控项、克隆图形、修改图形。。。
以下是两个tomcat实例的监控项:

多个tomcat在一台主机上面最后的监控效果如下:

一开始zabbix监控tomcat 一路顺畅,可是到测试正不正常时候,返回拒绝连接,第一时间想到就是配置有问题:

我是参考这个解决了。

具体参数内容请参考 apache tomcat 文档

也非常感谢:张爱德大神 一路zabbix上面的帮我一起排坑:

zabbix大神 他的博客blog:https://blog.cactifans.com