前段时间写多主机性能指标监控工具res-monitor时有提到它,这里就专门对它做个介绍吧。
像res-monitor这类工具,既要实时获取数据,又要实时图形化展示数据,常规的是把采集的数据存放到数据库,然后再读数据库数据画图展示,然而,当我遇到rrdtool的时候,眼前一亮,很特别,它一方面可以把数据存储起来,扮演数据库的角色;另一方面又能根据存储的数据绘图,而且图形表达能力很强,如线状图、饼状图、柱状图、区域面积图等;支持高性能的数据存储、绘图,很方便集成在各种脚本中。从github的修改记录来看,它从2012年发布至今,一直在维护和更新着,可见其生命力。
Rrdtool很强大,完成数据存储和实时展示绘图等工作,只需要掌握3个命令,但这三个命令的参数相当多,使用起来有点复杂,另外,需要注意的是,它主要应用在linux平台,在windows上只能用Cygwin打包版本的,而且有些,需要绕过去。
本文不打算详细介绍rrdtool的原理,因为这块可以看官方文档,主要是说明如何使用它,并给出一些应用参考。
Rrdtool网址: https://oss.oetiker.ch/rrdtool/index.en.html
Rrdtool是环形数据库工具,存储和读取的是环形数据库,表现是后缀为.rrd的二进制文件。要大概理解啥是环形数据库,我对它的理解就是把它想象成圆形的时钟,随着时间推移,不断往里写数据,同时有个标记指向当前数据记录的最新位置,就像时钟上的指针指示当前时间一样。又因为它是圆形的,无始无终,可以一直往里写数据,只是历史数据会被覆盖掉,所以,有时它又被叫做时序结构数据库。
以下仅列出rrdtool的三个常用命令create、update、graph,看到这些命令格式,大概你就感觉到这工具使用的复杂性了。
Create命令格式:
rrdtool create filename [--start|-b start time] [--step|-s step] [--template|-t template-file] [--source|-r source-file] [--no-overwrite|-O] [--daemon|-d address] [DS:ds-name[=mapped-ds-name[[source-index]]]:DST:dst arguments] [RRA:CF:cf arguments]
Update命令格式:
rrdtool {update | updatev} filename [--template|-t ds-name[:ds-name]...] [--skip-past-updates|-s] [--daemon|-d address] [--] N:value[:value]... timestamp:value[:value]... at-timestamp@value[:value]...
Graph命令格式:
rrdtool graph|graphv filename [option ...] [data definition ...] [data calculation ...] [variable definition ...] [graph element ...] [print element ...]
针对各个参数的说明实在太多,不在此列出,建议直接看官方文档https://oss.oetiker.ch/rrdtool/doc/rrdtool.en.html,该部分:
命令格式太复杂,但是,只要搞定上面三个命令,以后用起来就轻松了,直接套用格式就行,如下是res-monitor监控带宽使用的命令配置实例,应用在python代码里,仅供参考哦。
1) 使用create命令创建rrd数据库文件
rrdtool_create = ('{bin_file} create {rrd_file} -s {interval} '
'DS:recvAvg:GAUGE:300:0:U '
'DS:sendAvg:GAUGE:300:0:U '
'RRA:AVERAGE:0.5:1:600 ')
命令说明:
Create命令创建rrd数据库,设置间隔为5s,定义里个数据源(DS),且数据源类型是保留原始值(GAUGE),数据接收的最大时间跨度是5分钟,否则设置U(unknown),指定按每个数据取平均值(AVERAGE)的方式归档存放数据;
2) 使用update命令更新rrd数据库
rrdtool_update = '{bin_file} update {rrd_file} N:'
命令说明:
Update命令向rrd数据库写数据,注意N:后面的数据组数和create指定的数据源对应,上面create是2个数据源,update的数据也只能是2组。可以理解成多行2列的表,每列对应create指定的数据源,update就是一行行往里面填数据。
3) 使用graph命令读取rrd数据库并绘制
rrdtool_graph = ('{bin_file} graph {rrd_graph} '
'--start now-1800s '
'--vertical-label "NET Utilization" '
'--units-exponent 0 '
'--alt-autoscale-max '
'--lower-limit 0 '
'--title "NET/TOTAL:recv/send(MB/s)" '
'--font TITLE:10: Roman.ttf --font AXIS:10: Roman.ttf –font UNIT:10: Roman.ttf --font LEGEND:10: Roman.ttf '
'DEF:recvAvgFlow={rrd_relative_file}:recvAvg:AVERAGE '
'LINE1:recvAvgFlow#e60000:"recv(MB/s)" '
'GPRINT:recvAvgFlow:AVERAGE:"AVERAGE\:%3.1lf" '
'GPRINT:recvAvgFlow:MIN:"MIN\:%3.1lf" '
'GPRINT:recvAvgFlow:MAX:"MAX\:%3.1lf\\n" '
'DEF:sendAvgFlow={rrd_relative_file}:sendAvg:AVERAGE '
'LINE1:sendAvgFlow#32cd32:"send(MB/s)" '
'GPRINT:sendAvgFlow:AVERAGE:"AVERAGE\:%3.1lf" '
'GPRINT:sendAvgFlow:MIN:"MIN\:%3.1lf" '
'GPRINT:sendAvgFlow:MAX:"MAX\:%3.1lf\\n" '
)
命令说明:
Graph命令相当复杂,但表现里很强,上面参数指定图标显示的时间跨度,纵横坐标标题,图表是否自动缩放,线条颜色,每个线条对应从哪里取数据,且显示MIN\MAX\AVERAGE图例说明等等。
注意:
命令中的变量需要根据自己的实际情况替换,自己开发的程序里需要执行周期性的数据采集操作获得数据,然后使用update操作将数据写入rrdtool。按上述命令格式配置,最后的效果如下:
坑1:
Rrdtool主要被设计应用在linux平台的,命令参数的分割符就是“:”,但在windows平台,冒号是盘符标志,所以,实际应用中需要做转义或者传入相对路径;
坑2:
Windows使用Cygwin打包版本的rrdtool,可能会报字体文件缺失,注意下载默认的指定文件并指定。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。