Zabbix 监控 tomcat 连接池
一、 前言
领导提出需求,需要监控tomcat的连接池,之前已经通过zabbix监控了jvm(关于jvm监控这部分,后续补上)。在网上找了很多教程,经历了很多坑,不过还是要感谢那些帮助过我的人,踩着坑搞出来,也是记忆犹新呀。
二、 基础环境
操作系统:Centos 6.8
Jdk:1.8.0_77(jdk最好是1.7及以上)
Tomcat:7.0.69
Zabbix:3.0.3
三、 环境部署
(一) Zabbix Server端:
1. 要求:
开启javaGateway支持java监控(编译时添加--enable-java这个参数)
2. 现状:
由于我们的Server是编译安装的,已经在使用了,所以只能重新编译,把之前的已经编译好的zabbixserver目录替换掉(注意:要把conf下的配置文件,还有脚本要拷贝到重新编译好的zabbixserver目录里哦,我们的路径是/usr/local/zabbix。)
3. 操作步骤:
详细编译步骤请自行google
1) 编译参数:
./configure--prefix=/usr/local/zabbix --enable-server --enable-agent --enable-ipv6--with-mysql --with-net-snmp –enable-java
注意:替换编译包时,要将zabbixsever端停止。
2) 配置zabbix_java
路径:/usr/local/zabbix/sbin/zabbix_java
# ls
bin lib settings.sh shutdown.sh startup.sh
配置文件内容如下:
# grep -Ev "^#|^$"settings.sh
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/tmp/zabbix_java.pid"
START_POLLERS=5
3) 配置zabbixsever
路径:/usr/local/zabbix/etc
# ls
zabbix_agentd.conf zabbix_agentd.conf.d zabbix_server.conf zabbix_server.conf.d
配置文件增加下面内容
# grep -Ev "^#|^$"zabbix_server.conf
…
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
4) 启动zabbixsever 以及zabbix_java
# zabbix server启动
/etc/init.d/zabbix_server start
# zabbix_java 启动
cd /usr/local/zabbix/sbin/zabbix_java
./startup.sh
(二) Zabbix Agent端:
主要是配置tomcat容器
1) 下载catalina-jmx-remote.jar
下载地址:(用wget在服务器下载即可)
http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.69/bin/extras/catalina-jmx-remote.jar
上传catalina-jmx-remote.jar到tomcat的lib目录下,我的是/usr/local/tomcat/lib即可
2) 修改catalina.sh
# 添加如下内容
CATALINA_OPTS="$CATALINA_OPTS-server -Xms128m -Xmx128m -XX:MaxNewSize=64m -XX:PermSize=64M-XX:MaxPermSize=64m -XX:ThreadStackSize=256 -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=客户端IP地址"
3) 增加jmx监听端口
# server.xml文件最后添加一行
# tail -n 6 conf/server.xml
4) 重启tomcat
(三) 测试
需要下载一个工具包cmdline-jmxclient-0.10.3.jar
下载地址:
http://crawler.archive.org/cmdline-jmxclient/downloads.html
执行如下命令:
# java -jar/root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 java.lang:type=MemoryHeapMemoryUsage
11/11/2016 17:27:54 +0800org.archive.jmx.Client HeapMemoryUsage:
committed: 127533056
init: 134217728
max: 127533056
used: 16984736
四、 zabbix web 配置
(一) 导入zabbix监控tomcat模版
zabbix监控tomcat模版 见附件
(二) Tomcat服务器主机添加jmx端口
(三) Tomcat服务器主机添加zabbix监控tomcat模版
等待几分钟,查看相应主机的最新数据即可
五、 踩过的坑
(这是个大坑,主要我是小白一枚,google了半天才找到原因)
首先,我执行这个,查看支持的选项,没有问题
# java -jar/root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 java.lang:type=Memory
Attributes:
ObjectPendingFinalizationCount:ObjectPendingFinalizationCount (type=int)
HeapMemoryUsage: HeapMemoryUsage(type=javax.management.openmbean.CompositeData)
NonHeapMemoryUsage: NonHeapMemoryUsage(type=javax.management.openmbean.CompositeData)
Verbose: Verbose (type=boolean)
ObjectName: ObjectName(type=javax.management.ObjectName)
Operations:
gc: gc
Parameters 0, return type=void
之后,我执行这个,报错如下:
# java -jar/root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 java.lang:type=MemoryPool
11/11/2016 17:39:24 +0800 org.archive.jmx.Clientjava.lang:type=MemoryPool is not a registered bean
最后,google后才知道,这样执行是不对的
jmx支持的一些选项,如下
# java -jar/root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 | grep java.lang:
java.lang:type=Compilation
java.lang:type=ClassLoading
java.lang:type=Memory
java.lang:name=Metaspace,type=MemoryPool
java.lang:name=EdenSpace,type=MemoryPool
java.lang:type=Threading
java.lang:name=SurvivorSpace,type=MemoryPool
java.lang:name=MetaspaceManager,type=MemoryManager
java.lang:type=Runtime
java.lang:name=MarkSweepCompact,type=GarbageCollector
java.lang:name=Compressed ClassSpace,type=MemoryPool
java.lang:name=CodeCacheManager,type=MemoryManager
java.lang:name=Copy,type=GarbageCollector
java.lang:type=OperatingSystem
java.lang:name=CodeCache,type=MemoryPool
java.lang:name=TenuredGen,type=MemoryPool
正确的执行方式,如下:
# java -jar/root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 java.lang:name=Metaspace,type=MemoryPool
Attributes:
Valid: Valid (type=boolean)
Usage: Usage(type=javax.management.openmbean.CompositeData)
PeakUsage: PeakUsage(type=javax.management.openmbean.CompositeData)
MemoryManagerNames: MemoryManagerNames(type=[Ljava.lang.String;)
UsageThreshold: UsageThreshold (type=long)
UsageThresholdExceeded: UsageThresholdExceeded(type=boolean)
UsageThresholdCount: UsageThresholdCount(type=long)
UsageThresholdSupported:UsageThresholdSupported (type=boolean)
CollectionUsageThreshold:CollectionUsageThreshold (type=long)
CollectionUsageThresholdExceeded:CollectionUsageThresholdExceeded (type=boolean)
CollectionUsageThresholdCount:CollectionUsageThresholdCount (type=long)
CollectionUsage: CollectionUsage(type=javax.management.openmbean.CompositeData)
CollectionUsageThresholdSupported:CollectionUsageThresholdSupported (type=boolean)
Name: Name (type=java.lang.String)
Type: Type (type=java.lang.String)
ObjectName: ObjectName (type=javax.management.ObjectName)
Operations:
resetPeakUsage: resetPeakUsage
Parameters 0, return type=void
总结:
Jmx支持的选项,是和tomcat版本有关的,之前我找的资料都是tomcat 8 的版本,执行之后就会报错“org.archive.jmx.Client java.lang:type=MemoryPool is not a registered bean”,所以自己要认真查看自己所部署的环境所支持的选项,不能盲目照搬他人的成果。