示例#1
0
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()
示例#2
0
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()
示例#3
0
文件: client.py 项目: jameyang/python
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()
示例#4
0
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)
示例#5
0
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)
示例#6
0
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()
示例#7
0
#! /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'))
示例#8
0
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()
示例#9
0
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()