以前做过通过jmx监控单个tomcat实例,但是有的时候公司一台服务器上有10个tomcat容器那怎么办呢,来吧往下看吧
1,注意操作文件路径:
zabbix安装路径; /data/zabbix/etc/zabbix_agentd.conf.d/jmx_discovery.sh
/etc/zabbix/zabbix_agentd.conf 配置文件中 UnsafeUserParameters=1 必须打开,否则模板的自动发现功能报错。
该模板的监控和触发属性在自动发现中配置,所以导入模板后,下属的监控项和触发器等都为空。需要等一会儿,数据等还会出来。
操作步骤:
1、上传 catalina-jmx-remote.jar,cmdline-jmxclient-0.10.3.jar到 /lib下jmx_discovery.sh 和 add_service_tomcat.sh 到 /data/zabbix/etc/zabbix_agentd.conf.d/目录下
2、给 add_service_tomcat.sh 赋执行权限,并执行
3、zabbix服务端对主机添加模版
脚本说明:
add_service_tomcat.sh
#!/bin/bash
#因为lunix版本的及命令格式等问题,上面两句不一定能得到正确路径,所以用下面两句替换上面两行,各自改下你们安装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=9999 #配置监控初始端口
local_ip=`ifconfig em4 |awk -F '[ :]+' 'NR==2 {print $4}'` #提取主机IP
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
local_ip=`ifconfig em4 |awk -F '[ :]+' 'NR==2 {print $4}'` #提取主机IP
cat >> /data/zabbix/zabbix_agentd.conf.d/tomcat.conf < UserParameter=java.jmx.discovery[*],/data/zabbix/etc/zabbix_agentd.conf.d/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 /data/zabbix/etc/zabbix_agentd.conf.d/jmx_discovery.sh 然后执行脚本 jmx_discovery.sh: #!/bin/bash #因为lunix版本的及命令格式等问题,上面两句不一定能得到正确路径,所以用下面两句替换上面两行,各自改下你们安装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=9999 #配置监控初始端口 i=1 printf '{"data":[\n' for tomcat in $t_datadir #输出JSON文件 do 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 tomcat监控模板如下: Template for Tomcat 然后等5分钟左右,一主机N实例监控tomcat完成,拿走不谢!注意根据实际路径修改!有人说出现导入模板不支持的情况: 第一步:检查key文件脚本路径和自定义键值 第二步:检查/lib下是否有cmdline-jmxclient-0.10.3.jar包 到此如有问题请点个赞,然后留言解答。 name:系统运维工程师 李超!