| 
 | 
	
 
 
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}' 
 
 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |