查看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会自动将发现的进程添加到对应主机