zabbix监控同一台主机下的多个tomcat
zabbix监控同一台主机下的多个tomcat**受益于:http://www.iyunv.com/forum.php?mod=viewthread&tid=227674**
>运行环境
```
centos7.3
zabbix3.2
3.0zabbix模板
```
如要使用3.0zabbix模板和下载下面的脚本,请移步到下面的url链接下载(http://www.iyunv.com/forum.php?mod=viewthread&tid=227674)
下面的代码在不同的unix系统下有所不同,需要自行根据各自情况进行修改
>要用到的测试代码
```
zabbix_get -s 192.168.239.136 -p 10050-k "java.jmx.discovery"
java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.239.136:12345 java.lang:type=Memory NonHeapMemoryUsage
java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.239.136:12345 java.lang:type=Runtime Vmname 2>&1 |grep $2 |awk '{print $NF}'
```
>要用到的文件
```
add_service_tomcat.sh
jmx_discovery.sh
catalina-jmx-remote.jar
cmdline-jmxclient-0.10.3.jar
```
上面的add_service_tomcat.sh和jmx_discovery.sh是脚本文件
catalina-jmx-remote.jar和cmdline-jmxclient-0.10.3.jar是两个要使用的jar包
**文件的作用**
add_service_tomcat.sh用于查找各个tomcat,然后往每个tomcat里的catalina.sh里插入端口等代码。还有往zabbx里的zabbix-agentd.conf里也插入自定义监控项代码。
jmx_discovery.sh用于输出json监控清单,可从这里看到每个不同的tomcat在监控的时候,会被生成tomcat实例名字加监控项的名字
>脚本代码
#add_service_tomcat.sh
```
#!/bin/bash
cp /tmp/jmx_discovery.sh/usr/lib/zabbix/alertscripts/jmx_discovery.sh #复制文件,如果zabbix是yum的,那么就用zabbix下的zabbix-server.conf设置的脚本路径
mv /tmp/cmdline-jmxclient-0.10.3.jar /lib/cmdline-jmxclient-0.10.3.jar #复制文件
#查找有多少个tomcat
t_datadir=`find /data/tomcat*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`
tomcat_no=`find /data/tomcat*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`
n_port=12345
#配置监控初始端口,ens33这个网口,根据版本不同,自行修改
#$3这个根据系统不同自行修改,$3表示的是ens33网口上的IP
local_ip=`ifconfig ens33 |awk -F '[ :]+' 'NR==2 {print $3}'` #提取主机IP,因为unix版本的关系,取的列号可能都不一样【楼主提醒的】
for tomcat in $t_datadir
do
m_no=`cat -n $tomcat/bin/catalina.sh|grep 'Execute The Requested Command'|awk '{print $1}'` #提取代码插入位置
cp $tomcat/bin/catalina.sh$tomcat/bin/catalina.sh_bak #备份catalina.sh
cp /tmp/catalina-jmx-remote.jar$tomcat/lib/catalina-jmx-remote.jar #复制文件到实例lib目录
sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"'$tomcat/bin/catalina.sh #插入监控配置
let "m_no=m_no+1" #设置行号
sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname='$local_ip'"' $tomcat/bin/catalina.sh #插入监控配置
let "m_no=m_no+1" #设置行号
sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port='$n_port'"' $tomcat/bin/catalina.sh #插入监控配置
let "m_no=m_no+1" #设置行号
sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"' $tomcat/bin/catalina.sh #插入监控配置
let "m_no=m_no+1" #设置行号
sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"' $tomcat/bin/catalina.sh #插入监控配置
let "n_port=n_port+1"
done
#配置监控初始端口,ens33这个网口,根据版本不同,自行修改
#$3这个根据系统不同自行修改,$3表示的是ens33网口上的IP
local_ip=`ifconfig ens33 |awk -F '[ :]+' 'NR==2 {print $3}'` #提取主机IP,因为unix版本的关系,取的列号可能都不一样【楼主提醒的】
cat >> /etc/zabbix/zabbix_agentd.conf <<END
UserParameter=java.jmx.discovery,/usr/lib/zabbix/alertscripts/jmx_discovery.sh
UserParameter=java.Runtime.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Runtime \$2 2>&1 |grep \$2 |awk '{print \$NF}'
UserParameter=java.Memory.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Memory \$2 2>&1 |grep \$2 |awk '{print \$NF}'
UserParameter=java.System.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=OperatingSystem \$2 2>&1 |grep \$2 |awk '{print \$NF}'
UserParameter=java.HeapMemoryUsage.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep \$2 |awk '{print \$NF}'
UserParameter=java.NonHeapMemoryUsage.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep \$2 |awk '{print \$NF}'
UserParameter=java.LoadClass.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=ClassLoading \$2 2>&1 |awk '{print \$NF}'
UserParameter=java.Threading.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Threading \$2 2>&1 |awk '{print \$NF}'
END
chmod +x /usr/lib/zabbix/alertscripts/jmx_discovery.sh
rm -rf /tmp/jmx_discovery.sh
rm -rf /tmp/add_service_tomcat.sh
rm -rf /tmp/catalina-jmx-remote.jar
systemctl restart zabbix-agent
ps -ef|grep java
下面代码用于从新启动tomcat
ps -ef|grep java
```
#jmx_discovery.sh
```
#!/bin/bash
t_datadir=`find /data/tomcat*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`
tomcat_no=`find /data/tomcat*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`
n_port=12345 #配置监控初始端口
i=1
printf '{"data":[\n'
for tomcat in $t_datadir #输出JSON文件
do
#获取tomcat实例的名字
t_service=`echo "$tomcat"|awk -F"/" '{print $(NF)}'`
if [ "$i" != ${tomcat_no} ];then
printf "\t\t{ \n"
printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"},\n"
else
printf "\t\t{ \n"
printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"}]}\n"
fi
let "n_port=n_port+1"
let "i=i+1"
done
```
>操作步骤
```
操作步骤:
1、上传 catalina-jmx-remote.jar,cmdline-jmxclient-0.10.3.jar,jmx_discovery.sh 和 add_service_tomcat.sh 到 /tmp/目录下
2、给 add_service_tomcat.sh 赋执行权限,并执行
3、zabbix服务端对主机添加模版
```
在zabbix的web端,只需要导入模板(Template for Tomcat)和添加主机、为主机添加模块就可以了。
>问题
**1. 在zabbix的web端出现Item does not allow parameters.**
这是因为web端没有获取到我们输入到/etc/zabbix/zabbix-agentd.conf里面自定义的监控项目。检查你在/etc/zabbix/zabbix-agentd.conf的自定义监控项代码有没有错
**2.如何在本地测试有没有成功**
zabbix_get -s 192.168.239.136 -p 10050-k "java.jmx.discovery"可以获取到json格式的内容
java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.239.136:12345 java.lang:type=Memory NonHeapMemoryUsage 可以获取到内存信息
**3.在本地可获取到数据,web端获取不到**
把web端的host删除,从新添加,然后等待几分钟
**4.第一次执行脚本失败了,然后再次执行,zabbix-agent就没办法从新启动了**
因为zabbix-agentd.conf里面最后被写入了代码,从新执行脚本建议先把zabbix-agentd.conf里面先前添加的代码删除还有添加在tomcat里的catalina.sh里的代码也删除掉,再从新执行脚本
**5.端口问题**
楼主给的代码,第一个tomcat端口从12345开始的,第二个tomcat端口为12346,逐增加1的,不需要我们担心端口的问题。如果觉得这些端口不安全,自己修改脚本。
**6.在本地测试时候,获取不到数据**
确定在zabbix-agentd.conf里设定的自定义项里的key最后带有[*],这样才允许传递参数
比如:UserParameter=java.Runtime.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Runtime \$2 2>&1 |grep \$2 |awk '{print \$NF}'
不错,支持一下 赞 你有没有重启tomcat 模块,再去获取数据就超时。 zabbix_get -s 172.16.123.192(客户端主机ip) -p 12345 -k "jmx["java.lang:type=Threading",ThreadCount]"
zabbix_get : Check access restrictions in Zabbix agent configuration
为什么在客户端主机上直接运行zabbix_get 获取不到数据呢
端口在监听,防火墙开放了端口,也不存在跨主机
zabbix_agentd.conf中server配置也添加zabbix server IP,客户端主机IP,和127.0.0.1
页:
[1]