zabbixモニタzookeeperクラスタ

58799 ワード

プロファイルの追加/usr/local/zabbix/etc/zabbix_agentd.conf.d/check_zookeeper.conf
UserParameter=zookeeper.status[*],python /usr/local/zabbix/scripts/check_zookeeper.py $1

再起動zabbix_agentd
スクリプト#スクリプト#
#!/usr/bin/env python

""" Check Zookeeper Cluster  

zookeeper version should be newer than 3.4.x  

# echo mntr|nc 127.0.0.1 2181  
zk_version  3.4.6-1569965, built on 02/20/2014 09:09 GMT  
zk_avg_latency  0  
zk_max_latency  4  
zk_min_latency  0  
zk_packets_received 84467  
zk_packets_sent 84466  
zk_num_alive_connections    3  
zk_outstanding_requests 0  
zk_server_state follower  
zk_znode_count  17159  
zk_watch_count  2  
zk_ephemerals_count 1  
zk_approximate_data_size    6666471  
zk_open_file_descriptor_count   29  
zk_max_file_descriptor_count    102400  

# echo ruok|nc 127.0.0.1 2181  
imok  

"""
import sys
import socket
import re
import subprocess
from StringIO import StringIO
import os

zabbix_sender = '/usr/local/zabbix/bin/zabbix_sender'
zabbix_conf = '/usr/local/zabbix/etc/zabbix_agentd.conf'
send_to_zabbix = 1


############# get zookeeper server status
class ZooKeeperServer(object):
    def __init__(self, host='localhost', port='2181', timeout=1):
        self._address = (host, int(port))
        self._timeout = timeout
        self._result = {}

    def _create_socket(self):
        return socket.socket()

    def _send_cmd(self, cmd):
        """ Send a 4letter word command to the server """
        s = self._create_socket()
        s.settimeout(self._timeout)

        s.connect(self._address)
        s.send(cmd)

        data = s.recv(2048)
        s.close()

        return data

    def get_stats(self):
        """ Get ZooKeeper server stats as a map """
        data_mntr = self._send_cmd('mntr')
        data_ruok = self._send_cmd('ruok')
        if data_mntr:
            result_mntr = self._parse(data_mntr)
        if data_ruok:
            result_ruok = self._parse_ruok(data_ruok)

        self._result = dict(result_mntr.items() + result_ruok.items())

        if not self._result.has_key('zk_followers') and not self._result.has_key(
                'zk_synced_followers') and not self._result.has_key('zk_pending_syncs'):
            ##### the tree metrics only exposed on leader role zookeeper server, we just set the followers' to 0
            leader_only = {'zk_followers': 0, 'zk_synced_followers': 0, 'zk_pending_syncs': 0}
            self._result = dict(result_mntr.items() + result_ruok.items() + leader_only.items())

        return self._result

    def _parse(self, data):
        """ Parse the output from the 'mntr' 4letter word command """
        h = StringIO(data)

        result = {}
        for line in h.readlines():
            try:
                key, value = self._parse_line(line)
                result[key] = value
            except ValueError:
                pass  # ignore broken lines

        return result

    def _parse_ruok(self, data):
        """ Parse the output from the 'ruok' 4letter word command """

        h = StringIO(data)

        result = {}

        ruok = h.readline()
        if ruok:
            result['zk_server_ruok'] = ruok

        return result

    def _parse_line(self, line):
        try:
            key, value = map(str.strip, line.split('\t'))
        except ValueError:
            raise ValueError('Found invalid line: %s' % line)

        if not key:
            raise ValueError('The key is mandatory and should not be empty')

        try:
            value = int(value)
        except (TypeError, ValueError):
            pass

        return key, value

    def get_pid(self):
        pidarg = '''/opt/software/jdk/bin/jps -l |grep zookeeper  |awk '{print $1}' '''
        pidout = subprocess.Popen(pidarg, shell=True, stdout=subprocess.PIPE)
        pid = pidout.stdout.readline().strip('
') return pid def send_to_zabbix(self, metric): key = "zookeeper.status[" + metric + "]" if send_to_zabbix > 0: # print key + ":" + str(self._result[metric]) try: subprocess.call([zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", str(self._result[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 :
", zabbix_sender, "-c", zabbix_conf, "-k", key, "-o", \ self._result[metric], "
" def usage(): """Display program usage""" print "
Usage : ", sys.argv[0], " alive|all" print "Modes :
\talive : Return pid of running zookeeper
\tall : Send zookeeper stats as well" sys.exit(1) accepted_modes = ['alive', 'all'] if len(sys.argv) == 2 and sys.argv[1] in accepted_modes: mode = sys.argv[1] else: usage() zk = ZooKeeperServer() # print zk.get_stats() pid = zk.get_pid() if pid != "" and mode == 'all': zk.get_stats() # print zk._result FNULL = open(os.devnull, 'w') for key in zk._result: zk.send_to_zabbix(key) FNULL.close() print pid elif pid != "" and mode == "alive": print pid else: print 0

かたいた


    2.0
    2016-02-27T15:15:09Z
    
        
            Templates
        
    
    
        
    
    
        
            {Template ZooKeeper:zookeeper.status[zk_outstanding_requests].last()}>10
            big outstanding requests number
            
            0
            4
            
            0
            
        
        
            {Template ZooKeeper:zookeeper.status[zk_pending_syncs].last()}>10
            big pending syncs
            
            0
            4
            
            0
            
        
        
            {Template ZooKeeper:zookeeper.status[zk_avg_latency].last()}>10
            large average latency
            
            0
            4
            
            0
            
        
        
            {Template ZooKeeper:zookeeper.status[zk_open_file_descriptor_count].last()} > {Template ZooKeeper:zookeeper.status[zk_max_file_descriptor_count].last()}*0.85
            large file descriptor used
            
            0
            4
            
            0
            
        
        
            {Template ZooKeeper:zookeeper.status[zk_server_ruok].str(imok)}#1
            zookeeper is abnormal
            
            0
            4
            
            0
            
        
        
            {Template ZooKeeper:zookeeper.status[all].last()}=0
            zookeeper is not running
            
            0
            4
            
            0
            
        
        
            {Template ZooKeeper:zookeeper.status[zk_server_state].abschange()}>0
            zookeeper state role has been changed
            
            0
            2
            
            0
            
        
    
    
        
            ZooKeeper Alive Connections
            900
            200
            0.0000
            100.0000
            1
            1
            1
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    0
                    0
                    00DDDD
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_num_alive_connections]
                    
                
            
        
        
            ZooKeeper Data Size
            900
            200
            0.0000
            100.0000
            1
            1
            1
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    0
                    0
                    00C800
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_approximate_data_size]
                    
                
            
        
        
            ZooKeeper Latency
            900
            200
            0.0000
            100.0000
            1
            1
            0
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    0
                    2
                    00C800
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_avg_latency]
                    
                
                
                    1
                    2
                    C80000
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_min_latency]
                    
                
                
                    2
                    2
                    0000C8
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_max_latency]
                    
                
            
        
        
            ZooKeeper Packages Received/Sent
            900
            200
            0.0000
            100.0000
            1
            1
            1
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    1
                    0
                    00C800
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_packets_received]
                    
                
                
                    0
                    0
                    FF3333
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_packets_sent]
                    
                
            
        
        
            ZooKeeper Watches Count
            900
            200
            0.0000
            100.0000
            1
            1
            1
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    0
                    0
                    660066
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_watch_count]
                    
                
            
        
        
            ZooKeeper Znodes Count
            900
            200
            0.0000
            100.0000
            1
            1
            0
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    0
                    1
                    FFCCFF
                    0
                    2
                    0
                    
                        Template ZooKeeper
                        zookeeper.status[zk_znode_count]
                    
                
            
        
    



参照先:http://john88wang.blog.51cto.com/2165294/1745339/