python下rrdtool模块的基本使用方法

最近需要用python根据收集到的数据进行绘图,决定使用rrd数据库,然后配合rrdtool来绘图,故学习一下rrdtool的用法。

用法如下:

创建:
create(…)
create(args..): set up a new round robin database
create filename [–start|-b start time] [–step|-s step] [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): return the timestamp of the first data sample in an rrd

last(…)
last(filename): return the timestamp of the last data sample in an rrd

查看rrd结构信息:
info(…)
info(filename): extract header information from an rrd

取出rrd的值:
fetch(…)
fetch(args..): fetch data from an rrd.
fetch filename cf [–resolution|-r resolution] [–start|-s start] [–end|-e end]
filename:要取出数据的rrd文件
–start:可选,默认是end-1day
–end:可选,默认是now
cf:average、max、min、last。前提是你的rrd中有该类型的rra才可以。

更新rrd数据:
update(…)
update(args..): store a new set of values into the rrd
update filename [–template|-t ds-name[:ds-name]…] n|timestamp:value[:value…] [timestamp:value[:value…] …]
filename:要更新的rrd文件
–template:
-t ds-name[:ds-name]:设置更新那个ds的数据
n|timestamp:时间戳,表示数据在哪个时间点采集的,n表示now。
value[:value…]:一个rrd文件可以有多个ds,所以一次update可以更新多个value。

update插入值后,并不会有返回,无法知道插入是否正常,可以用updatev

带返回值的插入:
updatev(…)
updatev is called in the same manner as update
和update类似,不过每次插入后会返回一个状态码。

画图:
graph(…)
graph(args..): create a graph based on data from one or several rrd
graph filename [-s|–start seconds] [-e|–end seconds] [-x|–x-grid x-axis grid and label] [-y|–y-grid y-axis grid and label] [–alt-y-grid] [–alt-y-mrtg] [–alt-autoscale] [–alt-autoscale-max] [–units-exponent] value [-v|–vertical-label text] [-w|–width pixels] [-h|–height pixels] [-i|–interlaced] [-f|–imginfo formatstring] [-a|–imgformat gif|png|gd] [-b|–background value] [-o|–overlay value] [-u|–unit value] [-z|–lazy] [-o|–logarithmic] [-u|–upper-limit value] [-l|–lower-limit value] [-g|–no-legend] [-r|–rigid] [–step value] [-b|–base value] [-c|–color colortag#rrggbb] [-t|–title title] [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-grid x-axis grid and label:
–y-grid y-axis grid and label:
–alt-y-grid
–alt-y-mrtg
–alt-autoscale
–alt-autoscale-max
–units-exponent
–vertical-label text y轴的文字说明
–width pixels x轴的大小
–height pixels y轴的大小
–interlaced
–imginfo formatstring
–imgformat gif|png|gd 图片格式
–background value
–overlay value
–unit value
–lazy
–logarithmic
–upper-limit value y轴数据值的上限,默认会自动调整y轴的数字
–lower-limit value y轴数据值的下限
–no-legend 取消图表下方的图例
–rigid 严格按照upper-limit/lower-limit来绘制
–step value
–base value 默认1k=1000 可以调整1k=1024
–color colortag#rrggbb
–title title 图表上方的标题
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
import rrdtool
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′)
if rrdb:
print rrdtool.error()
###rrd插入数据
#!/usr/bin/python
import time
import psutil
import rrdtool
for keys in psutil.network_io_counters(pernic=true):
if keys == ’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))
print up
###根据rrd绘图
#!/usr/bin/python
import rrdtool
rrdtool.graph(‘rest.png’,’–start’,’1369983960′,
‘–title’,’my rrd graph test’,
‘–vertical-label’,’bits’,
‘def:input=rest.rrd:input:last’,
‘def:output=rest.rrd:output:last’,
‘line1:input#0000ff:in traffic’,
‘line1:output#00ff00:out traffic\\r’,
‘cdef:bytes_in=input,8,*’,
‘cdef:bytes_out=output,8,*’,
‘comment:\\n’,
‘gprint:bytes_in:last:last in traffic\: %6.2lf %sbps’,
‘comment: ‘,
‘gprint:bytes_out:last:last out traffic\: %6.2lf %sbps’)

Posted in 未分类

发表评论