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


    获取机器的数据

    import time
    import socket
    import datetime
    import psutil

    from common import send_email
    from common.mongo import Mongo


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

    from common.mongo import Mongo


    class 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")
  • 相关阅读:
    8.2Solr API使用(Facet查询)
    8.1Solr API使用(分页,高亮)
    7.Solr查询参数
    6.Solr4.10.3API使用(CURD)
    5.Solr4.10.3中配置中文分词器
    3.Solr4.10.3目录结构
    2.Linux环境下配置Solr4.10.3
    1.Solr介绍
    java集合中List与set的区别
    js快速排序
  • 原文地址:https://www.cnblogs.com/zhongyehai/p/11223529.html
Copyright © 2020-2023  润新知