importthreading,re,time,sys,osfromsubprocessimport*fromshleximportsplit#global Variablesprev_cpu_info={"user":0,"system":0,"idle":0,"iowait":0}
cpu_stat=[]
prev_partition_info=[]
HZ=100SLEEP_TIME=3prev_net_info={"in":0,"out":0}classSysMonitor(threading.Thread):def__init__(self,name,eventList,eventListMutex):
threading.Thread.__init__(self)
self.name=name
self.eventList=eventList
self.eventListMutex=eventListMutex
self.running=True
self.runningMutex=threading.Lock()defstop(self):
self.runningMutex.acquire()
self.running=False
self.runningMutex.release()defcalculate_deltams(self):
ncpu=self.get_numbers_of_cpu()iflen(cpu_stat)==0:raiseException("Please run check_cpu() at first!")
deltams=1000.0*((cpu_stat['user']+cpu_stat['system']+cpu_stat['idle']+cpu_stat['iowait'])-(prev_cpu_info['user']+prev_cpu_info['system']+prev_cpu_info['idle']+prev_cpu_info['iowait']))/ncpu/HZreturndeltamsdefget_numbers_of_cpu(self):try:
cpufp=file("/proc/cpuinfo")
ncpu=0whileTrue:
line=cpufp.readline()iflen(line)<1:breakifre.search(r"processor\t:",line)!=None:
ncpu+=1finally:
cpufp.close()returnncpudefget_cpu_stat(self):
cpu_info={"user": 0,"system": 0,"idle": 0,"iowait": 0
}try:
cpustatfp=file("/proc/stat")
line=split(cpustatfp.readline())
cpu_info['user']=float(line[1])+float(line[2])
cpu_info['system']=float(line[3])+float(line[6])+float(line[7])
cpu_info['idle']=float(line[4])
cpu_info['iowait']=float(line[5])finally:
cpustatfp.close()returncpu_infodefcheck_cpu(self):globalprev_cpu_info,cpu_stat
cpu={"user": 0,"system": 0,"idle": 0,"iowait": 0
}ifprev_cpu_info['system']==0:
prev_cpu_info=self.get_cpu_stat()
time.sleep(1)else:
prev_cpu_info=cpu_stat
cpu_stat=self.get_cpu_stat()
cpu['user']=cpu_stat['user']-prev_cpu_info['user']
cpu['system']=cpu_stat['system']-prev_cpu_info['system']
cpu['idle']=cpu_stat['idle']-prev_cpu_info['idle']
cpu['iowait']=cpu_stat['iowait']-prev_cpu_info['iowait']
total=(cpu['user']+cpu['system']+cpu['idle']+cpu['iowait'] )
cpu['user']=cpu['user']/total*100cpu['system']=cpu['system']/total*100cpu['idle']=cpu['idle']/total*100cpu['iowait']=cpu['iowait']/total*100returncpudefget_disk_stat(self):
diskfp=open('/proc/diskstats')
all_partition=[]
curr={"major":0,"minor":0,"name": None,#disk name"rd_ios": 0,#read I/O operation"rd_merges": 0,#readed merged"rd_sectors": 0,#sectors readed"rd_ticks": 0,#time in queue and server for read"wr_ios": 0,#write I/O operation"wr_merges": 0,#write merged"wr_sectors": 0,#sectors writed"wr_ticks": 0,#time in queue and server for write"ticks": 0,#time of request in queue"aveq": 0#average queue length}whileTrue:
line=split(diskfp.readline())iflen(line)==0:breakifint(line[3])==0:continuecurr['major']=line[0]
curr['minor']=line[1]
curr['name']=line[2]
curr['rd_ios']=float(line[3])
curr['rd_merges']=float(line[4])
curr['rd_sectors']=float(line[5])
curr['rd_ticks']=float(line[6])
curr['wr_ios']=float(line[7])
curr['wr_merges']=float(line[8])
curr['wr_sectors']=float(line[9])
curr['wr_ticks']=float(line[10])
curr['ticks']=float(line[11])
curr['aveq']=float(line[12])
all_partition.append(curr.copy())returnall_partitiondefcheck_disk(self):globalprev_partition_info
DISK_STAT=[]
deltams=self.calculate_deltams()
curr_partition_info=self.get_disk_stat()iflen(prev_partition_info)==0:
prev_partition_info=curr_partition_info
curr_partition_info=self.get_disk_stat()
partition_num=len(curr_partition_info)
i=0whilei
disk_info=curr_partition_info[i]
prev_disk_info=prev_partition_info[i]
rd_ios=disk_info['rd_ios']-prev_disk_info['rd_ios']
rd_merges=disk_info['rd_merges']-prev_disk_info['rd_merges']
rd_sectors=disk_info['rd_sectors']-prev_disk_info['rd_sectors']
rd_ticks=disk_info['rd_ticks']-prev_disk_info['rd_ticks']
wr_ios=disk_info['wr_ios']-prev_disk_info['wr_ios']
wr_merges=disk_info['wr_merges']-prev_disk_info['wr_merges']
wr_sectors=disk_info['wr_sectors']-prev_disk_info['wr_sectors']
wr_ticks=disk_info['wr_ticks']-prev_disk_info['wr_ticks']
ticks=disk_info['ticks']-prev_disk_info['ticks']
aveq=disk_info['aveq']-prev_disk_info['aveq']#prev_disk_info = disk_info #store the old infoprev_partition_info[i]=curr_partition_info[i]
i=i+1n_ios=rd_ios+wr_ios
n_ticks=rd_ticks+wr_ticks
n_kbytes=(rd_sectors+wr_sectors)/2.0queue=aveq/deltamsifn_ios:
size=n_kbytes/n_ios
wait=n_ticks/n_ioselse:
size=0.0wait=0.0busy=100.0*ticks/deltamsifbusy>100.0:
busy=100#print rd_sectors,wr_sectorsreadPerSec=str(1000*rd_sectors/deltams/2.0*1024)
writePerSec=str(1000.0*wr_sectors/deltams/2.0*1024)
readPerSec=readPerSec[:readPerSec.find(".")+3]
writePerSec=writePerSec[:writePerSec.find(".")+3]#calculate total size and free size for every partitiontry:
mounts=open("/etc/mtab")#initializetotal_size=0
free_size=0whileTrue:
line=mounts.readline().strip()iflen(line)<1:breakifline.find(disk_info['name']+"")!=-1:
line=line.split()
s=os.statvfs(line[1])
total_size=s.f_bsize*s.f_blocks#unit : bytesfree_size=s.f_bsize*s.f_bavail#breakfinally:
mounts.close()
DISK_STAT.append({"name":disk_info["name"],"total_size":total_size,"free_size":free_size,"readPerSec":readPerSec,"writePerSec":writePerSec,"wait":wait,"queue":queue,"size":size})returnDISK_STATdefget_net_stat(self,eth):try:
netfp=file("/proc/net/dev")whileTrue:
line=netfp.readline()ifre.search(eth,line)!=None:
line=split(line[7:])
netin=int(line[0])
netout=int(line[8])breakfinally:
netfp.close()returnnetin,netoutdefcheckNet(self):globalprev_net_info
NET_STATS=[]
net_stat=self.get_net_stat('wlan0')#Caution!!! This should be the Ethernet card in use!!!ifprev_net_info['in']==0andprev_net_info['out']==0:
prev_net_info['in']=net_stat[0]
prev_net_info['out']=net_stat[1]
NET_STATS.append((net_stat[0]-prev_net_info['in'])/SLEEP_TIME )
NET_STATS.append((net_stat[1]-prev_net_info['out'])/SLEEP_TIME )
prev_net_info['in']=net_stat[0]
prev_net_info['out']=net_stat[1]returnNET_STATSdefcheckMem(self):#the memory status fileMEM_FILE="/proc/meminfo"#default statusMEM_STATUS={"MemTotal":0,"MemFree":0,"Cached":0,"SwapCached":0,"Active":0,"Inactive":0,"Inact_dirty":0,"Inact_clean":0,"HighTotal":0,"LowTotal":0,"SwapTotal":0,"SwapFree":0
}try:
fd=file(MEM_FILE,"r")
mem_info_list=fd.readlines()
PATTERN=re.compile(r"^(\w+):\s*(\d+)\s*(\w+)")#e.g:MemTotal: 2061480 kBforlineinmem_info_list:#DEBUGres=PATTERN.match(line)ifres:
var_list=res.groups()ifMEM_STATUS.has_key(var_list[0]):
MEM_STATUS[var_list[0]]=var_list[1]
fd.seek(0)finally:
fd.close()returnMEM_STATUSdefrun(self):whileTrue:
self.runningMutex.acquire()ifnotself.running:
self.runningMutex.release()breakself.runningMutex.release()
cpuStatus=self.check_cpu()
diskStatus=self.check_disk()
netStatus=self.checkNet()
memStatus=self.checkMem()#add those status to eventList#print cpuStatus#print memStatus#print diskStatus#print netStatusself.eventListMutex.acquire()whilelen(self.eventList)>0:delself.eventList[0]
self.eventList.append({"cpu":cpuStatus,"mem":memStatus,"disk":diskStatus,"net":netStatus})#Changed!!! trasform the dictionary to string!!!self.eventListMutex.release()#Just for testtime.sleep(SLEEP_TIME)if__name__=='__main__':
monitor=SysMonitor('SysMonitor',[],threading.Lock())
monitor.start()