Python下rrdtool模块的基本使用方法
最近需要用python根据收集到的数据进行绘图,决定使用rrd数据库,然后配合rrdtool来绘图,故学习一下rrdtool的用法。
用法如下:
创建:
create(...)
create(args..):SetupanewRoundRobinDatabase
createfilename[--start|-bstarttime][--step|-sstep][DS:ds-name:DST:heartbeat:min:max][RRA:CF:xff:steps:rows]
filename:是rrd的文件名,可以以rrd结尾。
--step:rrdtool期望每隔多长事件收到一个值,默认是5分钟。
--start:rrdtool第一个记录的起始时间,rrdtool不会接收任何数据的时间小于起始时间。例如你在update时给出的时间小于起始时间,则rrdtool会拒绝该值
DS:DS用于定义数据源,是用来存放结果的变量名。该变量名在画图时会用到。
DST:用来设置数据源的类型,有COUNTER、GUAGE、DERIVE、ABSOLUTE、COMPUTE等5种类型。
COUNTER:数值必须是递增的
DERIVE:和COUNTER类似,不过数据可递增可递减
ABSOLUTE:他每次假定前一个时间间隔的值是0,然后计算平均值
GAUGE:不做任何变化,直接存入rra中
COMPUTE:他不接收具体值,而是定义一个表达式,然后算出某个值
heartbeat:
min:
max:
RRA:rra指定数据如何存放,他可以保存不同时间间隔的数据。力图每5分钟产生一条数据,这样一小时就是12条,如果每30分钟一条数据,这样一小时就是两条数据,这样一天,一年下来会有很多条数据,但是rrd数据库的大小是固定的,所以就有一个合并数据的方式了。这就是rra的功能。合并方式由CF指定。
CF:CF就是用来设置数据合并的功能,有AVERAGE、MAX、MIN、LAST等4种类型,分别表示对PDP取平均、最大、最小、当前值。
xff:xff字段设置一个比例值,rrdtool会把多个PDP合并为一个CDP,如果这写PDP中有值为UNKNOW的PDP,那么CDP的值该怎么计算,xff就是设置一个比例,当PDP中UNKNOW的比例超过多少是,就无法合成正常的CPD,合成的CPD值也为UNKNOW。
steps:表示多少个PDP合成一个CDP
rows:表示总共存多少个CDP?也就是可以保存多少数据?
PDP:在每个规定的时间间隔内rrdtool都会收到一个值,rrdtool在收到该值后,根据DST的设置,会计算出另一个值,这个值就是PDP。
CDP:rrdtool使用多个PDP合并出一个CDP,也就是执行CF的后果,然后把这个CDP的值存入rra中。
查看第一次/最后一次数据更新时间:
first(...)
first(filename):ReturnthetimestampofthefirstdatasampleinanRRD
last(...)
last(filename):ReturnthetimestampofthelastdatasampleinanRRD
查看rrd结构信息:
info(...)
info(filename):extractheaderinformationfromanrrd
取出rrd的值:
fetch(...)
fetch(args..):fetchdatafromanrrd.
fetchfilenameCF[--resolution|-rresolution][--start|-sstart][--end|-eend]
filename:要取出数据的rrd文件
--start:可选,默认是end-1day
--end:可选,默认是now
CF:AVERAGE、MAX、MIN、LAST。前提是你的rrd中有该类型的rra才可以。
更新rrd数据:
update(...)
update(args..):Storeanewsetofvaluesintotherrd
updatefilename[--template|-tds-name[:ds-name]...]N|timestamp:value[:value...][timestamp:value[:value...]...]
filename:要更新的rrd文件
--template:
-tds-name[:ds-name]:设置更新那个DS的数据
N|timestamp:时间戳,表示数据在哪个时间点采集的,N表示now。
value[:value...]:一个rrd文件可以有多个DS,所以一次update可以更新多个value。
update插入值后,并不会有返回,无法知道插入是否正常,可以用updatev
带返回值的插入:
updatev(...)
updateviscalledinthesamemannerasupdate
和update类似,不过每次插入后会返回一个状态码。
画图:
graph(...)
graph(args..):CreateagraphbasedondatafromoneorseveralRRD
graphfilename[-s|--startseconds][-e|--endseconds][-x|--x-gridx-axisgridandlabel][-y|--y-gridy-axisgridandlabel][--alt-y-grid][--alt-y-mrtg][--alt-autoscale][--alt-autoscale-max][--units-exponent]value[-v|--vertical-labeltext][-w|--widthpixels][-h|--heightpixels][-i|--interlaced][-f|--imginfoformatstring][-a|--imgformatGIF|PNG|GD][-B|--backgroundvalue][-O|--overlayvalue][-U|--unitvalue][-z|--lazy][-o|--logarithmic][-u|--upper-limitvalue][-l|--lower-limitvalue][-g|--no-legend][-r|--rigid][--stepvalue][-b|--basevalue][-c|--colorCOLORTAG#rrggbb][-t|--titletitle][DEF:vname=rrd:ds-name:CF][CDEF:vname=rpn-expression][PRINT:vname:CF:format][GPRINT:vname:CF:format][COMMENT:text][HRULE:value#rrggbb[:legend]][VRULE:time#rrggbb[:legend]][LINE{1|2|3}:vname[#rrggbb[:legend]]][AREA:vname[#rrggbb[:legend]]][STACK:vname[#rrggbb[:legend]]]
filename:图片的名称,默认是PNG格式
--start:图片X轴数据的起始时间
--end:图片X轴数据的结束时间
--x-gridx-axisgridandlabel:
--y-gridy-axisgridandlabel:
--alt-y-grid
--alt-y-mrtg
--alt-autoscale
--alt-autoscale-max
--units-exponent
--vertical-labeltext Y轴的文字说明
--widthpixels X轴的大小
--heightpixels Y轴的大小
--interlaced
--imginfoformatstring
--imgformatGIF|PNG|GD 图片格式
--backgroundvalue
--overlayvalue
--unitvalue
--lazy
--logarithmic
--upper-limitvalue Y轴数据值的上限,默认会自动调整Y轴的数字
--lower-limitvalue Y轴数据值的下限
--no-legend 取消图表下方的图例
--rigid 严格按照upper-limit/lower-limit来绘制
--stepvalue
--basevalue 默认1K=1000可以调整1K=1024
--colorCOLORTAG#rrggbb
--titletitle 图表上方的标题
DEF:vname=rrd:ds-name:CF定义绘图用的数据源,也就是从那个RRD中取数据,因为RRA有多种类型,所以需要指定CF
CDEF:vname=rpn-expression 定义合并值,
PRINT:vname:CF:format
GPRINT:vname:CF:format 在图表的下方输出最大值、最小值之类
COMMENT:text 用来输出一些字符串
HRULE:value#rrggbb 在图表上绘制水平线
VRULE:time#rrggbb 在图表上绘制垂直线
LINE{1|2|3}:vname 使用线条来绘制vname的数据图
AREA:vname 使用方块来绘制vname的数据图
STACK:vname
下面附上一个例子:
###创建rrd #!/usr/bin/python importrrdtool rrdb=rrdtool.create('rest.rrd','--step','60','--start','1369982786', 'DS:input:GAUGE:120:U:U', 'DS:output:GAUGE:120:U:U', 'RRA:LAST:0.5:1:600', 'RRA:AVERAGE:0.5:5:600', 'RRA:MAX:0.5:5:600', 'RRA:MIN:0.5:5:600') ifrrdb: printrrdtool.error() ###rrd插入数据 #!/usr/bin/python importtime importpsutil importrrdtool forkeysinpsutil.network_io_counters(pernic=True): ifkeys=='em1': sent=psutil.network_io_counters(pernic=True)[keys][0] recv=psutil.network_io_counters(pernic=True)[keys][1] up=rrdtool.updatev('rest.rrd','N:%d:%d'%(sent,recv)) printup ###根据rrd绘图 #!/usr/bin/python importrrdtool rrdtool.graph('rest.png','--start','1369983960', '--title','myrrdgraphtest', '--vertical-label','bits', 'DEF:input=rest.rrd:input:LAST', 'DEF:output=rest.rrd:output:LAST', 'LINE1:input#0000FF:Intraffic', 'LINE1:output#00FF00:Outtraffic\\r', 'CDEF:bytes_in=input,8,*', 'CDEF:bytes_out=output,8,*', 'COMMENT:\\n', 'GPRINT:bytes_in:LAST:LASTintraffic\:%6.2lf%Sbps', 'COMMENT:', 'GPRINT:bytes_out:LAST:LASTouttraffic\:%6.2lf%Sbps')