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

时间:2022-12-12 20:37:33

 

获取机器的数据

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

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