利用jstat 自动发现监控java程序

这个项目搞了好几天,总结了一下原因:

  1. 对自动发现注册监控不了解原理,之前有遗留的脚本很多都不支持不能
  2. 用对脚本还不能够完全掌握,有时间还是要好好看看
  3. 还是思路问题,解决问题的方法千千万,不要吊死在一棵树上,多试试几种死法本人比较懒,之前打算使用jmx监控,发现公司使用的supervisorctl 管理jar包启动,自己也是第一次使用,这里不做赘述。
  4. 使用jstat 命令来获取参数,这里使用的是计划任务,之前放在脚本中,服务搞死了 哈哈哈

    干货在这里直接上:

监控指标:
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数   !
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数   !
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比

干货直接撸

脚本一 :


[root@iZj6chku2ng9ofxksew0oiZ userparameter_scripts]# cat java_name_discovery.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import subprocess
import simplejson as json

t=subprocess.Popen("ps -ef | grep java|grep -vE '(grep|/bin/bash)'|awk '{print $9}'|awk -F '=' '{print $2}'",stdout=subprocess.PIPE,shell=True).communicate()[0]
#data=t.stdout.readlines()
#print(data)
tomcats=[]

for tomcat in t.split('\n'):
    if len(tomcat) != 0:
        tomcats.append({'{#TOMCAT_NAME}':tomcat})

# 打印出zabbix可识别的json格式
print json.dumps({'data':tomcats},sort_keys=True,indent=4,separators=(',',':'))

此脚本用于自动发现java程序打印名称,返回成json 格式 ,供zabbix来读取!
需要有pip命令,并安装相关模块

脚本二:

#!/bin/bash
JAVA_NAME=$1
STATUS=$2
export PATH=$PATH:/usr/java/jdk1.8.0_144/bin/
PID=$(ps -ef | grep $JAVA_NAME | grep '/bin/java' | grep -v grep | awk '{print $2}')
#echo $PID
fun1 () {
#    echo "1"
     jstat -gc  $PID | awk -v st=$STATUS '{for(i=1;i<=NF;i++) if($i ==st) n=i} END{print $n}'
}
fun2 () {
#    echo "2"
    jstat -gcutil $PID | awk -v st=$STATUS '{for(i=1;i<=NF;i++) if($i ==st) n=i} END{print $n}'
}
case $STATUS in
   "S0C"| "S1C"|"S0U"|"S1U"|"EC"|"EU"|"OC"|"OU"| "YGC"|"YGCT"|"FGC"|"FGCT")
        fun1;;
   "S0"|"S1"|"E"|"O")
        fun2;;
   *)echo "print number error"
    exit1;;
esac

Zabbix 配置文件

UserParameter=java.name.discovery,sudo  /usr/bin/python /etc/zabbix/zabbix_agentd.d/userparameter_scripts/java_name_discovery.py
UserParameter=java.status.monitor[*],sudo  /etc/zabbix/zabbix_agentd.d/userparameter_scripts/java_status_monitor.sh $1 $2

关于权限这里需要注意一下:sudo 免密配置

visudo

zabbix  ALL=(ALL)       NOPASSWD: ALL. #免密
Defaults:zabbix    !requiretty        #不需要登陆

Zabbix 配置文件需要修改的地方:

AllowRoot=1                            #AllowRoot=1(允许以root运行)

注意:修改配置后重启zabbix-agent ,利用zabbix_get 来获取数据查看一下是否能正常获取到数据