Zabbix对JAVA的jvm线程和内存做自定义脚本监控

目的

公司需要对业务的Tomcat进程监控jvm内存以及线程,为后续优化做数据支撑。主要想知道:
1)业务低谷期资源使用情况。
2)业务高峰期资源使用情况。
思路
1)查看JVM内存使用jstart命令。查看JAVA线程jstack命令。
2)为减少工作量,在代理端脚本处理数据切割,缺点是CPU资源占用偏高(约5%)
3)zabbix获取脚本执行结果。
4)图像报表显示

本次注意事项

使用zabbix对JVM监控时遇到几个问题:

  1. zbabix自定义键值 ,zabbix的自定义键值,是需要将配置和脚本放在目标主机的zabbix_agent,需要重复复制脚本以及配置文件,并且需要重启zabbix_agent
  2. 获取到无效PID ,使用ps -ef|grep $JAVA_solename时,命令行执行时由于grep命令即起即停不会有grep的进程PID,但脚本中会过滤出grep命令的PID;
  3. 统一主机需要监控多个JAVA程序,zabbix模板如何降低工作量 ,zabbix的模板只能监控一个java进程,而为了降低工作量已经使用用户自定义宏参数$JAVA_solename,其他的JAVA进程怎么办,由于JAVA进程的数量不固定,无法写死几个宏参数,这里我使用的是复制模板,我司环境主机最多不会超过6个JAVA进程,故复制了6份监控模板;
  4. awk切割的$2与脚本参数$2冲突,脚本中切割数据$2冲突,需要将$2初始化,awk切割才可以生效。

zabbix键值配置

zabbix配置文件
加入zabbix_agent/conf/zabbix_agentd/中

jvm.conf

UserParameter=tomcat.jvm_[*],/bin/bash /tmp/tomcat_jvm.sh $1 $2

jstack_info.conf

UserParameter=tomcat.jstack_info_[*],/bin/bash /tmp/tomcat_jstack_info.sh $1 $2

脚本文件
/tmp/tomcat_jvm.sh
脚本参数$1是java的名称,$2是执行jstat的众多数据中需要取的数值。

[root@localhost sbin]# jstat -gc 32356
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
6656.0 7168.0  0.0   2912.0 684032.0 481881.8 1398272.0  1200891.1  134656.0 128537.8 15360.0 14356.6   3489   44.722   7      6.171   50.893
#!/bin/bash
javaPort=$1
javaPS=`ps -ef|grep $javaPort|grep -v 'grep '|grep -v 'tomcat_jvm.sh'`
javaPID=`echo $javaPS|awk '{print $2}'`
jstatName=(`jstat -gc $javaPID|head -n1`)
jstatKey=(`jstat -gc $javaPID|tail -n1`)
B=0
for A in ${jstatName[*]} ;do
if [ $A == $2 ];then
echo ${jstatKey[$B]}
fi
let B++
done

/tmp/tomcat_jstack_info.sh
脚本参数$1是java的名称,$2是执行jstack 安装进程状态过滤的状态名称。

#!/bin/bash
javaPort=$1
javaPS=`ps -ef|grep $javaPort|grep -v 'grep '|grep -v 'tomcat_jstack_info.sh'`
javaPID=`echo $javaPS|awk '{print $2}'`
if [ $2 == "TOTAL" ]; then
        echo `jstack $javaPID|grep "java.lang.Thread.State"|wc -l`
else 
        echo `jstack $javaPID|grep "java.lang.Thread.State"|grep $2|wc -l`
fi

测试键值

本地测试键值是否生效:
进入zabbix_agent重启zabbix_agent

cd zabbix_agent/sbin/
ps -ef|grep  zabbix|awk '{print $2}'|xargs kill -9
./zabbix_agentd
[root@localhost sbin]# ./zabbix_agentd -t tomcat.jstack_info_[lmdmweb-8081,TOTAL]
tomcat.jstack_info_[lmdmweb-8081,TOTAL]       [t|216]
[root@localhost sbin]#./zabbix_agentd -t tomcat.jvm_[lmdmweb-8081,EC]
tomcat.jvm_[lmdmweb-8081,EC]                  [t|681472.0]

创建zabbix监控模板

使用宏参数,定义java的唯一名称,对应脚本中利用ps -ef|grep寻找PID

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_JAVA


添加监控项

众多监控数据中取自己需要的数据,数据含义详情,自行百度

jstat本次取值为EC,EU

jstack本次取值为WAITING、RUNNABLE、BLOCKED、TOTAL

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_tomcat_02

创建图像

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_jvm_03


zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_java_04

复制模板

导出模板

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_jvm_05


全部替换模板中的

模板名称: <template>JAVA_JVM_Shell</template>  --> <template>JAVA_JVM_Shell_2</template>
宏参数名称:$JAVANAME  -->$JAVANAME_2
宏参数默认值(可选):<value>soleName</value>--><value>soleName_2</value>

重复以上操作

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_tomcat_06

添加监控

安装主机中java的数量添加监控模板数量

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_JAVA_07


修改模板中宏参数,参数是java的唯一过滤名称

一定要是唯一名称

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_java_08

结果查看

最新数据

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_tomcat_09


图表

zabbix创建监控项 可计算的 JVM内存 zabbix监控java进程_JAVA_10