刚刚学python,根据需求自己动手写了几个监控系统性能的脚本,原理比较简单,都是通过SNMP协议获取系统信息,再进行相应的计算和格式化,最后输出结果。
以下的脚本都是通过os.popen模块调用snmpwalk 命令获取到的MIB 信息,原本想用py-snmp,不过介于网上资源太少,而且官网的例子看不太懂,只能用这种方法替代。后期再尝试用py-snmp来做这些事情。由于这些脚本都是调用snmpwalk命令来获取信息,所以被监控的机器上需要支持snmp,可以执行
# yum install -y net-snmp*
下面是几个脚本的代码,第一次写,写的不够规范,也不够简洁,还请大家多指教。
监控网卡流量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 1#!/usr/bin/python
2import re
3import os
4#get SNMP-MIB2 of the devices
5def getAllitems(host,oid):
6 sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split('\n')[:-1]
7 return sn1
8
9#get network device
10def getDevices(host):
11 device_mib = getAllitems(host,'RFC1213-MIB::ifDescr')
12 device_list = []
13 for item in device_mib:
14 if re.search('eth',item):
15 device_list.append(item.split(':')[3].strip())
16 return device_list
17
18#get network date
19def getDate(host,oid):
20 date_mib = getAllitems(host,oid)[1:]
21 date = []
22 for item in date_mib:
23 byte = float(item.split(':')[3].strip())
24 date.append(str(round(byte/1024,2)) + ' KB')
25 return date
26
27if __name__ == '__main__':
28 hosts = ['192.168.30.111','192.168.30.112']
29 for host in hosts:
30 device_list = getDevices(host)
31
32 inside = getDate(host,'IF-MIB::ifInOctets')
33 outside = getDate(host,'IF-MIB::ifOutOctets')
34
35 print '==========' + host + '=========='
36 for i in range(len(inside)):
37 print '%s : RX: %-15s TX: %s ' % (device_list[i], inside[i], outside[i])
38 print
39
监控内存(swap)使用率
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 1#!/usr/bin/python
2import os
3def getAllitems(host, oid):
4 sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split('\n')[:-1]
5 return sn1
6
7def getSwapTotal(host):
8 swap_total = getAllitems(host, 'UCD-SNMP-MIB::memTotalSwap.0')[0].split(' ')[3]
9 return swap_total
10
11def getSwapUsed(host):
12 swap_avail = getAllitems(host, 'UCD-SNMP-MIB::memAvailSwap.0')[0].split(' ')[3]
13 swap_total = getSwapTotal(host)
14 swap_used = str(round(((float(swap_total)-float(swap_avail))/float(swap_total))*100 ,2)) + '%'
15 return swap_used
16
17def getMemTotal(host):
18 mem_total = getAllitems(host, 'UCD-SNMP-MIB::memTotalReal.0')[0].split(' ')[3]
19 return mem_total
20
21def getMemUsed(host):
22 mem_total = getMemTotal(host)
23 mem_avail = getAllitems(host, 'UCD-SNMP-MIB::memAvailReal.0')[0].split(' ')[3]
24 mem_used = str(round(((float(mem_total)-float(mem_avail))/float(mem_total))*100 ,2)) + '%'
25 return mem_used
26
27if __name__ == '__main__':
28 hosts = ['192.168.30.111','192.168.30.112']
29 print "Monitoring Memory Usage"
30 for host in hosts:
31 mem_used = getMemUsed(host)
32 swap_used = getSwapUsed(host)
33 print '==========' + host + '=========='
34 print 'Mem_Used = %-15s Swap_Used = %-15s' % (mem_used, swap_used)
35 print
36
监控系统负载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1#!/usr/bin/python
2import os
3def getAllitems(host, oid):
4 sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split('\n')
5 return sn1
6
7def getload(host,loid):
8 load_oids = '1.3.6.1.4.1.2021.10.1.3.' + str(loid)
9 return getAllitems(host,load_oids)[0].split(':')[3]
10
11if __name__ == '__main__':
12 hosts = ['192.168.30.111','192.168.30.112']
13 #check_system_load
14 print '==============System Load=============='
15 for host in hosts:
16 load1 = getload(host, 1)
17 load10 = getload(host, 2)
18 load15 = getload(host, 3)
19 print '%s load(1min): %s ,load(10min): %s ,load(15min): %s' % (host,load1,load10,load15)
20
监控CPU
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 1#!/usr/bin/python
2import os
3def getAllitems(host, oid):
4 sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid + '|grep Raw|grep Cpu|grep -v Kernel').read().split('\n')[:-1]
5 return sn1
6
7def getDate(host):
8 items = getAllitems(host, '.1.3.6.1.4.1.2021.11')
9
10 date = []
11 rate = []
12 cpu_total = 0
13 #us = us+ni, sy = sy + irq + sirq
14 for item in items:
15 float_item = float(item.split(' ')[3])
16 cpu_total += float_item
17 if item == items[0]:
18 date.append(float(item.split(' ')[3]) + float(items[1].split(' ')[3]))
19 elif item == item[2]:
20 date.append(float(item.split(' ')[3] + items[5].split(' ')[3] + items[6].split(' ')[3]))
21 else:
22 date.append(float_item)
23
24 #calculate cpu usage percentage
25 for item in date:
26 rate.append((item/cpu_total)*100)
27
28 mean = ['%us','%ni','%sy','%id','%wa','%cpu_irq','%cpu_sIRQ']
29
30 #calculate cpu usage percentage
31 result = map(None,rate,mean)
32 return result
33
34if __name__ == '__main__':
35 hosts = ['192.168.30.111','192.168.30.112']
36 for host in hosts:
37 print '==========' + host + '=========='
38 result = getDate(host)
39 print 'Cpu(s)',
40 #print result
41 for i in range(5):
42 print ' %.2f%s' % (result[i][0],result[i][1]),
43 print
44 print
45
监控磁盘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 1#!/usr/bin/python
2import re
3import os
4def getAllitems(host,oid):
5 sn1 = os.popen('snmpwalk -v 2c -c public ' + host + ' ' + oid).read().split('\n')[:-1]
6 return sn1
7
8def getDate(source,newitem):
9 for item in source[5:]:
10 newitem.append(item.split(':')[3].strip())
11 return newitem
12
13def getRealDate(item1,item2,listname):
14 for i in range(len(item1)):
15 listname.append(int(item1[i])*int(item2[i])/1024)
16 return listname
17
18def caculateDiskUsedRate(host):
19 hrStorageDescr = getAllitems(host, 'HOST-RESOURCES-MIB::hrStorageDescr')
20 hrStorageUsed = getAllitems(host, 'HOST-RESOURCES-MIB::hrStorageUsed')
21 hrStorageSize = getAllitems(host, 'HOST-RESOURCES-MIB::hrStorageSize')
22 hrStorageAllocationUnits = getAllitems(host, 'HOST-RESOURCES-MIB::hrStorageAllocationUnits')
23
24 disk_list = []
25 hrsused = []
26 hrsize = []
27 hrsaunits = []
28
29 #get disk_list
30 for item in hrStorageDescr:
31 if re.search('/',item):
32 disk_list.append(item.split(':')[3])
33 #print disk_list
34
35 getDate(hrStorageUsed,hrsused)
36 getDate(hrStorageSize,hrsize)
37 #print getDate(hrStorageAllocationUnits,hrsaunits)
38
39 #get hrstorageAllocationUnits
40 for item in hrStorageAllocationUnits[5:]:
41 hrsaunits.append(item.split(':')[3].strip().split(' ')[0])
42 #caculate the result
43 #disk_used = hrStorageUsed * hrStorageAllocationUnits /1024 (KB)
44 disk_used = []
45 total_size = []
46 disk_used = getRealDate(hrsused,hrsaunits,disk_used)
47 total_size = getRealDate(hrsize,hrsaunits,total_size)
48
49 diskused_rate = []
50 for i in range(len(disk_used)):
51 diskused_rate.append(str(round((float(disk_used[i])/float(total_size[i])*100), 2)) + '%')
52
53 return diskused_rate,disk_list
54
55if __name__ == '__main__':
56 hosts = ['192.168.30.111','192.168.30.112']
57 for host in hosts:
58 result = caculateDiskUsedRate(host)
59 diskused_rate = result[0]
60 partition = result[1]
61 print "==========",host,'=========='
62 for i in range(len(diskused_rate)):
63 print '%-20s used: %s' % (partition[i],diskused_rate[i])
64 print
65
执行结果