寫一個關於監控的psutil模塊

   前幾天看到朋友鄭彥生分享的psutil模塊的使用方法,感受對於監控又多了一層想法,由於前期主要是經過saltstack,收集數據,可是有時候比較麻煩,在小型規模作監控的時候仍是建議用psutil模塊,方便快捷:首先介紹psutil模塊的一些基本用法:python

一、監控cpu:mysql

>>> import psutil
>>> psutil.cpu_count()     #查看線程
24
>>> psutil.cpu_percent()    #查看cpu負載
0.20000000000000001

二、查看內存相關信息:nginx

內存能夠查看總共多少內存,使用了多少,還剩多少:sql

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

三、硬盤的IO和使用狀況:app

#輸出硬盤分區信息
>>> 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)

四、採集網卡流量和網絡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)}

*注:固然還有不少信息,你們能夠去官網查看,,我這裏就簡單解釋了tcp

下面是爲了方便下次調用的時候寫的模塊,返回參數單位都是M。你們須要轉換成G爲單位的話直接/1024便可。ide

[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分析能不能返回狀態碼出圖顯示,這裏剛剛也寫了一下,貼出來:.net

[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數據庫,經過靈活性,能夠適當的結合報表出圖。
相關文章
相關標籤/搜索