设为首页 收藏本站
查看: 945|回复: 0

[经验分享] Zabbix低级发现结合jstat命令自动监控Java进程(jdk 1.8版本)

[复制链接]

尚未签到

发表于 2019-1-20 08:51:56 | 显示全部楼层 |阅读模式
cat jstat_status.py  
#!/usr/bin/python
  

  
import subprocess
  
import sys
  
import os
  

  
__maintainer__ = "John Wang"
  

  
jps = '/usr/java/jdk/bin/jps'
  
jstat = '/usr/java/jdk/bin/jstat'
  
zabbix_sender = "/usr/local/zabbix/bin/zabbix_sender"
  
zabbix_conf = "/usr/local/zabbix/etc/zabbix_agentd.conf"
  
send_to_zabbix = 1
  
ip=os.popen("ifconfig|grep 'inet '|grep -v '127.0'|xargs|awk -F '[ :]' '{print $3}'").readline().rstrip()
  
serverip="你的zabbix服务端ip"
  

  
#"{#JAVA_NAME}":"tomcat_web_1"
  

  

  
def usage():
  
    """Display program usage"""
  

  
    print "\nUsage : ", sys.argv[0], " java_name alive|all"
  
    print "Modes : \n\talive : Return pid of running processs\n\tall : Send jstat stats as well"
  
    sys.exit(1)
  

  

  
class Jprocess:
  

  
    def __init__(self, arg):
  
        self.pdict = {
  
        "jpname": arg,
  
        }
  

  
        self.zdict = {
  
        "Heap_used" : 0,
  
                "Heap_ratio" : 0,
  
        "Heap_max" : 0,
  
        "Perm_used" : 0,
  
                "Perm_ratio" : 0,
  
        "Perm_max"  : 0,
  
                "S0_used"   : 0,
  
                "S0_ratio"  : 0,
  
                "S0_max"    : 0,
  
                "S1_used"   : 0,
  
                "S1_ratio"  : 0,
  
                "S1_max"    : 0,
  
                "Eden_used" : 0,
  
                "Eden_ratio" : 0,
  
                "Eden_max"  : 0,
  
                "Old_used"  : 0,
  
                "Old_ratio" : 0,
  
                "Old_max"   : 0,
  
                "YGC"       : 0,
  
                "YGCT"      : 0,
  
                "YGCT_avg"      : 0,
  
                "FGC"       : 0,
  
                "FGCT"      : 0,
  
                "FGCT_avg"      : 0,
  
                "GCT"       : 0,
  
                "GCT_avg"       : 0,
  

  
        }
  

  

  
    def chk_proc(self):
  
#  ps -ef|grep java|grep tomcat_web_1|awk '{print $2}'
  
#                print self.pdict['jpname']
  
                pidarg = '''ps -ef|grep java|grep %s|grep -v grep|awk '{print $2}' ''' %(self.pdict['jpname'])
  
                pidout = subprocess.Popen(pidarg,shell=True,stdout=subprocess.PIPE)
  
                pid = pidout.stdout.readline().strip('\n')
  
                if pid != "" :
  
                   self.pdict['pid'] = pid
  
#                   print "Process found :", java_name, "with pid :", self.pdict['pid']
  
                else:
  
                   self.pdict['pid'] = ""
  
#                   print "Process not found"
  
                return self.pdict['pid']
  

  
    def get_jstats(self):
  
        if self.pdict['pid'] == "":
  
            return False
  
        self.pdict.update(self.fill_jstats("-gc"))
  
        self.pdict.update(self.fill_jstats("-gccapacity"))
  
        self.pdict.update(self.fill_jstats("-gcutil"))
  

  
#        print "\nDumping collected stat dictionary\n-----\n", self.pdict, "\n-----\n"
  

  
    def fill_jstats(self, opts):
  
#        print "\nGetting", opts, "stats for process", self.pdict['pid'], "with command : sudo", jstat, opts, self.pdict['pid'] ,"\n"
  
        jstatout = subprocess.Popen(['sudo','-u','tomcat', jstat, opts, self.pdict['pid']], stdout=subprocess.PIPE)
  
        stdout, stderr = jstatout.communicate()
  
        legend, data = stdout.split('\n',1)
  
        mydict = dict(zip(legend.split(), data.split()))
  
        return mydict
  

  
    def compute_jstats(self):
  
        if self.pdict['pid'] == "":
  
            return False
  
        self.zdict['S0_used'] = format(float(self.pdict['S0U']) * 1024,'0.2f')
  
        self.zdict['S0_max'] =  format(float(self.pdict['S0C']) * 1024,'0.2f')
  
        self.zdict['S0_ratio'] = format(float(self.pdict['S0']),'0.2f')
  

  
        self.zdict['S1_used'] = format(float(self.pdict['S1U']) * 1024,'0.2f')
  
        self.zdict['S1_max'] = format(float(self.pdict['S1C']) * 1024,'0.2f')
  
        self.zdict['S1_ratio'] = format(float(self.pdict['S1']),'0.2f')
  

  
        self.zdict['Old_used'] = format(float(self.pdict['OU']) * 1024,'0.2f')
  
        self.zdict['Old_max'] =  format(float(self.pdict['OC']) * 1024,'0.2f')
  
        self.zdict['Old_ratio'] = format(float(self.pdict['O']),'0.2f')
  

  
        self.zdict['Eden_used'] = format(float(self.pdict['EU']) * 1024,'0.2f')
  
        self.zdict['Eden_max'] = format(float(self.pdict['EC']) * 1024,'0.2f')
  
        self.zdict['Eden_ratio'] = format(float(self.pdict['E']),'0.2f')
  
# self.zdict['Perm_used'] = format(float(self.pdict['PU']) * 1024,'0.2f')
  
# self.zdict['Perm_max'] = format(float(self.pdict['PC']) * 1024,'0.2f')
  
# self.zdict['Perm_ratio'] = format(float(self.pdict['P']),'0.2f')
  

  
        self.zdict['Heap_used'] = format((float(self.pdict['EU']) + float(self.pdict['S0U']) + float(self.pdict['S1U'])  + float(self.pdict['OU'])) * 1024,'0.2f')
  
        self.zdict['Heap_max'] = format((float(self.pdict['EC']) + float(self.pdict['S0C']) + float(self.pdict['S1C'])  + float(self.pdict['OC'])) * 1024,'0.2f')
  
        self.zdict['Heap_ratio'] = format(float(self.zdict['Heap_used']) / float(self.zdict['Heap_max'])*100,'0.2f')
  

  
        self.zdict['YGC'] = self.pdict['YGC']
  
        self.zdict['FGC'] = self.pdict['FGC']
  
        self.zdict['YGCT'] = format(float(self.pdict['YGCT']),'0.3f')
  
        self.zdict['FGCT'] = format(float(self.pdict['FGCT']),'0.3f')
  
        self.zdict['GCT'] = format(float(self.pdict['GCT']),'0.3f')
  

  
        if self.pdict['YGC'] == '0':
  
           self.zdict['YGCT_avg'] = '0'
  
        else:
  
           self.zdict['YGCT_avg'] = format(float(self.pdict['YGCT'])/float(self.pdict['YGC']),'0.3f')
  
        if self.pdict['FGC'] == '0':
  
           self.zdict['FGCT_avg'] = '0'
  
        else:
  
           self.zdict['FGCT_avg'] = format(float(self.pdict['FGCT'])/float(self.pdict['FGC']),'0.3f')
  
        if self.pdict['YGC'] == '0' and self.pdict['FGC'] == '0':
  
           self.zdict['GCT_avg'] = '0'
  
        else:
  
           self.zdict['GCT_avg'] = format(float(self.pdict['GCT'])/(float(self.pdict['YGC']) + float(self.pdict['FGC'])),'0.3f')
  

  

  
       # print "Dumping zabbix stat dictionary\n-----\n", self.zdict, "\n-----\n"
  

  
    def send_to_zabbix(self, metric):
  
####      {#JAVA_NAME} tomcat_web_1
  
####      UserParameter=java.discovery,/usr/bin/python /opt/app/zabbix/sbin/java_discovery.py
  
####      UserParameter=java.discovery_status
  • ,/opt/app/zabbix/sbin/jstat_status.sh $1 $2 $3 $4
      
    ####      java.discovery_status[tomcat_web_1,Perm_used]
      
    ####      java.discovery_status[{#JAVA_NAME},Perm_used]
      
            key = "java.discovery_status[" + self.pdict['jpname'] + "," + metric + "]"
      

      
            if self.pdict['pid'] != "" and  send_to_zabbix > 0:
      
               #print key + ":" + str(self.zdict[metric])
      
               try:
      

      
                     subprocess.call([zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", str(self.zdict[metric])], stdout=FNULL,stderr=FNULL, shell=False)
      
               except OSError, detail:
      
                     print "Something went wrong while exectuting zabbix_sender : ", detail
      
            else:
      
               print "Simulation: the following command would be execucted :\n", zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", self.zdict[metric], "\n"
      

      

      
    accepted_modes = ['alive', 'all']
      

      

      
    if len(sys.argv) == 3 and sys.argv[2] in accepted_modes:
      
        java_name = sys.argv[1]
      
        mode = sys.argv[2]
      
    else:
      
        usage()
      

      

      
    #Check if process is running / Get PID
      
    jproc = Jprocess(java_name)
      
    pid = jproc.chk_proc()
      

      

      
    if pid != "" and  mode == 'all':
      
       jproc.get_jstats()
      
      # print jproc.zdict
      
       jproc.compute_jstats()
      
       FNULL = open(os.devnull, 'w')
      
       for key in jproc.zdict:
      
           #print key,jproc.zdict[key]
      
           jproc.send_to_zabbix(key)
      
       FNULL.close()
      
       print pid
      

      
    else:
      
       print 0



  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-665416-1-1.html 上篇帖子: zabbix多图同屏展示——“聚合图形”简单使用 下篇帖子: zabbix 监控部署(下)
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表