Beispiel #1
0
def discovery_redis(*args):
    """
    find redis instance
    @return: [(ip, prot, passwd)]
    """

    redises = []
    redis_conf_path_root = '/data'
    redis_conf_file_name = 'redis.conf'
    for redis_process in [x
                          for x in psutil.process_iter()
                          if len(x.cmdline()) > 0 and (
                os.path.basename(x.exe()) == BINNAME or os.path.basename(x.exe()) == CODISBINNAME)]:
        try:
            redis_ip, redis_port = sorted([laddr.laddr
                                           for laddr in redis_process.connections()
                                           if laddr.status == 'LISTEN'])[0]
        except:
            continue

        redis_passwd = ''
        config_files = []

        if os.path.isdir(redis_process.cwd()):
            cwd_try = os.path.join(redis_process.cwd(), redis_conf_file_name)
            if os.path.exists(cwd_try):
                config_files.append(cwd_try)
            else:
                for root_dir, dirs, files in os.walk(os.path.dirname(redis_process.cwd())):
                    if 'redis.conf' in files:
                        config_files.append(os.path.join(root_dir, redis_conf_file_name))
        elif len(redis_process.cmdline()) > 1 and os.path.isfile(redis_process.cmdline()[1]):
            config_files.append(redis_process.cmdline()[1])
        else:
            for root_dir, dirs, files in os.walk(redis_conf_path_root):
                if 'redis.conf' in files:
                    config_files.append(os.path.join(root_dir, redis_conf_file_name))
        for config_file in config_files:
            try:
                with open(config_file, 'r') as f:
                    passwd = None
                    port = None
                    for line in f.readlines():
                        if re.search('^requirepass', line):
                            passwd = line.split()[1]
                        if re.search('^port', line):
                            port = line.split()[1]
                if passwd and port and str(redis_port) == port:
                    redis_passwd = Monitor.encode_password(passwd)
                    break
            except:
                pass
        if redis_ip == '0.0.0.0' or redis_ip == '::' or redis_ip == '127.0.0.1' or redis_ip == '':
            redis_ip = Monitor.get_local_ip()
        if [redis_ip, redis_port, redis_passwd] not in redises:
            redises.append([redis_ip, redis_port, redis_passwd])
    return redises
Beispiel #2
0
def discovery_redis():
    """
    find redis instance
    @return: [(ip, prot, passwd)]
    """

    redises = []
    redis_conf_path_root = "/data"
    redis_conf_file_name = "redis.conf"
    for redis_process in [
        x for x in psutil.process_iter() if len(x.cmdline()) > 0 and os.path.basename(x.exe()) == BINNAME
    ]:
        try:
            redis_ip, redis_port = sorted(
                [laddr.laddr for laddr in redis_process.get_connections() if laddr.status == "LISTEN"]
            )[0]
        except:
            continue

        redis_passwd = ""
        config_files = []

        if os.path.isdir(redis_process.getcwd()):
            cwd_try = os.path.join(redis_process.getcwd(), redis_conf_file_name)
            if os.path.exists(cwd_try):
                config_files.append(cwd_try)
            else:
                for root_dir, dirs, files in os.walk(os.path.dirname(redis_process.getcwd())):
                    if "redis.conf" in files:
                        config_files.append(os.path.join(root_dir, redis_conf_file_name))
        elif len(redis_process.cmdline()) > 1 and os.path.isfile(redis_process.cmdline()[1]):
            config_files.append(redis_process.cmdline()[1])
        else:
            for root_dir, dirs, files in os.walk(redis_conf_path_root):
                if "redis.conf" in files:
                    config_files.append(os.path.join(root_dir, redis_conf_file_name))
        for config_file in config_files:
            try:
                with open(config_file, "r") as f:
                    passwd = None
                    port = None
                    for line in f.readlines():
                        if re.search("^requirepass", line):
                            passwd = line.split()[1]
                        if re.search("^port", line):
                            port = line.split()[1]
                if passwd and port and str(redis_port) == port:
                    redis_passwd = Monitor.encode_password(passwd)
                    break
            except:
                pass
        if redis_ip == "0.0.0.0":
            redis_ip = Monitor.get_local_ip()
        redises.append([redis_ip, redis_port, redis_passwd])
    return redises
Beispiel #3
0
def start(args):
    """
    get service monitor data, or discovery service instance
    @param args:
    @return: string when get service data, json when discovery
    """
    fs = args.fieldseparator
    arg_list = []
    if args.extend:
        arg_list = args.extend.split(fs)

    if args.discovery:
        assert not args.macros is None, 'must have macros'
    elif args.list:
        print Monitor.get_service_list(fs, *arg_list)

    else:
        assert not args.instance is None, 'must have instance'
        # assert not args.item is None, 'must have item'

    if args.service:
        monitor = Monitor(args.service, cache_path=args.cache if args.cache else None)

        if args.discovery:
            print monitor.discovery(args.macros.split(fs), *arg_list)
        else:
            if args.item:
                print monitor.load_data(args.instance, args.item, *arg_list)
            if args.list:
                print "Monitor Items (in %s)" % args.instance
                for it in sorted(monitor.load_keys(args.instance, *arg_list)):
                    print it
Beispiel #4
0
def discovery_tomcat(*args):
    '''
    discovery tomcat instance's host and port
    '''
    result = []
    port = ''
    cmdline = []
    host = Monitor.get_local_ip()
    for i in psutil.process_iter():
        if i.name() == BINNAME:
            pid = int(i.pid)
            cmdline = i.cmdline()

            for opt in cmdline:
                if opt.find('-Dcom.sun.management.jmxremote.port') == 0:
                    monitor_port = opt.strip().split('=')[1]
                if opt.find('-Dcatalina.base') == 0:
                    config_file = opt.strip().split(
                        '=')[1] + '/conf/server.xml'
                    tree = ET.ElementTree(file=config_file)
                    root = tree.getroot()
                    for root_child in root:
                        if root_child.tag == 'Service':
                            for service_child in root_child:
                                if service_child.tag == 'Connector':
                                    listen_port = service_child.attrib['port']

            if monitor_port.isdigit() and listen_port.isdigit():
                result.append([host, listen_port, monitor_port])
    return result
Beispiel #5
0
def discovery_kingshard(*args):
    '''
    discovery kingshard instance's host and port
    '''
    result = []
    port = ''
    address = ''
    cmdline = []
    host = Monitor.get_local_ip()
    for i in psutil.process_iter():
        if i.name() == BINNAME:
            pid = int(i.pid)
            cmdline = i.cmdline()

            for opt in cmdline:
                if opt.find('-config=') == 0:
                    config_file = opt.strip().split('=')[1]
            if os.path.exists(config_file):
                f = open(config_file, 'r')
                cfg_content = f.read()
                f.close()
            for line in cfg_content.split("\n"):
                if line.find('addr : ') == 0:
                    address = line.split(':')[1].strip()
                    port = line.split(':')[2].strip()
                    if address == '0.0.0.0':
                        address = host
                    result.append([address, port])
    return result
Beispiel #6
0
def discovery_tomcat(*args):
    '''
    discovery tomcat instance's host and port
    '''
    result = []
    port = ''
    cmdline = []
    host = Monitor.get_local_ip()
    for i in psutil.process_iter():
        if i.name() == BINNAME:
            pid = int(i.pid)
            cmdline = i.cmdline()

            for opt in cmdline:
                if opt.find('-Dcom.sun.management.jmxremote.port') == 0:
                    monitor_port = opt.strip().split('=')[1]
                if opt.find('-Dcatalina.base') == 0:
                    config_file = opt.strip().split('=')[1] + '/conf/server.xml'
                    tree = ET.ElementTree(file=config_file)
                    root = tree.getroot()
                    for root_child in root:
                        if root_child.tag == 'Service':
                            for service_child in root_child:
                                if service_child.tag == 'Connector':
                                    listen_port = service_child.attrib['port']

            if monitor_port.isdigit() and listen_port.isdigit():
                result.append([host, listen_port, monitor_port])
    return result
Beispiel #7
0
def discovery_etcd(*args):
    '''
    discovery etcd instance's host and port
    '''
    result = []
    port = ''
    address = ''
    cmdline = []
    host = Monitor.get_local_ip()
    for i in psutil.process_iter():
        if i.name() == BINNAME:
            pid = int(i.pid)
            cmdline = i.cmdline()

            for opt in cmdline:
                if opt.find('--name=') == 0:
                    name = opt.strip().split('=')[1].strip()
                    config_file = CFG_DIR + 'etcd-' + name + '.conf'
            if os.path.exists(config_file):
                f = open(config_file, 'r')
                cfg_content = f.read()
                f.close()
            for line in cfg_content.split("\n"):
                if line.find('ETCD_LISTEN_CLIENT_URLS=') == 0:
                    address_port = line.split('//')[1].strip('"')
                    address = address_port.split(':')[0]
                    port = address_port.split(':')[1]
                    if address == '0.0.0.0':
                        address = host
                    result.append([address, port, name])
    return result
Beispiel #8
0
def discovery_nginx(status_path=False, *args):
    '''
    discovery nginx instance's host and port
    '''
    nginx_pid = ''
    instance_list = []
    for i in psutil.process_iter():
        if i.name() == BINNAME and i.username() == 'root':
            nginx_pid = i.pid

    nginx_proc_file = '/proc/{0}/cmdline'.format(nginx_pid)

    if os.path.exists(nginx_proc_file):
        f = open(nginx_proc_file, 'r')
        nginx_cmd = f.read()
        f.close()
        nginx_cfg_file = nginx_cmd.strip().split()[-1]

        f = open(nginx_cfg_file, 'r')
        cfg_content = f.read()
        f.close()

        #        print cfg_content
        p_status_on = re.compile('stub_status\s+on;', re.I)
        m_status_on = p_status_on.search(cfg_content)
        if m_status_on:
            p_path = re.compile('location.*', re.I)
            m_path = p_path.search(cfg_content)
            if m_path:
                path = m_path.group(0).strip().split()[1]
            p_port = re.compile('listen\s+.*', re.I)
            m_port = p_port.search(cfg_content)
            if m_port:
                l_port = m_port.group(0).strip().strip(';').split()[-1].split(
                    ':')
                if (len(l_port) == 2):
                    port = l_port[1]
                else:
                    port = l_port[0]
            ip = Monitor.get_local_ip()

    result = []
    if not status_path:
        result.append([str(ip), str(port)])
        return result
    else:
        return path
Beispiel #9
0
def discovery_nginx(status_path=False, *args):
    '''
    discovery nginx instance's host and port
    '''
    nginx_pid = ''
    instance_list = []
    for i in psutil.process_iter():
        if i.name() == BINNAME and i.username() == 'root':
            nginx_pid = i.pid

    nginx_proc_file = '/proc/{0}/cmdline'.format(nginx_pid)

    if os.path.exists(nginx_proc_file):
        f = open(nginx_proc_file, 'r')
        nginx_cmd = f.read()
        f.close()
        nginx_cfg_file = nginx_cmd.strip().split()[-1]

        f = open(nginx_cfg_file, 'r')
        cfg_content = f.read()
        f.close()

        #        print cfg_content
        p_status_on = re.compile('stub_status\s+on;', re.I)
        m_status_on = p_status_on.search(cfg_content)
        if m_status_on:
            p_path = re.compile('location.*', re.I)
            m_path = p_path.search(cfg_content)
            if m_path:
                path = m_path.group(0).strip().split()[1]
            p_port = re.compile('listen\s+.*', re.I)
            m_port = p_port.search(cfg_content)
            if m_port:
                l_port = m_port.group(0).strip().strip(';').split()[-1].split(':')
                if (len(l_port) == 2):
                    port = l_port[1]
                else:
                    port = l_port[0]
            ip = Monitor.get_local_ip()

    result = []
    if not status_path:
        result.append([str(ip), str(port)])
        return result
    else:
        return path
Beispiel #10
0
def discovery_codisHa(*args):
    '''
    discovery codis-ha instance's host and port
    '''
    result = []
    port = ''
    address = ''
    cmdline = []
    host = Monitor.get_local_ip()
    for i in psutil.process_iter():
        if i.name() == BINNAME:
            pid = int(i.pid)
            cmdline = i.cmdline()

            for opt in cmdline:
                if opt.find('--dashboard=') == 0:
                    address = opt.strip().split('=')[1].split(':')[0].strip()
                    port = opt.strip().split('=')[1].split(':')[1].strip()
                    result.append([address, port])
    return result
Beispiel #11
0
def get_redis_data(instance_name, *args):
    """
    get monitor data from redis
    @param instance_name: ip:port:passwd
    @return: dict
    """

    ip, port, passwd = instance_name.split("/")
    passwd = Monitor.decode_password(passwd)

    r = redis.StrictRedis(host=ip, port=port, password=passwd)
    d = r.info()
    check_items = {
        "redis_version": str,
        "redis_mode": str,  # standalone,
        "uptime_in_seconds": int,
        "process_id": int,
        # Clients
        "connected_clients": int,  # 当前客户端连接数
        "blocked_clients": int,  # 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
        "connected_slaves": int,  # 当前从连接的数量
        "rejected_connections": int,
        "total_connections_received": int,  # 运行以来连接过的客户端的总数量
        "client_longest_output_list": int,  # 当前连接的客户端当中,最长的输出列表
        "client_biggest_input_buf": int,  # 当前连接的客户端当中,最大输入缓存
        # Memory
        "used_memory": int,  # 由redis分配器分配的内存总量,以字节(byte)为单位
        "used_memory_rss": int,  # 从操作系统的角度,返回rRedis已分配的内存总量(俗称常驻集大小),这个值和top、ps等命令的输出一致。
        "used_memory_peak": int,  # redis的内存消耗峰值(以字节为单位)
        "used_memory_lua": int,  # 引擎所使用的内存大小(以字节为单位)
        "mem_fragmentation_ratio": float,  # 内存碎片比率:userd_memory_rss和used_memory之间的比率
        # Persistence
        "rdb_changes_since_last_save": int,  # 上次保存数据库之后,执行命令的次数
        "rdb_bgsave_in_progress": int,  # 后台进行中的save操作的数量
        "rdb_last_save_time": int,  # 最后一次成功保存的时间点,以 UNIX 时间戳格式显示
        "rdb_last_bgsave_status": str,
        "rdb_last_bgsave_time_sec": int,
        "rdb_current_bgsave_time_sec": int,
        # Stats
        "total_commands_processed": int,  # 运行以来执行过的命令的总数量
        "instantaneous_ops_per_sec": int,  # 每秒瞬间ops数
        "expired_keys": int,  # 运行以来过期的 key 的数量
        "evicted_keys": int,  # 运行以来删除过的key的数量
        "keyspace_hits": int,  # 命中 key 的次数
        "keyspace_misses": int,  # 不命中 key 的次数
        "pubsub_channels": int,  # 当前使用中的频道数量
        "pubsub_patterns": int,  # 当前使用的模式的数量
        #'latest_fork_usec':int,
        # Replication
        "role": str,  # 当前实例的角色master还是slave
        "master_host": str,
        "master_port": int,
        "master_link_status": str,  # up or down
        "master_last_io_seconds_ago": int,
        "master_sync_in_progress": int,
        "slave_lists": str,
        #'slave0:ip=192.168.200.25,port=62710,state=online,offset=823669419,lag=1     #offset 当前从的数据偏移量位置
        # CPU
        "used_cpu_sys": float,
        "used_cpu_user": float,
        "used_cpu_sys_children": float,
        "used_cpu_user_children": float,
    }
    redis_stats = {k: d[k] if d.has_key(k) else v() for k, v in check_items.iteritems()}
    redis_stats["role"] = 1 if redis_stats.get("role", "master") == "master" else 2
    redis_stats["keyspace_hits_rate"] = "{0:.2f}".format(
        float(redis_stats.get("keyspace_hits", 0))
        / float(redis_stats.get("keyspace_hits", 1) + redis_stats.get("keyspace_misses", 0) + 0.01)
        * 100
    )
    if redis_stats["connected_slaves"] > 0:
        slave_lists = set()
        for i in range(redis_stats["connected_slaves"]):
            if d.has_key("slave%s" % i):
                slave_lists.add(str(d["slave%s" % i]))
        redis_stats["slave_lists"] = ",".join(list(slave_lists))
    return redis_stats
Beispiel #12
0
def get_redis_data(instance_name, *args):
    """
    get monitor data from redis
    @param instance_name: ip:port:passwd
    @return: dict
    """

    ip, port, passwd = instance_name.split('/')
    passwd = Monitor.decode_password(passwd)

    r = redis.StrictRedis(host=ip, port=port, password=passwd)
    d = r.info()
    c = r.config_get('maxmemory')
    d['max_memory'] = c['maxmemory']
    check_items = {
        'redis_version': str,
        'redis_mode': str,  # standalone,
        'uptime_in_seconds': int,
        'process_id': int,
        # Clients
        'connected_clients': int,  # 当前客户端连接数
        'blocked_clients': int,  # 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量
        'connected_slaves': int,  # 当前从连接的数量
        'rejected_connections': int,
        'total_connections_received': int,  # 运行以来连接过的客户端的总数量
        'client_longest_output_list': int,  # 当前连接的客户端当中,最长的输出列表
        'client_biggest_input_buf': int,  # 当前连接的客户端当中,最大输入缓存
        # Memory
        'max_memory': int,  # 配置文件限制的最大内存 以 byte 为单位,0代表不限制
        'used_memory': int,  # 由redis分配器分配的内存总量,以字节(byte)为单位
        'used_memory_rss': int,  # 从操作系统的角度,返回rRedis已分配的内存总量(俗称常驻集大小),这个值和top、ps等命令的输出一致。
        'used_memory_peak': int,  # redis的内存消耗峰值(以字节为单位)
        'used_memory_lua': int,  # 引擎所使用的内存大小(以字节为单位)
        'mem_fragmentation_ratio': float,  # 内存碎片比率:userd_memory_rss和used_memory之间的比率
        # Persistence
        'rdb_changes_since_last_save': int,  # 上次保存数据库之后,执行命令的次数
        'rdb_bgsave_in_progress': int,  # 后台进行中的save操作的数量
        'rdb_last_save_time': int,  # 最后一次成功保存的时间点,以 UNIX 时间戳格式显示
        'rdb_last_bgsave_status': str,
        'rdb_last_bgsave_time_sec': int,
        'rdb_current_bgsave_time_sec': int,
        # Stats
        'total_commands_processed': int,  # 运行以来执行过的命令的总数量
        'instantaneous_ops_per_sec': int,  # 每秒瞬间ops数
        'expired_keys': int,  # 运行以来过期的 key 的数量
        'evicted_keys': int,  # 运行以来删除过的key的数量
        'keyspace_hits': int,  # 命中 key 的次数
        'keyspace_misses': int,  # 不命中 key 的次数
        'pubsub_channels': int,  # 当前使用中的频道数量
        'pubsub_patterns': int,  # 当前使用的模式的数量
        # 'latest_fork_usec':int,
        # Replication
        'role': str,  # 当前实例的角色master还是slave
        'master_host': str,
        'master_port': int,
        'master_link_status': str,  # up or down
        'master_last_io_seconds_ago': int,
        'master_sync_in_progress': int,
        'slave_lists': str,
        # 'slave0:ip=192.168.200.25,port=62710,state=online,offset=823669419,lag=1     #offset 当前从的数据偏移量位置
        # CPU
        'used_cpu_sys': float,
        'used_cpu_user': float,
        'used_cpu_sys_children': float,
        'used_cpu_user_children': float,
    }
    redis_stats = {k: d[k] if d.has_key(k) else v() for k, v in check_items.iteritems()}
    redis_stats['role'] = 1 if redis_stats.get('role', 'master') == 'master' else 2
    redis_stats['keyspace_hits_rate'] = '{0:.2f}'.format(float(redis_stats.get('keyspace_hits', 0)) / float(
        redis_stats.get('keyspace_hits', 1) + redis_stats.get('keyspace_misses', 0) + 0.01) * 100)
    if not redis_stats.get('max_memory') == '0':
        redis_stats['memory_used_percent'] = '{0:.2f}'.format(
            float((redis_stats.get('used_memory')) / float(redis_stats.get('max_memory')) * 100))
    if redis_stats['connected_slaves'] > 0:
        slave_lists = set()
        for i in range(redis_stats['connected_slaves']):
            if d.has_key("slave%s" % i):
                slave_lists.add(str(d["slave%s" % i]))
        redis_stats['slave_lists'] = ','.join(list(slave_lists))
    return redis_stats
Beispiel #13
0
def discovery_ipmi(arg='', *args):
    '''
    discovery ipmi instance
    '''
    result = []
    host = Monitor.get_local_ip()
    if not arg:
        result.append([host])
    elif arg == 'FAN':
        (status, output) = commands.getstatusoutput(
            "/usr/bin/ipmitool sdr type fan | grep -v 'Fully Redundant' | cut -d '|' -f 1 "
        )
        if status == 0:
            for fan in output.split('\n'):
                fan = fan.lower()
                fan = fan.strip()
                fan = fan.replace(' ', '_')
                result.append([host, fan])
    # cpu memory system io
    elif arg == 'CMSI':
        (status, output) = commands.getstatusoutput(
            "/usr/bin/ipmitool sdr elist full | grep -E '(CPU|IO|MEM|SYS)'| cut -d '|' -f 1"
        )
        if status == 0:
            for cmsi in output.split('\n'):
                cmsi = cmsi.lower()
                cmsi = cmsi.strip()
                cmsi = cmsi.replace(' ', '_')
                result.append([host, cmsi])
    # current voltage temp
    elif arg == 'VCT':
        (status, output) = commands.getstatusoutput(
            "/usr/bin/ipmitool sdr elist full | grep -E '(Inlet Temp|Exhaust Temp|Current|Voltage)'| cut -d '|' -f 1"
        )
        if status == 0:
            for vct in output.split('\n'):
                vct = vct.lower()
                vct = vct.strip()
                vct = vct.replace(' ', '_')
                result.append([host, vct])
    elif arg == 'PW':
        (status, output) = commands.getstatusoutput(
            "/usr/bin/ipmitool chassis status | grep -E '(System Power|Power Overload)' | cut -d ':' -f 1"
        )
        if status == 0:
            for pw in output.split('\n'):
                pw = pw.lower()
                pw = pw.strip()
                pw = pw.replace(' ', '_')
                result.append([host, pw])
    elif arg == 'SEL':
        (status, output) = commands.getstatusoutput(
            "/usr/bin/ipmitool sel info | grep -v Information | cut -d ':' -f 1"
        )
        if status == 0:
            for sel in output.split('\n'):
                sel = sel.lower()
                sel = sel.strip()
                sel = sel.replace(' ', '_')
                result.append([host, sel])

    return result