查看linux系统里面有哪些java进程在运行:jps命令
[root@localhost zabbix]# jps
26490 YarnTaskExecutorRunner
12012 NodeManager
14047 YarnTaskExecutorRunner
25007 Jps
查看java进程的内存使用情况:jstat命令 -gc -gcutil
[root@node035 zabbix]# jstat -gc 12012S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
2560.0 2560.0 0.0 2208.0 335872.0 180374.6 338432.0 57522.0 51624.0 50525.8 5808.0 5542.1 104079 881.980 3 0.384 882.364
[root@node035 zabbix]# jstat -gcutil 12012S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 86.25 89.43 17.00 97.87 95.42 104079 881.980 3 0.384 882.364
采集数据脚本:
[root@localhost monitor]# cat getJavaMemoryStatus.sh
#!/bin/bash[ -f /tmp/java_memory_status.txt ] && >/tmp/java_memory_status.txt
flag=1result=`/usr/local/jdk/bin/jps|egrep -v "Jps|JarBootstrapMain|ThriftServer|unavailable|Jstat|JMap" |awk '{print $1}'`
for i in $result
dopid=$iname=`/usr/local/jdk/bin/jps|grep $i | awk '{print $2}'`grep $name /tmp/java_memory_status.txt &>/dev/nullif [ $? -eq 0 ]; thenname=$name$flagflag=$(( $flag + 1 )) elsename=`/usr/local/jdk/bin/jps|grep $i | awk '{print $2}'`fiOCOU=`/usr/local/jdk/bin/jstat -gc $i | awk 'NR==2{print $7,$8}' `O=`/usr/local/jdk/bin/jstat -gcutil $i | awk 'NR==2{print $4}'`YGC_YGCT_FGC_FGCT=`/usr/local/jdk/bin/jstat -gcutil $i | awk 'NR==2{print $7,$8,$9,$10}'` S0C_S1C_S0U_S0C_EC_EU=`/usr/local/jdk/bin/jstat -gc $i | awk 'NR==2{print $1,$2,$3,$4,$5,$6}' `S0Util=`/usr/local/jdk/bin/jstat -gcutil $i | awk 'NR==2{print $1}'`S1Util=`/usr/local/jdk/bin/jstat -gcutil $i | awk 'NR==2{print $2}'`echo "$name $pid $OCOU $O $YGC_YGCT_FGC_FGCT $S0C_S1C_S0U_S0C_EC_EU $S0Util $S1Util" >> /tmp/java_memory_status.txt
donegrep "QuorumPeerMain" /tmp/java_memory_status.txt &>/dev/null
if [ $? -eq 0 ];then
sed -i '/^QuorumPeerMain$/s/QuorumPeerMain/zookeeper/' /tmp/java_memory_status.txt
fi
#echo $flag
进程自动发现脚本:
[root@localhost parameter_script]# cat java_discovery.sh
#!/bin/bash
javaProcessList=`cat /tmp/java_memory_status.txt|awk '{print $2"#"$1}'`
echo "{\"data\":["
first=1
for javaProcess in $javaProcessList;
doIFS='#' read -r -a items <<< "$javaProcess";if [ $first == 1 ]; thenecho "{\"{#JAVAPSNAME}\":\"${items[1]}\",\"{#JAVAPSPID}\":\"${items[0]}\"}";first=0elseecho ",{\"{#JAVAPSNAME}\":\"${items[1]}\",\"{#JAVAPSPID}\":\"${items[0]}\"}";fi
done;echo "]}";
获取java进程内存数据脚本:
[root@node035 parameter_script]# cat getjavastatus.sh
#!/bin/bash
pid=`cat /tmp/java_memory_status.txt | awk '{print $2}'`
case $2 in
#old大小
OC)grep -w $1 /tmp/java_memory_status.txt |awk '{print $3}'|bc;;
#old使用大小
OU)grep -w $1 /tmp/java_memory_status.txt |awk '{print $4}'|bc;;
#old使用率
O)grep -w $1 /tmp/java_memory_status.txt |awk '{print $5}'|bc;;
# 年轻代垃圾回收次数
YGC)grep -w $1 /tmp/java_memory_status.txt |awk '{print $6}'|bc;;
# 年轻代垃圾回收消耗时间
YGCT)grep -w $1 /tmp/java_memory_status.txt |awk '{print $7}'|bc;;
# 老年代垃圾回收次数
FGC)grep -w $1 /tmp/java_memory_status.txt |awk '{print $8}'|bc;;
# 老年代垃圾回收消耗时间
FGCT)grep -w $1 /tmp/java_memory_status.txt |awk '{print $9}'|bc;;
S0C)grep -w $1 /tmp/java_memory_status.txt |awk '{print $10}'|bc;;
S1C)grep -w $1 /tmp/java_memory_status.txt |awk '{print $11}'|bc;;
S0U)grep -w $1 /tmp/java_memory_status.txt |awk '{print $12}'|bc;;
S1U)grep -w $1 /tmp/java_memory_status.txt |awk '{print $13}'|bc;;
S0Util)grep -w $1 /tmp/java_memory_status.txt |awk '{print $16}'|bc;;
S1Util)grep -w $1 /tmp/java_memory_status.txt |awk '{print $17}'|bc;;
esac
添加配置文件,自定义监控项
UserParameter=javaps,/etc/zabbix/parameter_script/java_discovery.sh
UserParameter=javastat[*],/etc/zabbix/parameter_script/getjavastatus.sh $1 $2
重启zabbix-agent2进程
service zabbix-agent2 restart
配置计划任务
*/1 * * * * sh /data/script/monitor/getJavaMemoryStatus.sh
配置java进程自动发现
创建一个模板组:JavaProcess
创建一个模板 JavaProcess
在 JavaProcess模板里面创建自动发现规则
添加要监控的监控项原型
给要监控的主机添加JavaProcess模板
zabbix会自动将发现的进程添加到对应主机