最近需要用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/pythonimport 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/pythonimport timeimport psutilimport 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/pythonimport 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')