获取机器的数据
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")