class MonitorClient(object): def __init__(self,server,port): self.server = server#服务器端ip self.port = port#端口 self.configs = {}#获取配置信息 self.redis = RedisHelper() #将传过来的数据序列化 def format_msg(self,key,value): msg = {key,value} return pickle.dumps(msg) def get_configs(self): config = self.redis.get('HostConfig::%s'%host_ip) if config: self.configs = pickle.loads(config) return True def handle(self): if self.get_configs(): print '---going to monitor services---',self.configs while True: for service_name, val in self.configs['servcies'].item(): interval,plugin_name,last_check = val if time.time() - last_check >= interval: #need to kick off the next run #启动一个线程,这个线程完成对相关信息的监控并返回给服务器的任务 t = threading.Thread(target=self.task,args=[service_name,plugin_name]) t.start() self.configs['services'][service_name][2] = time.time() #update last check time else: next_run_time = interval - (time.time() - last_check) print '\033[32;1m%s\033[0m will be run in next \033[32;1m%s\033[0m seconds'%(service_name,next_run_time) #将所有的服务循环完一遍后,停1s time.sleep(1) else: print '---could not found any configurations for this hosts---' #修改该方法,使其负责完成监控,收集客户端信息然后发到服务器端的任务 def task(self,servcie_name,plugin_name): print '---going to run service:',servcie_name,plugin_name #通过反射的方式从plugin_api中,取出获取的同名字符串插件方法。 func = getattr(plugin_api, plugin_name) result = func() # 然后执行方法 #方法得到的结果为字典类型,所以需要序列化然后存到redis中 #self.redis.public(pickle.dumps(result)) msg = self.format_msg('report_service_data', {'ip':host_ip, 'service_name':servcie_name, 'data':result, } ) #上面的‘report_service_data’告诉服务端这发送的是监控信息,这样做的好处是细化了功能, #上面的一系列操作不仅可以用来监控数据,还可以做例如传文件的功能,所以为以后扩展功能预留空间。 self.redis.public(msg) def run(self): self.handle()
class MonitorClient(object): def __init__(self, server, port): self.server = server self.port = port self.configs = {} self.redis = RedisHelper() #建立redis链接 def format_msg(self, key, value): #专门用来处理数据 msg = {key: value} return pickle.dumps(msg) def get_configs(self): config = self.redis.get('HostConfig::%s' % self.server) if config: #redis里存在此key self.configs = pickle.loads(config) return True def handle(self): if self.get_configs(): print "--- going to monitor services ---", self.configs #开始监控 while True: for service_name, val in self.configs['services'].items(): #print service_name,val interval, plugin_name, last_check = val if time.time() - last_check >= interval: #代表超时,需要启一个新线程运行了 t = threading.Thread(target=self.task, args=[service_name, plugin_name]) t.start() self.configs['services'][service_name][2] = time.time( ) #更新时间戳 else: next_run_time = interval + last_check - time.time() print "%s will be run in next %s seconds" % ( service_name, next_run_time) time.sleep(2) else: print "--- could not found any configurations for this host ---" def task(self, service_name, plugin_name): print "---going to run service:", service_name, plugin_name func = getattr(plugin_api, plugin_name) result = func() #执行插件 #把执行结果发给redis #self.redis.publish(pickle.dumps(result)) msg = self.format_msg('report_service_data', { 'ip': host_ip, 'service_name': service_name, 'data': result }) self.redis.public(msg) def run(self): self.handle()
class MonitorClient(object): def __init__(self, service, port): self.server = service self.port = port self.configs = {} self.redis = RedisHelper() @staticmethod def format_msg(key, value): msg = {key: value} return pickle.dumps(msg) def get_configs(self): config = self.redis.get('HostConfig::%s' % host_ip) if config: self.configs = pickle.loads(config) # 将config序列化后赋值给全局变量 return True def handle(self): if self.get_configs(): print 'Going to monitor services ', self.configs while True: for service_name, val in self.configs['services'].items(): interval, plugin_name, last_check = val # server.core.serialize.py传入的三个参数 if time.time() - last_check >= interval: # need to kick off the next run t = threading.Thread(target=self.task, args=[service_name, plugin_name]) t.start() self.configs['services'][service_name][2] = time.time() # update last check time else: next_run_time = interval - (time.time() - last_check) # 下一次运行时间 print '\033[32;1m%s\033[0m will be run in next time \033[32;1m%s\033[0m seconds' \ % (service_name, next_run_time) time.sleep(1) else: print 'Could not found any configurations for this host.' def task(self, service_name, plugin_name): print 'Going to run service:', service_name, plugin_name func = getattr(plugin_api, plugin_name) # 通过反射导入plugins.plugin_api里面的监控方法 result = func() # self.redis.public(pickle.dumps(result)) msg = self.format_msg( 'report_service_data', { 'ip': host_ip, 'service_name': service_name, 'data': result, } ) self.redis.public(msg) def run(self): self.handle()
class sucker(object): def __init__(self): self.hosts = serialize.all_host_configs() self.redis = RedisHelper() def handle(self): for host_ip,v in self.hosts['hosts'].items(): self.hosts['hosts'][host_ip]['configs'] = serialize.config_serializer(host_ip, detail=True) print host_ip,v print 'status data:',self.pull_host_data(host_ip) def pull_host_data(self,ip): key = 'StatusData::%s' % ip data =self.redis.get(key) if data: return pickle.loads(data)
class sucker(object): def __init__(self): self.hosts = serialize.all_host_configs() self.redis = RedisHelper() def handle(self): for host_ip,v in self.hosts['hosts'].items(): self.hosts['hosts'][host_ip]['configs'] = serialize.config_serializer(host_ip,detail=True) print(host_ip,v) print('status data:',self.pull_host_data(host_ip)) def pull_host_data(self,ip): key = 'StatusData::%s' % ip data =self.redis.get(key) if data: return pickle.loads(data)
class MonitorClient(object): def __init__(self,server,port): self.server = server self.port = port self.configs = {} self.redis = RedisHelper() def get_configs(self): value = self.redis.get('HostConfig::%s' % host_ip) if value: self.configs =pickle.load(value) return True return False def handle(self): if self.get_configs(): print '--going to monitor services-- ',self.configs while True: for service_name,val in self.configs['services'].items(): interval,plugin_name,last_check = val if time.time() - last_check >= interval: t = threading.Thread(target=self.task,args=[service_name,plugin_name]) t.start() self.configs['serivces'][service_name][2] = time.time() else: next_run_time = interval - (time.time()-last_check) print '%s will be run in next %s seconds' % (service_name,next_run_time) time.sleep(1) else: print '--could not found any configuration for this host---' def task(self,service_name,plugin_name): print '---going to run service:',service_name func = getattr(plugin_api,plugin_name) result = func() self.redis.public(pickle.dump(result)) def run(self): self.handle()
#! /usr/bin/env python # coding:utf-8 """ 在redis设置一个key,然后去获取他得值 """ from redishelper import RedisHelper r = RedisHelper() # 设置key r.set('name','wweeee2222') # 获取key print(r.get('name'))
class MonitorClient(object): def __init__(self,server,port): self.server = server self.port = port self.configs = {} self.lock = threading.Lock() self.redis = RedisHelper() def format_msg(self,key,value): msg = {key: value} return pickle.dumps(msg) def get_configs(self): msg = self.format_msg('get_host_configs', {'ip': client_ip}) print u'-----get host monitor configs----' #,msg redis_pub = self.redis.public(msg) count = 1 while count<30: configs = self.redis.get(client_ip) if configs: #print configs return pickle.loads(configs) else: count +=1 time.sleep(1) sys.exit('Error:could not get client monitor configurations!') def handle(self): self.configs = self.get_configs() if self.configs['services']: print '--going to monitor ---',self.configs #{'services': {'linux_memory': [30, 'get_memory_info', 0], 'linux_cpu': [30, 'get_cpu_status', 0]}} while True: for service_name,val in self.configs['services'].items(): interval,plugin_name,last_check = val next_run_time = interval - (time.time() - last_check) if time.time() - last_check >= interval: print 'service\033[32;1m%s\033[0m has reached monitor interval' % service_name t = threading.Thread(target=self.task_run,args=[service_name,plugin_name,]) t.start() self.configs['services'][service_name][2] = time.time() else: print 'service\033[34;1m%s\033[0m next run time is \033[34;1m%s\033[0m seconds later' % (service_name,next_run_time) time.sleep(1) #print self.configs else: print '---nothing to monitor,configs dict is empty---' def task_run(self,service_name,plugin_name): plugin_func = getattr(plugin_api, plugin_name) result = plugin_func() msg = self.format_msg('report_service_data', {'ip': client_ip, 'service_name':service_name, 'data': result, }) self.redis.public(msg) def run(self): self.handle()
class MonitorClient(object): def __init__(self, server, port): self.server = server self.port = port self.configs = {} self.lock = threading.Lock() self.redis = RedisHelper() def format_msg(self, key, value): """ 将 message 序列化 :param key: :param value: :return: """ msg = {key: value} return pickle.dumps(msg) def get_configs(self): """ 向 server 发送 client ip 获取 监控指标 :return: """ msg = self.format_msg('get_host_configs', {'ip': client_ip}) print('-----get host monitor configs----') # ,msg redis_pub = self.redis.public(msg) count = 1 while count < 30: # 重复30 次, 从 redis 中获取 client 的监控指标数据 configs = self.redis.get(client_ip) if configs: # print configs return pickle.loads(configs) else: count += 1 time.sleep(1) sys.exit('Error:could not get client monitor configurations!') def handle(self): """ 循环处理 :return: """ self.configs = self.get_configs() if self.configs['services']: print('--going to monitor ---', self.configs) # {'services': {'linux_memory': [30, 'get_memory_info', 0], 'linux_cpu': [30, 'get_cpu_status', 0]}} while True: # 依据监控指标进行循环执行脚本 for service_name, val in self.configs['services'].items(): interval, plugin_name, last_check = val next_run_time = interval - (time.time() - last_check) if time.time() - last_check >= interval: print( 'service\033[32;1m%s\033[0m has reached monitor interval' % service_name) t = threading.Thread(target=self.task_run, args=[ service_name, plugin_name, ]) t.start() self.configs['services'][service_name][2] = time.time() else: print( 'service\033[34;1m%s\033[0m next run time is \033[34;1m%s\033[0m seconds later' % (service_name, next_run_time)) time.sleep(1) # print self.configs else: print('---nothing to monitor,configs dict is empty---') def task_run(self, service_name, plugin_name): """ 执行监控脚本, 向 redis 发布数据 :param service_name: :param plugin_name: :return: """ plugin_func = getattr(plugin_api, plugin_name) result = plugin_func() msg = self.format_msg('report_service_data', { 'ip': client_ip, 'service_name': service_name, 'data': result, }) self.redis.public(msg) def run(self): self.handle()