• Nagios监控ganglia的指标


    这是nagios与ganglia整合的一部分内容 。

    通常我们会把ganglia的监控发送给一个主机,我们可以在这个主机上执行nc localhost 8649 可以获取到所有发往这个主机的信息,以xml的形式查看。

    nagios监控ganglia的指标的方法就是使用这个思路,check_ganglia.py

    先连通ganglia_host,然后获取所有的xml,然后再解析xml,解析的时候找到匹配的主机名,然后再找到下面的metric和值,与你传进来的critical与waring的进行匹配,

    然后判断后返回合适的状态。

    感觉有点浪费,数据传来传去的。

    #!/usr/bin/env python
     
    import sys
    import getopt
    import socket
    import xml.parsers.expat
     
    class GParser:
      def __init__(self, host, metric):
        self.inhost =0
        self.inmetric = 0
        self.value = None
        self.host = host
        self.metric = metric
     
      def parse(self, file):
        p = xml.parsers.expat.ParserCreate()
        p.StartElementHandler = parser.start_element
        p.EndElementHandler = parser.end_element
        p.ParseFile(file)
        if self.value == None:
          raise Exception('Host/value not found')
        return float(self.value)
     
      def start_element(self, name, attrs):
        if name == "HOST":
          if attrs["NAME"]==self.host:
            self.inhost=1
        elif self.inhost==1 and name == "METRIC" and attrs["NAME"]==self.metric:
          self.value=attrs["VAL"]
     
      def end_element(self, name):
        if name == "HOST" and self.inhost==1:
          self.inhost=0
     
    def usage():
      print """Usage: check_ganglia 
    -h|--host= -m|--metric= -w|--warning= 
    -c|--critical= [-s|--server=] [-p|--port=] """
      sys.exit(3)
     
    if __name__ == "__main__":
    ##############################################################
      ganglia_host = 'x.x.x.x'
      ganglia_port = 8649
      host = None
      metric = None
      warning = None
      critical = None
     
      try:
        options, args = getopt.getopt(sys.argv[1:],
          "h:m:w:c:s:p:",
          ["host=", "metric=", "warning=", "critical=", "server=", "port="],
          )
      except getopt.GetoptError, err:
        print "check_gmond:", str(err)
        usage()
        sys.exit(3)
     
      for o, a in options:
        if o in ("-h", "--host"):
           host = a
        elif o in ("-m", "--metric"):
           metric = a
        elif o in ("-w", "--warning"):
           warning = float(a)
        elif o in ("-c", "--critical"):
           critical = float(a)
        elif o in ("-p", "--port"):
           ganglia_port = int(a)
        elif o in ("-s", "--server"):
           ganglia_host = a
     
      if critical == None or warning == None or metric == None or host == None:
        usage()
        sys.exit(3)
            
      try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((ganglia_host,ganglia_port))
        parser = GParser(host, metric)
        value = parser.parse(s.makefile("r"))
        s.close()
      except Exception, err:
        print "CHECKGANGLIA UNKNOWN: Error while getting value "%s"" % (err)
        sys.exit(3)
     
      if critical > warning:
        if value >= critical:
          print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value)
          sys.exit(2)
        elif value >= warning:
          print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value)
          sys.exit(1)
        else:
          print "CHECKGANGLIA OK: %s is %.2f" % (metric, value)
          sys.exit(0)
      else:
        if critical >=value:
          print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value)
          sys.exit(2)
        elif warning >=value:
          print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value)
          sys.exit(1)
        else:
          print "CHECKGANGLIA OK: %s is %.2f" % (metric, value)
          sys.exit(0)

    测试:

    python check_ganglia.py -h hostxx -m load_one -w 10 -c 100

  • 相关阅读:
    spring 整合 shiro框架
    Kafka常见问题及解决方法
    设计模式之解释器模式规则你来定(二十五)
    设计模式之原型模式简单即复杂(二十四)
    设计模式之访问者模式层次操作(二十三)
    设计模式之状态模式IFORNOIF(二十二)
    设计模式之职责链模式永不罢休(二十一)
    设计模式之组合模式透明实用(二十)
    设计模式之享元模式高效复用(十九)
    设计模式之迭代器模式解析学习源码(十八)
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/5085108.html
Copyright © 2020-2023  润新知