RRDtool的基础教学
转自
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。 |