测开之路六十八:监控平台之监控逻辑和处理逻辑

匿名 (未验证) 提交于 2019-12-02 23:49:02

获取机器的数据

import timeimport socketimport datetimeimport psutilfrom common import send_emailfrom common.mongo import Mongoclass Agent(object):    def __init__(self):        super(Agent).__init__()        self.mongo = Mongo()    def get_ip(self):        """ 通过socket库可以获取机器名,通过机器名可以获取ip地址。 """        hostname = socket.gethostname()        return socket.gethostbyname(hostname)    def get_cpu(self):        """ cpu相关,interval代表获取数据的时间间隔,percpu为True时,如果机器多核,则返回多个核数据。 """        result = {}        data = psutil.cpu_percent(interval=1, percpu=True)  # cpu使用率        result['avg'] = sum(data) / psutil.cpu_count()  # 平均使用率        result['idle'] = 100 - result['avg']  # cpu空闲率        result['data'] = data  # 所有数据        return result    def get_memory(self):        """ 内存相关 """        result = {}        data = psutil.virtual_memory()        result['total'] = data.total  # 内存总量        result['available'] = data.available  # 可用内存        result['percent'] = data.percent  # 已用内存占比        result['used'] = data.used  # 已使用内存        return result    def get_disk(self):        """ 磁盘相关 """        result = {            'total': 0,  # 总量            'used': 0,  # 已使用            'available': 0,  # 可用的            'percent': 0  # 已使用的        }        # 先获取硬盘分区,再跟进分区获取硬盘信息,Mac这里直接用/代替disk_partitions()        partitions = psutil.disk_partitions()        # 计算每一个分区的数据,然后汇总成硬盘使用总量        for partition in partitions:            data = psutil.disk_usage(partition.device)            result['total'] += data.total            result['used'] += data.used            result['available'] += data.free        result['percent'] = 100 * result['used'] / result['total']        return result    def get_network(self):        """ 获取网卡接受与发送的bytes和packet数据。 """        result = {            'bytes': {},  # 传输的字节,衡量大小            'packets': {}  # 传输的包的数据        }        data = psutil.net_io_counters()        result['bytes']['sent'] = data.bytes_sent  # 发送的数据大小,字节        result['bytes']['receive'] = data.bytes_recv  # 接收的数据大小,字节        result['packets']['sent'] = data.packets_sent  # 发送包的数量        result['packets']['receive'] = data.packets_recv  # 接收包的数量        return result    def monitor(self, interval):        """ 执行监控,interval代表获取数据的时间间隔 """        collection = self.get_ip()  # 获取要收集数据机器的ip,用来后面当做表名        while True:            result = {                'time': datetime.datetime.now(),  # 当前统计的的时间                'cpu': self.get_cpu(),  # 获取cpu相关的数据                'memory': self.get_memory(),  # 获取内存相关的数据                'disk': self.get_disk(),  # 获取磁盘相关的数据                'network': self.get_network(),  # 获取网络相关的数据            }            # 设置一个报警值,触发报警时发送邮件            if result['cpu']['avg'] > 20:                send_email("907728701@qq.com", "<h1>CPU使用率大于20%,实际是{0}</h1>".format(result['cpu']['avg']))            print("将机器{0}数据写入数据库{1}".format(collection, result))            # 把数据插入数据库            self.mongo.insert("monitor", collection, result)            time.sleep(interval)if __name__ == '__main__':    agent = Agent()    agent.monitor(0.5)

处理逻辑

import datetimefrom common.mongo import Mongoclass Logic(object):    def __init__(self):        self.mongo = Mongo()    def search(self, data):        """ 查询监控数据,查询条件:ip、开始时间、结束时间 """        ip = data.pop('ip', '127.0.0.1')  # ip,默认为127.0.0.1        start = data.pop('start', None)  # 开始时间,默认为None        end = data.pop('end', None)  # 结束时间,默认为None        # 查找条件,时间段        filter = {            'time': {                # 把传进来的时间参数,转化为MongoDB里面存的时间格式                '$gt': datetime.datetime.strptime(start, "%Y-%m-%d %H:%M:%S"),  # 大于开始时间                '$lt': datetime.datetime.strptime(end, "%Y-%m-%d %H:%M:%S")  # 小于结束时间            }        }        # 把MongoDB返回的objectid转成list        results = list(self.mongo.search("monitor", ip, filter))        # 把每一个objectid转成str        for result in results:            result['_id'] = str(result['_id'])        return results    def get_ip_list(self, data):        """ 获取所有表的表名,插入数据的时候就是以ip为表名 """        return self.mongo.get_all_collections("monitor")

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!