前几天看到朋友郑彦生分享的psutil模块的使用方法,感觉对于监控又多了一层想法,因为前期主要是通过saltstack,收集数据,但是有时候比较麻烦,在小型规模做监控的时候还是建议用psutil模块,方便快捷:首先介绍psutil模块的一些基本用法:
1、监控cpu:
>>> import psutil >>> psutil.cpu_count() #查看线程 24 >>> psutil.cpu_percent() #查看cpu负载 0.20000000000000001
2、查看内存相关信息:
内存可以查看总共多少内存,使用了多少,还剩多少:
>>> mem = psutil.virtual_memory()
#统计所有的信息
>>> mem svmem(total=67502866432L, available=61983199232L, percent=8.1999999999999993, used=7092293632L, free=60410572800L, active=5551243264, inactive=410374144, buffers=335728640L, cached=1236897792) >>> mem.total #内存总数 67502866432L >>> mem.used #使用了多少内存 7092293632L >>> mem.free #剩余内存 60410572800L
3、硬盘的IO和使用情况:
#输出硬盘分区信息 >>> psutil.disk_partitions() [sdiskpart(device='/dev/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda3', mountpoint='/boot', fstype='ext4', opts='rw'), sdiskpart(device='/dev/mapper/VolGroup-lv_home', mountpoint='/home', fstype='ext4', opts='rw')] #根据分区信息查看大小 >>> psutil.disk_partitions('/') [sdiskpart(device='/dev/mapper/VolGroup-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='proc', mountpoint='/proc', fstype='proc', opts='rw'), sdiskpart(device='sysfs', mountpoint='/sys', fstype='sysfs', opts='rw'), sdiskpart(device='devpts', mountpoint='/dev/pts', fstype='devpts', opts='rw,gid=5,mode=620'), sdiskpart(device='tmpfs', mountpoint='/dev/shm', fstype='tmpfs', opts='rw'), sdiskpart(device='/dev/sda3', mountpoint='/boot', fstype='ext4', opts='rw'), sdiskpart(device='/dev/mapper/VolGroup-lv_home', mountpoint='/home', fstype='ext4', opts='rw'), sdiskpart(device='', mountpoint='/proc/sys/fs/binfmt_misc', fstype='binfmt_misc', opts='rw')] #硬盘IO的使用情况 >>> psutil.disk_io_counters() sdiskio(read_count=107158, write_count=20666736, read_bytes=1792485376, write_bytes=133169932288, read_time=130421, write_time=337076882) 4、采集网卡流量和网络IO: #统计总体信息 >>> psutil.net_io_counters() snetio(bytes_sent=984192973, bytes_recv=1274031495, packets_sent=3924134, packets_recv=6024010, errin=0, errout=0, dropin=0, dropout=0) #查看具体每个接口
{'lo': snetio(bytes_sent=349343820, bytes_recv=349343820, packets_sent=1583789, packets_recv=1583789, errin=0, errout=0, dropin=0, dropout=0), 'em1': snetio(bytes_sent=634794145, bytes_recv=823789288, packets_sent=2339457, packets_recv=3623086, errin=0, errout=0, dropin=0, dropout=0), 'em4': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'em3': snetio(bytes_sent=59939, bytes_recv=100907694, packets_sent=932, packets_recv=817226, errin=0, errout=0, dropin=0, dropout=0), 'em2': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0)}
*注:当然还有很多信息,大家可以去官网查看,,我这里就简单解释了
下面是为了方便下次调用的时候写的模块,返回参数单位都是M。大家需要转换成G为单位的话直接/1024即可。
[root@mail test]# cat miontor.py #!/usr/bin/env python import re,pickle import psutil import time def GetcpuLoad(): cpuLoad=psutil.cpu_percent(interval=1) return cpuLoad def GetMeminfo(): mem = psutil.virtual_memory() mem_total = mem.total/1024/1024 mem_user = mem.used/1024/1024 mem_free = mem.free/1024/1024 mem_dic = {'mem_total':float(mem_total),'mem_user':float(mem_user),'mem_free':float(mem_free)} return mem_dic def GetNetworkinfo(eth): networkinfo = psutil.net_io_counters(pernic=True)[eth] bytes_sent=list(networkinfo)[0]/1024/1024 bytes_recv=list(networkinfo)[1]/1024/1024 total = (bytes_sent+bytes_recv) return total def GetNetworkio(): networkio = psutil.net_io_counters() bytes_sent = list(networkio)[0]/1024/1024 bytes_recv = list(networkio)[1]/1024/1024 total = (bytes_sent+bytes_recv) return total def GetdiskIO(): disk_io = psutil.disk_io_counters() read_count =list(disk_io)[0]/1024/1024 write_count =list(disk_io)[1]/1024/1024 io_total = (read_count+write_count) return io_total def GetdiskSize(): disk_list = [] d_list = [] total_disk = [] disk_name=list(psutil.disk_partitions()) for name in disk_name: disk_list.append(list(name)[1]) with open('fdisk_list.txt','w') as fd: pickle.dump(disk_list,fd) with open('fdisk_list.txt','r') as fd: fdisk_name = pickle.load(fd) for n in fdisk_name: fdisk_name_list = n total=list(psutil.disk_usage(n))[0]/1024/1024 used =list(psutil.disk_usage(n))[1]/1024/1024 free =list(psutil.disk_usage(n))[2]/1024/1024 d_list=[fdisk_name_list,total,used,free] total_disk.append(d_list) with open('total_list.txt','w') as fd: pickle.dump(total_disk,fd) if __name__ =='__main__': # print GetMeminfo() print GetNetworkinfo('em3')
附:刚刚朋友问我以后公司的nginx分析能不能返回状态码出图显示,这里刚刚也写了一下,贴出来:
[root@mail test]# cat nginx_log.py #!/usr/bin/env python def gethttpcode(code): n = 0 f = open('/tmp/www_access.log') for d in f.readlines(): xiaoluo = d.split() num = xiaoluo[8] if num == code: n += 1 return n f.close() if __name__ =='__main__': # print gethttpcode('200') # print gethttpcode('304') print gethttpcode('500') 我们获取到的这些数据,可以入mysql数据库,通过灵活性,可以适当的结合报表出图。