|
|

楼主 |
发表于 2006-3-21 17:51:49
|
显示全部楼层
写了一个 python 程序,直接调用 sar 和 gnuplot,用 sarplot.py -h 查看 usage
- #!/usr/bin/python
- # -*- encoding: UTF-8 -*-
- # 0.0.1 基本任务,数据的读取和转化,数据文件和 gnuplot 指令文件的生成
- # 0.0.2 参数化
- import os
- import sys
- import re
- import getopt
- import time
- class resource:
- def __init__(self, name, marks):
- if not name or not marks:
- # 如果没有指标,则统计这个资源是无意义的
- print 'No resource name or marks given.'
- sys.exit(4)
- # return None???
- self.name = name
- self.index = {}
- i = 1
- for m in marks: self.index[m] = i; i += 1
- self.datas = []
- self.ts = 0
- self.idx = -1 # == len(self.datas) - 1
- self.lines = []
- def putdata(self, timestamp, mark, value):
- ts = int(timestamp)
- if self.ts < ts:
- # self.datas[self.idx] = [ '' for n in range(len(self.index) + 1) ]
- self.datas.append([ '' for n in range(len(self.index) + 1) ])
- self.idx += 1
- self.datas[self.idx][0] = timestamp
- self.ts = ts
- i = self.index[mark]
- self.datas[self.idx][i] = value
- def convert(self):
- if self.lines:
- print 'Have been converted.'
- sys.exit(3)
- for items in self.datas:
- str = ''
- for item in items: str = str + item + '\t'
- self.lines.append(str + '\n')
- class sarplot:
- def __init__(self, optmap):
- # 设置默认行为
- self.saropt = {
- 'cpu' : '-u',
- 'mem' : '-r'
- }
- self.rslist = ['cpu', 'mem']
- self.rss = {
- 'cpu' : resource('cpu', ['%user', '%system', '%iowait']),
- 'mem' : resource('mem', ['%memused', '%swpused'])
- }
- self.gpdir = '/tmp/gnuplot'
- self.gpterm = 'x11'
- self.gpx11d = '127.0.0.1:0'
- today = time.strftime('%d', time.localtime())
- self.bindata = '/var/log/sa/sa%s' % today
- if optmap:
- try:
- self.rslist = optmap.get('rslist', self.rslist)
- self.bindata = optmap.get('bindata', self.bindata)
- for rs in self.rslist:
- self.rss['%s' % rs] = resource('%s' % rs, optmap.get('%s.mark' % rs))
- self.gpdir = optmap.get('gpdir', self.gpdir)
- self.gpterm = optmap.get('gpterm', self.gpterm)
- self.gpx11d = optmap.get('gpx11d', self.gpx11d)
- except KeyError:
- # ignore
- print 'ignore'
- ##---------------------------------------------------------------------
- self.sar = 'sadf -pt --' # maybe 'sar -ht' for old version
- if not os.path.isdir(self.gpdir): os.makedirs(self.gpdir)
- self.gpfile = '%s/sarplot.gp' % self.gpdir
- self.gnuplot = 'set terminal %s\nplot ' % self.gpterm
- def compute(self):
- for rs in self.rslist:
- rso = self.rss[rs]
- opt = self.saropt[rs]
- try:
- report = os.popen('%s %s %s' % (self.sar, opt, self.bindata), 'r')
- self._compute1(report, rso)
- # rso.convert()
- datafile = open('%s/%s.dat' % (self.gpdir, rs), 'w')
- datafile.writelines(rso.lines)
- datafile.close()
- for mark in rso.index.keys():
- column = rso.index[mark] + 1
- self.gnuplot = self.gnuplot + "'%s/%s.dat' using %s with lines title '%s.%s',\\\n" \
- % (self.gpdir, rs, column, rs, mark)
- except IOError, (errno, strerror):
- print 'IOError: %s, %s' % (errno, strerror)
- sys.exit(2)
- except AttributeError, (errno, strerror):
- print 'AttributeError: %s, %s' % (errno, strerror)
- if not rso: print '%s has NONE resource object.' % rs
- sys.exit(4)
- try:
- self.gnuplot = re.sub(',\\\\\n$', '', self.gnuplot)
- open(self.gpfile, 'w').write(self.gnuplot)
- except IOError, (errno, strerror):
- print 'IOError: %s, %s' % (errno, strerror)
- sys.exit(2)
- def _compute1(self, report, rso):
- for line in report:
- line = line.strip('\n')
- items = re.split('\s+', line)
- # print items
- try:
- if items[4] in rso.index.keys(): rso.putdata(items[2], items[4], items[5])
- else: continue
- except IndexError: # list index out of range
- continue # 丢弃坏数据
- rso.convert()
- def report(self):
- if self.gpterm == 'x11':
- os.environ['DISPLAY'] = self.gpx11d
- os.execlpe('gnuplot', '-persist', self.gpfile, os.environ)
- ##-----------------------------------------------------------------------------
- def usage():
- print """usage: sarplot [OPTIONS]
- -d $gnuplot_dir
- -f $bindata
- -h, help
- -m $mark [-m $mark2 ...]
- -m cpu:%user,%system,%iowait -m mem:%memused,%swpused
- -o $output, gnuplot terminal type
- -x $display, DISPLAY environment for gnuplot x11 terminal"""
- if __name__ == '__main__':
- ### 参数分析
- try:
- opts, args = getopt.getopt(sys.argv[1:], "d:f:hm:o:x:")
- except getopt.GetoptError, (errno, strerror):
- print 'GetoptError: %s, %s' % (errno, strerror)
- usage()
- sys.exit(1)
- optmap = {}
- rslist = []
- for o, v in opts:
- if o == '-d':
- optmap['gpdir'] = v
- if o == '-f':
- optmap['bindata'] = v
- if o == '-h':
- usage()
- sys.exit(0)
- if o == '-m':
- rsname = v.split(':')[0]
- rslist.append(rsname)
- optmap['rslist'] = rslist
- rsmark = v.split(':')[1].split(',')
- optmap['%s.mark' % rsname] = rsmark
- if o == '-o':
- optmap['gpterm'] = v
- if o == '-x':
- optmap['gpx11d'] = v
- spi = sarplot(optmap)
- spi.compute()
- spi.report()
复制代码
比如:./sarplot.py -x '192.168.126.2:0' -m 'cpu:%user,%system,%iowait' -f /tmp/sar20060321
当然要先运行:
sar -ru $interval $count -o /tmp/sar20060321
先监测一段时间,然后再运行上面的 python 脚本,直接得到 gnuplot 的指令文件并输出。 |
|