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
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
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
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
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
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
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
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
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
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
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
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
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