"Hello World" for RRDtool

来源:百度文库 编辑:神马文学网 时间:2024/05/23 21:12:39
 "Hello World" for RRDtool收藏
新一篇: date 设置系统时间
by:ysuncn(欢迎转载,请注明原创信息)
RRDtool提供的文档对于一些朋友来说太专业了,本文来温习一下RRDtool的基础,顺便给个经典的例子,冒充“Hello World”吧:-)。基础很重要,否则后边的例子对于你不会很有意义。 RRDtool是指Round Robin Database tool,Round robin是这样一种技术:基于固定的容量,具有指向当前元素的指针。(简单说和环形队列差不多,不具体解释了)。这种数据库比较适合时间序列这类的数 据,你需要每隔一定时间提供一些值给数据库,它就可以工作了:-)。RRDtool 源于MRTG (Multi Router Traffic Grapher),后者最初是一个绘制大学流量图的脚本,后来被用到绘制诸如温度、速度、容量......你需要一个元件来测量数据,把数据提供给 RRDtool,RRDtool能帮你完成建数据库、存储数据、取数据、绘图以及显示到web浏览器上等工作。开始吧,来个Hello World!......
你在开车,12:05你看到计程器显示12345KM,12:10是12357KM,5分钟你开了12KM,这一段的速度是12000M/300S (40M/S),当然也可以用KM/H表示速度(144KM/H)。记住这仅仅是平均数据,希望看过这个例子,你可以举一反三,流量(bps—bits per second)应该不是问题。开始建个数据库:
rrdtool create test.rrd \
--start 920804400 \
DS:speed:COUNTER:600:U:U \
RRA:AVERAGE:0.5:1:24 \
RRA:AVERAGE:0.5:6:10
建了什么?一个名为test.rrd的RRD数据库,起始时间是1999/03/07 12:00:00 转化成距1970/01/01的秒数为920804400(诸多系统的计时方式,date -d "1999/03/07 12:00:00"+%s 中国时间,有时差),数据库里保存了名为speed的数据源(变量),它代表一个计数器,每300秒被读取一次(默认值 可以用--step设置),数据库中建了两个RRA档案:第一个每读到的一个数据(5分钟)取平均(:-()存档,保留24笔(2小时,再来数据就用环形 队列的算法覆盖了);第二个每读6个数据(半小时)取平均存档,保留10笔(5小时)。
下边往数据库填入如下数据:
12:05  12345 KM
12:10  12357 KM
12:15  12363 KM
12:20  12363 KM
12:25  12363 KM
12:30  12373 KM
12:35  12383 KM
12:40  12393 KM
12:45  12399 KM
12:50  12405 KM
12:55  12411 KM
13:00  12415 KM
13:05  12420 KM
13:10  12422 KM
13:15  12423 KM
代码如下:
rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363
rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373
rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399
rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415
rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423
看看我们的成果:
rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200
speed
920804700: nan
920805000: 4.0000000000e-02
920805300: 2.0000000000e-02
920805600: 0.0000000000e+00
920805900: 0.0000000000e+00
920806200: 3.3333333333e-02
920806500: 3.3333333333e-02
920806800: 3.3333333333e-02
920807100: 2.0000000000e-02
920807400: 2.0000000000e-02
920807700: 2.0000000000e-02
920808000: 1.3333333333e-02
920808300: 1.6666666667e-02
920808600: 6.6666666667e-03
920808900: 3.3333333333e-03
920809200: nan
开始画图speed.png:
rrdtool graph speed.png \
--start 920804400 --end 920808000 \
DEF:myspeed=test.rrd:speed:AVERAGE \
LINE2:myspeed#FF0000
图片名——speed.png;开始时间——12:00;结束时间——13:00。后边的复杂点:定义变量myspeed(从test.rrd数据库的speed档案取数据),用2象素的红线绘制myspeed,出图:

图1  speed.png
再来一个speed2.png(加了数学计算):
rrdtool graph speed2.png \
--start 920804400 --end 920808000 \
--vertical-label m/s \
DEF:myspeed=test.rrd:speed:AVERAGE \
CDEF:realspeed=myspeed,1000,\* \
LINE2:realspeed#FF0000
有疑问的估计就在“myspeed,1000,\*”,这里是逆波兰式“myspeed,1000,*”,就是“myspeed*1000”,学过编译的都知道,不懂google一下吧,那个“\”是为了防止系统赋予“*”新的意义。不解释了,出图:


图2  speed2.png
第三个speed3.png(本质还是逆波兰,把逻辑判断和IF加进来了):
rrdtool graph speed3.png \
--start 920804400 --end 920808000 \
--vertical-label km/h \
DEF:myspeed=test.rrd:speed:AVERAGE \
"CDEF:kmh=myspeed,3600,*" \
CDEF:fast=kmh,100,GT,kmh,0,IF \
CDEF:good=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"Maximum allowed" \
AREA:good#00FF00:"Good speed" \
AREA:fast#FF0000:"Too fast"
防止*被转移的另一种方式:在命令中用双引号——“*”,解释一个“kmh,100,GT,kmh,0,IF”:
Check if kmh is greater than 100    ( kmh,100 ) GT
If so, return kmh, else return 0    ((( kmh,100) GT ), kmh, 0) IF
出图:


图3  speed3.png
最后一个speed4.png(有了数据,RRDtool什么都能做):
rrdtool graph speed4.png \
--start 920804400 --end 920808000 \
--vertical-label km/h \
DEF:myspeed=test.rrd:speed:AVERAGE \
"CDEF:kmh=myspeed,3600,*" \
CDEF:fast=kmh,100,GT,100,0,IF \
CDEF:over=kmh,100,GT,kmh,100,-,0,IF \
CDEF:good=kmh,100,GT,0,kmh,IF \
HRULE:100#0000FF:"Maximum allowed" \
AREA:good#00FF00:"Good speed" \
AREA:fast#550000:"Too fast" \
STACK:over#FF0000:"Over speed"
出图:

图4  speed4.png
ps:文章主要借鉴RRDtutorial。