使用RRDTOOL进行绘图
https://www.cnblogs.com/FRESHMANS/p/8427737.html
https://blog.liuts.com/post/215/
https://www.cnblogs.com/jin-xin/p/6774828.html
如果您不熟悉RRDTOOL,可以先参看前面的RRDTOOL入门,简单来说,RRDTOOL不仅仅是数据库工具,它还是一种强大的前端绘图工具,可以直接根据所存的数据绘出复杂的图形。其绘图主要使用graph命令来操作;
一、graph [语法]
rrdtool graph filename [option ...][data definition ...][data calculation ...][variable definition ...][graph element ...][print element ...]
二、graph [option …]
// 格式[-a|--imgformat PNG] # 输出图片格式[-W|--watermark string] # 水印// Time range[-s|--start time] # 启始时间[-e|--end time] # 结束时间[-S|--step seconds] # 解析度// Labels[-t|--title string] # 图片的标题[-v|--vertical-label string] # Y轴标签// Size[-w|--width pixels] # 显示区的宽度(像素)[-h|--height pixels] # 显示区的高度(像素)[-j|--only-graph] # 只绘制图像(绘制成预览图)[-D|--full-size-mode] # 图片能自动缩放// Limit[-u|--upper-limit value] # Y轴最大值[-l|--lower-limit value] # Y轴最小值[-r|--rigid] # 固定Y轴的值,不进行缩放 (指定好y轴的上下限值后就不再自动缩放)[-A|--alt-autoscale] # 即使指定好Y轴的上下限后依然可缩放,但不能超过上下限值[-J|--alt-autoscale-min] # 只自动缩放最小值[-M|--alt-autoscale-max] # 只自动缩放最大值[-N|--no-gridfit] # 不显示网格线// 字体和颜色[-n|--font FONTTAG:size:font] # 自定义字体库,指定路径[-c|--color COLORTAG#rrggbb[aa]] # 指定相关颜色,COLORTAG(BACK/CANVAS/SHADEA/SHADEB/GRID/FONT/AXIS/FRAME/ARROW)// 指定X坐标的格式[-x|--x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM][-x|--x-grid none]# 举例:--x-grid MINUTE:10:HOUR:1:HOUR:4:0:%X# 每10分钟显示一个基准网格线,每1个小时显示一个主网格线,每4个小时显示一个x轴上的标签, “0:%X”表示显示标签的格式;--x-grid MINUTE:30:HOUR:4:HOUR:4:0:%H:%M# 每30分钟显示一条次线,每4小时一条主线,4小时一个标签标于主线下方,格式为“小时:分钟”// 指定Y坐标的格式[-y|--y-grid grid step:label factor][-y|--y-grid none]
1,图片格式
其中 filename 就是你想要生成的图片文件的名称,默认是 png ,你可以通过选项修改图片的类型,可以有 PNG、SVG、EPS、PDF四种;
这里说的图表大小而不是图片大小,是因为 –w ,-h 控制的是 X/Y 轴共同围起来的那部分大小,而不是整个图片的大小,这点在前面就可以看出了;
默认的图表大小是 400 (长)x 100 (高),但一般会返回497x179 这样的数字,这个才是图片的大小;
# 图片格式[-a|--imgformat PNG]# 图片大小[-w|--width pixels] [-h|--height pixels]
2,时间控制
[-s|--start time] [-e|--end time] [-S|--step seconds]
既然要绘图,就应该有一个起始/结束的时间,Graph 操作中有 –s ,-e选项,这两个选项即可以用于控制图表的 X 轴显示的时间范围,也可以用于控制RRDtool从RRA中提取对应时间的数据;
- 如果没有指定–-end ,默认为now;如果没有指定–-start,则默认为1天前;
- 如果两者都没有指定,则图表默认显示从当前算起1天内的;
在DEF中,也有:start,:end,:step,这些和—start,—end,—step之间有什么关系?
- 先看看:step和—step之间的关系:
- 以eth0.rrd为例,假设要绘制时间范围为range=[end-start]
- A)如果0< range < 180000 (第一个RRA的时间覆盖范围),则默认从第1个RRA中提取数据;
- 如果DEF中给出的:step>300,例如1000,则从resolution=1000的或者第一个高于1000的RRA中提取数据,由于eth0.rrd中没有resolution=1000的RRA,则RRDTool会从resolution=1200的第二个RRA中提取数据;
- 如果DEF中给出的:step<=300,例如200,则RRDtool会忽略该设定,还是从第一个RRA中提取数据;
- B)如果 180000 < range < 720000 ,由于第一个RRA只能保存2天的数据,所以默认从第2个RRA中取数据 :
- 如果 DEF 中给出的 :step>1200 ,例如1800,则RRDtool会从 resolution = 7200的第3 RRA 中取数据;
- 如果 DEF 中给出的 :step<=1200,例如300 ,则RRDtool会忽略,还是从第2个RRA中取数据;
- C)如果 720000 < range < 4320000 ,则默认从第三个 RRA 中取数据 :
- 如果 DEF 中给出的 :step>7200 ,例如10000 ,则从第4个 RRA中取数据;
- 如果 DEF 中给出的 :step<=7200 ,例如1200 ,则忽略该值,并还是从第3 个RRA中取数据;
- D)如果 4320000 < range < 63072000 ,则默认从第4个 RRA 中取数据 :
- 如果 DEF 中给出的 :step > 86400 ,则行为未知;
- 如果 DEF 中给出的 :step <=86400 ,则从第4个 RRA 中取数据;
- E)-S 选项可以直接控制 RRDtool 挑选 RRA:
- 例如 -S 1200 ,即使DEF 中不加 :setp ,则 RRDtool 会从第2个 RRA 中取数据,即使 rang < 180000;
- 如果 -S 和 :step 同时出现,则 :step 优先;
- F)DEF 中的 :start 和 :end 可以覆盖 –-start 和 –-end 的值:
- 默认情况下,如果 DEF 中不加 :start 和 :end ,则等于 –-start 和 –end;
- 如果 DEF 中定义了 :start 和 :end ,则以 :start 和 :end 为准。
实例1 :使用–-start指定 X 轴的起始时间
```toml [root@dns1 bob]# rrdtool graph 1.png /—start now-120000 / # 表示起始时间是当前时间往前120000秒,也就是33个小时左右 DEF:value1=eth0.rrd:eth0_in:AVERAGE / # 从eth0.rrd 中取出 eth0_in的数据,CF类型为AVERAGE AREA:value1#00ff00:in # 用“方块”的形式来绘制value1 ,注意这里是用 value1 ,不是用 eth0_in 475x168 # 如果RRDtool有绘图方面的语句,则这里显示图片大小,否则为0x0。
[root@dns1 bob]#
<a name="URfnC"></a>#### **实例2 :使用:step从第2个RRA中取数据**这里是 :step=1000,但RRDtool会取 :step=1200的第2个RRA的数据来绘图,可以和上面的1.png 比较,发现比较平滑;```toml[root@dns1 bob]# rrdtool graph 2.png \> --start now-120000 \> DEF:value1=eth0.rrd:eth0_in:AVERAGE:step=1000 \ # :step 指定 resolution=1000> AREA:value1#ff0000481x154[root@dns1 bob]#
实例3 :使用–S从第2个RRA中取数据
可以看到和上面的图一样,说明 RRDtool 的确按照 -S 的设置从第2个RRA 中取数据了
使用 –S 可以对 DEF 中所有的 DS 都使用相同的 resolution,等于在每个 DEF后都加上 :step=
[root@dns1 bob]# rrdtool graph 4.png> -S 1200 \ # 使用–S控制RRDtool从resolution=1200的RRA中取数据> --start now-120000 \> DEF:value1=eth0.rrd:eth0_in:AVERAGE \> AREA:value1#ff0000481x154[root@dns1 bob]#
实例4 :同时使用–S和:step
可以看到 5.png 和 1.png 是一样的,也就是说 –S 1200 并没有起作用,而是 :step=300 起作用了
[root@dns1 bob]# rrdtool graph 5.png> -S 1200 \ # -S 指定 resolution=1200> --start now-120000 \> DEF:value1=eth0.rrd:eth0_in:AVERAGE:step=300 \ # :step 指定 resolution=300> AREA:value1#ff0000481x154[root@dns1 bob]#
实例5 :使用:start和:end只显示指定时间内的数据
[root@dns1 bob]# rrdtool graph 1.png \> --start now-1h \ # X 轴显示1个小时的长度> DEF:value1=eth0.rrd:eth0_in:AVERAGE:start=now-600:end=now-300 \ # 但只取10分钟前到5分钟前的这部分> AREA:value1#00ff00:in475x168[root@dns1 bob]#

如果不加 :start 和 :end ,则效果如下 :
我们甚至可以让两个对象显示不同的时间,例如:
实例6 :让两个对象显示不同时间段的数据
[root@dns1 bob]# rrdtool graph 1.png \> --start now-2h \ # 规定时间为2小时内> DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h \ # 规定时间为1小时内> DEF:value2=eth0.rrd:eth0_out:AVERAGE \ # 没有指定:start和:end,默认和–-start一样,也是2小时> AREA:value1#00ff00:in \> LINE2:value2#ff0000:out:STACK475x168[root@dns1 bob]#
实例7 :把一段时间分为几段分别显示 :
[root@dns1 bob]# rrdtool graph 1.png \> DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=end-1h \ # 当前1小时内> DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1h:start=now-2h \ # 2小时前> DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2h:start=now-3h \ # 3小时前> LINE1:value1#00ff00:"1 hours ago" \> LINE2:value2#ff0000:"2 hours ago" \> LINE3:value3#000000:"3 hours ago"475x168[root@dns1 bob]

把3个小时内的数据用三种不同粗细、不同颜色的曲线画了出来:
- out部分(红色)显示了2个小时内的流量,而in部分(绿色)则只显示了1个小时内的部分;
- 在这里要提一点,虽然我们指定了–-start或者–-end ,或者 :start , :end,但并不意味着曲线就一定会从指定的时间点开始和结束。
- 例如我们上面指定了 :start=now-600:end=now-300 ,也就是只显示5分钟的数据;
- 但图表出来的效果却是10(10:05-10:15)分钟的数据,这是因为我们挑选的时间当中“不慎”横垮了两个周期 (10:05-10:10,10:10-10:15);
- 所以 RRDtool 会把它们全部画出来,而不是只画其中的5分钟。
3,文字说明
-t 是用于图表上方的标题,-v 是用于 Y 轴的说明文字 ```toml [-t|—title string] [-v|—vertical-label string]
例如
-t “这是一个测试的图形” # X轴标题
-v “Bytes/s” # Y轴标题
<a name="qECAE"></a>#### **实例1 :给图表增加标题**```toml[root@dns1 bob]# rrdtool graph 1.png \> --start now-183600 \ # 从当前开始往前51个小时> -t "51 hours ago" -v "Traffic" \ # 标题是 “51 hours ago”,Y 轴的说明文字是 “Traffic”> DEF:value1=eth0.rrd:eth0_in:AVERAGE \> DEF:value2=eth0.rrd:eth0_out:AVERAGE \> LINE1:value1#0000ff:in \ # 注释 :以1个像素宽的曲线画出 value1,颜色是蓝色,图例的说明文字是“in”> LINE2:value2#ff0000:out # 注释 :以2个像素宽的曲线画出 value2,颜色是红色,图例的说明文字是 “out”497x179[root@dns1 bob]#

现在我们用的是 LINE 的方式来绘图,LINE 可以有3种,分别是 LINE1|2|3,也就是线条的粗细,还有一种是 STACK 方式下面再介绍。
可以看到流入的流量比流出的流量稍大,这样看的话,out流量比较难看,是否可以有别的方式呢?
RRDtool 还提供了另外一种格式,就是STACK,意思就是在前一个对象的基础(把前一个对象的值当成 X 轴)上绘图,而不是从X轴开始
实例2 :使用STACK方式绘图
[root@dns1 bob]# rrdtool graph 3.png \> --start now-120000 \> -t "33 hours ago" \> -v "Traffic" \> DEF:value1=eth0.rrd:eth0_in:AVERAGE \> DEF:value2=eth0.rrd:eth0_out:AVERAGE \> AREA:value1#00ff00:in \> LINE:value2#ff0000:out:STACK # 注意最后的 “STACK” ,表示在 value1 的基础上绘图497x179[root@dns1 bob]#

这是没有采用 STACK 方式绘图的效果 :
可以看得出上面采用 STACK 方式的比较清晰;
但要注意,采用STACK方式后,在读取out流量时,Y 轴的刻度不再是out的值,应该用刻度值减去in的值,才是out真正的值,这点比较麻烦。
需要配合 GPRINT 语句才能达到一定的效果;
4,Y 轴上下限(Limits)
默认情况下,RRDtool会自动调整Y轴的数字,来配合当前的数值大小;
如果想要禁止该特性,可以通过–upper-limit和–lower-limit来做限制,表示Y轴显示的值从多少到多少;
如果没有指定–rigid ,则在图表的上下边界处还是会有一些延伸,但如果指定了-–rigid ,则严格按照–-upper-limit和–-lower-limit绘制;
在使用–lower-limit时要注意,如果数据中有负数,如果-–lower-limit为 0,则负数部分是显示不出来的;
[-u|--upper-limit value] [-l|--lower-limit value] [-r|--rigid]
实例:使用–-upper-limit和–-lower-limit限制Y轴的上下限
[root@dns1 bob]# rrdtool graph 1.png \> --start now-120000 \> -v "Traffic" -t "33 Hours ago" \> --lower-limit -5000 \ # 限制Y轴下限为 -5000> --upper-limit 10000 \ # 上限为 10000> --rigid \ # 严格按照上面的规定来画> DEF:value1=eth0.rrd:eth0_in:AVERAGE \> DEF:value2=eth0.rrd:eth0_out:AVERAGE \> AREA:value1#00ff00:in \> LINE1:value2#ff0000:out:STACK497x179[root@dns1 bob]#
5,X/Y轴刻度(Grid)
[-x|--x-grid GTM:GST:MTM:MST:LTM:LST:LPR:LFM][-x|--x-grid none][-y|--y-grid grid step:label factor][-y|--y-grid none][-Y|--alt-y-grid][-X|--units-exponent value]# 重点解释: "--x-grid","MINUTE:12:HOUR:1:HOUR:1:0:%H"参数的作用(从左往右进行分解)"MINUTE:12" # 表示控制每隔12分钟放置一根次要格线"HOUR:1" # 表示控制每隔1小时放置一根主要格线"HOUR:1" # 表示控制1个小时输出一个label标签"0:%H" # 0表示数字对齐格线,%H表示标签以小时显示"""--x-grid MINUTE:30:HOUR:4:HOUR:4:0:%H:%M /# 每30分钟一条线,每4小时一条主线,4小时一个标签标于主线下方,标签格式“小时:分钟”"""
RRDtool 中设置X轴的刻度比较复杂,如果没有必要,可以交给RRDtool自动去处理。
例如上面的图,33小时的情况下,X轴只有2个值,显得很不足,这时候有两种方法 :
A)一是使用 –w 增大图表的宽度,这样 RRDtool 会自动加多一些刻度上去:
B) 二是通过上面的选项自己设置 X/Y 轴的刻度如何显示,首先看上图,在垂直的线中,红色的线称为Major Grid(主要网格线),灰色的线称为Base Grid (次要网格线)(这里是借用EXCEL中的概念),X 轴下面的时间文字成为Label;
C)有两种方法可以快速去掉X/Y轴的刻度,就是–-x-grid none和–-y-grid none;
D)GTM:GST:控制次要格网线的位置,GTM是一个时间单位,可以是SECOND、MINUTE、HOUR、DAY 、WEEK、MONTH、YEAR;
- GST则是一个数字,控制每隔多长时间放置一根次要格线,例如我们要画一个1天的图表,决定每15分钟一根次要网格线,则格式为 MINUTE:15;
E)MTM:MST:控制主要网格线的位置,MTM 同样是时间单位,MST 是一个数字,接上面的例子,决定一个小时1根主要网格线,则格式为 HOUR:1;
- LTM:LST :控制每隔多长时间输出一个label 。决定为1小时1个 label 。则格式为 HOUR:1;
G)LPR:LFM :LTM:LST 只是决定了 label 的显示位置了,没有指定要显示什么内容,LPR指的是如何放置label,如果LPR 为0,则数字对齐格线;(适用于显示时间),如果不为0,则会做一些偏移(适用于显示星期几、月份等),至于LFM 则需要熟悉一下 date 命令的参数,常用的有 %a(星期几)、%b(月份)、%d(天)、%H(小时)、%M(分)、%Y(年),我们决定显示小时和分,所以用 %H%M;
H)综合起来,X 轴的刻度定义就是 –-x-grid MINUTE:15:HOUR:1:HOUR:1:0:’%H:%M’,最好把 %H:%M 括起来;
I)建议 MST是 GST 的2-6倍,MST和LST 相同,这样画出来的图比较美观一些;
这明显就是图片太小了,不够显示。把上面的 :%M 去掉就可以了,只显示小时,不显示分钟
如果把图片放大一点就更好了 (-w 800)
所以在设置 X 轴的刻度时,要记得不要显示太多东西,否则需要增大图片的大小
J)Y 轴刻度的设置又不一样了
- grid step :用于控制Y轴每隔多少显示一根水平线
- label factor :默认为1,也就是在每根水平线的高度那里显示一个值
- 例如下面就是一个例子 (每隔800显示一根水平线)

K)Y 轴还有一个很方便的选项就是 –Y ,它可以最大限度的优化 Y 轴的刻度,建议每次绘图都加上去。
L)Y 轴另外一个有用的选项就是 –X (虽然选项名是 -X ,但确实是用来设置 Y 轴刻度值的),在上面的图我们看到 RRDtool 自动对 Y 轴的值进行调整,以 k 为单位显示。但如果你不想以 k 显示,而是想固定以某个单位来显示(M,b)该怎么办呢?这就要用到 –X 选项了,-X 后面跟一个参数,参数值范围是 -18、-15、-12、-9、-6 、-3、0、3、6、9、12、15、18 。0 表示以原值显示,3 表示数值除以1000,也就是以 k 为单位显示,6 就是以M显示,9就是以G显示,如果你给出1或者2,则 RRDtool 也可以接受,但会被“静悄悄”的改为0。下面就是一个以原值(-X 0)显示的例子:
三、graph之[data definition …]
data and variables用于获取画图的数据,格式如下:
// 从数据库获取数据的的数据定义格式"DEF:vname=rrdfile:ds-name:CF[:step=step][:start=time][:end=time][:reduce=CF]"# DEF:这是关键字# vname:自定义一个变量名,保存rrd某个数据源取得的数据# rrdfile:指定rrd数据库文件的路径# ds-name:指定想获取数据源中的在create中定义的DS名称# CF:定义以哪种聚合函数取出数据(哪个RRA)// 选择画线条图的格式LINE[width]:value[#color][:[legend][:STACK][:skipscale][:dashes[=on_s[,off_s[,on_s,off_s]...]][:dash-offset=offset]]]LINE[width]:value[#color][:[legend]]# LINE[width]:表示选择线条类型绘图width表示线条的粗细,一般有1,2,3三个值# value:表示在DEF中定义的vname# #color:表示以哪种颜色来绘制线形图,不定义颜色时,线条不可见# legend:表示显示绘制线条的图例信息# 图下面的数值信息GPRINT:vname:CF:format
实例1:DEF提取数据+时间间隔对作图的影响
rrd graph def.png /--end now /--start end-120000s / # 表示起始时间是当前时间往前120000s,也就是33个小时左右--width 400 /-t "DEF应用举例+不同时间粒度作图对比" /--font TITLE:14:FZZHYJW.ttf /DEF:ds0a=/home/rrdtool/data/router1.rrd:dsa:AVERAGE / # 从router1.rrd中取出dsa的数据,CF类型为AVERAGEDEF:ds0b=/home/rrdtool/data/router1.rrd:dsb:AVERAGE:step=1800 /DEF:ds0c=/home/rrdtool/data/router1.rrd:dsc:AVERAGE:step=7200 /LINE1:ds0a#0000FF:"default roesolution 300 seconds/1" / # 以线条的方式绘制ds0aLINE1:ds0b#00CCFF:"roesolution 1800 seconds per interval/1" /LINE1:ds0c#FF00FF:"roesolution 7200 seconds per interval/1" /
出图:
实例2: VDEF,CDEF的用法+坐标轴标签+横纵线条+报告生成+更新时间
1, DEF是Definition(定义)的意思,定义什么呢?你要绘图,总要有数据源吧?DEF 就是告诉 RRDtool 从那个 RRD 中取出数据;
2, 你可能会感到奇怪,为什么还有一个CF字段?
3, 因为RRA有多种CF类型,有些RRA可能用来保存平均值、有些RRA可能用于统计最大值、最小值等等,所以你必须同时指定使用什么CF类型的RRA的数据,至于:start和:end, :reduce则用得比较少,最常用的就是:step了,它可以让你控制RRDtool从那个RRA中取数据;
3,CDEF 是 Calculation Define 的意思,CDEF支持很多数学运算,甚至还支持简单的逻辑运算 if-then-else;
- 比如有两个target,一个是eth0_in,一个是eth0_out,如果要把它们相加起来,再除以8,得出bytes为单位的值,那要如何计算呢?
- 或者只想看eth0_in中超出10Mb/s的那部分,其余的都不关系,那又该如何实现?
- 使用CDEF,都可以很容易实现;
- 使用简单的逻辑运算 if-then-else需要熟悉RPN语法;
4,VDEF 是 Variable Definition (变量定义)的意思;
rrdtool graph graph.png /--end now /--start end-120000s /--width 400 /-t "VDEF、CDEF应用举例" /--font TITLE:14:FZZHYJW.ttf /--x-grid MINUTE:30:HOUR:4:HOUR:4:0:%H:%M / # 每30分钟一条线,每4小时一条主线,4小时一个标签标于主线下方,标签格式“小时:分钟”-Y /# 指定数据源DEF:ds0=/home/ rrdtool/data/router2.rrd:Inbound:AVERAGE /DEF:ds1= /home/ rrdtool/data/router2.rrd:Outbound:AVERAGE /# 自定义变量VDEF:ds0max=ds0,MAXIMUM /VDEF:ds0avg=ds0,AVERAGE /VDEF:ds0min=ds0,MINIMUM /VDEF:ds0pct=ds0,95,PERCENT /VDEF:ds1max=ds1,MAXIMUM /VDEF:ds1avg=ds1,AVERAGE /VDEF:ds1min=ds1,MINIMUM /VDEF:ds1pct=ds1,95,PERCENT /# 定义数学运算CDEF:ds0bits=ds0,8,* /CDEF:ds1bits=ds1,8,* /# COMMENT用户输出文本,默认它是不输出换行的COMMENT:" " /COMMENT:"Maximum " /COMMENT:"Average " /COMMENT:"Minimum " /COMMENT:"95th percentile/l" /# 以面积方式绘制入流量AREA:ds0bits#00FF00:"Inbound " /GPRINT:ds0max:"%6.2lf %Sbps" /GPRINT:ds0avg:"%6.2lf %Sbps" /GPRINT:ds0min:"%6.2lf %Sbps" /GPRINT:ds0pct:"%6.2lf %Sbps/l" /# 以线条方式绘制出流量LINE1:ds1bits#FF0000:"Outbound" /GPRINT:ds1max:"%6.2lf %Sbps" /GPRINT:ds1avg:"%6.2lf %Sbps" /GPRINT:ds1min:"%6.2lf %Sbps" /GPRINT:ds1pct:"%6.2lf %Sbps/l" /COMMENT:"/s" /VRULE:1186562026#000000:x-mark /HRULE:1700000000#0000FF:y-mark /COMMENT:" update time/: `date /"+%Y/%m/%d %H/:%M/:%S/"`"COMMENT:"/l"
四,案例
https://blog.51cto.com/speakingbaicai/1323464
http://www.360doc.com/content/07/0302/20/15540_382048.shtml
数字报表
这就需要用到 GRPINT 和 COMMENT 语句了。
GPRINT 就是在图表的下方(仍然属于图片的内部)输出最大值、最小值、平均值这些东东;COMMENT 就是用来输出一些字符串,例如报表的表头。
A)GPRINT的格式是GPRINT:vname:CF:format ,由于 format 部分太多参数了,我这里就用最常用的那个 : %x.ylf 。
B)COMMENT 的格式是COMMENT:text,要注意 COMMENT 默认是不输出换行的,如果要输出换行,必须用 “/n” 。
下面就以一个实例来说明如何打印报表 : 绘制1小时前的流量图,并打印数字报表(参照 abel 兄给出的例子)
[root@dns1 bob]# rrdtool graph 1.png /> --start now-1h -w 600 -n DEFAULT:8 /> DEF:value1=eth0.rrd:eth0_in:AVERAGE /> DEF:value2=eth0.rrd:eth0_out:AVERAGE /> COMMENT:" /n" /> COMMENT:" 当前值----------平均值----------最大值------最小值----/n" > COMMENT:" /n"> AREA:value1#00FF00:"流入" /> GPRINT:value1:LAST:'%13.2lf' /> GPRINT:value1:AVERAGE:%13.2lf /> GPRINT:value1:MAX:%13.2lf /> GPRINT:value1:MIN:%13.2lf /> COMMENT:" /n" /> LINE2:value2#ff0000:"流出":STACK / # 注意这里是 STACK 方式> GPRINT:value2:LAST:%13.2lf /> GPRINT:value2:AVERAGE:%13.2lf /> GPRINT:value2:MAX:%13.2lf /> GPRINT:value2:MIN:%13.2lf /> COMMENT:" /n" /> COMMENT:” /n” /> COMMENT:"LAST UPDATED /:$(date '+%Y-%m-%d %H/:%M')/n" -Y687x270[root@dns1 bob]#
出图:
注意比较 Y 轴刻度值和“流出”部分的值的关系, Y 轴刻度值 —“流入” =“流出”
上面的 COMMENT 一是输出表头,二是输出空行。注意,要用 COMMENT 输出空行,必须用 COMMENT:’ /n’ 。
注意到 ‘/’ 前面的空格吗?这个是不可以漏的,否则就不会有空行的效果了。
绘图
/usr/bin/rrdtool graph /home/xx/cpu.png--start '-3600' --end N # 过去一小时的时间--width 385 --height 190 # 图片大小--title '过去一小时CPU使用情况'--upper-limit 100 --lower-limit 0 # 题目和上下限--vertical-label 百分比 --rigid# 获得变量cpu_user,cpu_system,cpu_wio,cpu_idleDEF:'cpu_user'='/var/lib/monitor/rrds/server/cpu.rrd':'cpu_user':AVERAGEDEF:'cpu_system'='/var/lib/monitor/rrds/server/cpu.rrd':'cpu_system':AVERAGEDEF:'cpu_wio'='/var/lib/monitor/rrds/server/cpu.rrd':'cpu_wio':AVERAGEDEF:'cpu_idle'='/var/lib/monitor/rrds/server/cpu.rrd':'cpu_idle':AVERAGE# 变量定义,取具体值VDEF:cpu_user_last=cpu_user,LASTVDEF:cpu_user_avg=cpu_user,AVERAGEVDEF:cpu_system_last=cpu_system,LASTVDEF:cpu_system_avg=cpu_system,AVERAGEVDEF:cpu_wio_last=cpu_wio,LASTVDEF:cpu_wio_avg=cpu_wio,AVERAGEVDEF:cpu_idle_last=cpu_idle,LASTVDEF:cpu_idle_avg=cpu_idle,AVERAGE# 图形形式,包括AREA、STACK、LINE等, 并在在图片中打印数值AREA:'cpu_user'#FF0000:'用户'GPRINT:'cpu_user_last':' Now\:%5.1lf%s'GPRINT:'cpu_user_avg':' Avg\:%5.1lf%s\j'STACK:'cpu_system'#33cc33:'系统'GPRINT:'cpu_system_last':' Now\:%5.1lf%s'GPRINT:'cpu_system_avg':' Avg\:%5.1lf%s\j'STACK:'cpu_wio'#1C86EE:'等待'GPRINT:'cpu_wio_last':' Now\:%5.1lf%s'GPRINT:'cpu_wio_avg':' Avg\:%5.1lf%s\j'STACK:'cpu_idle'#e2e2f2:'空闲'GPRINT:'cpu_idle_last':' Now\:%5.1lf%s'GPRINT:'cpu_idle_avg':' Avg\:%5.1lf%s\j'
更多图形
# rrdtool graph mysql.png -s 1439192683 -t "Mysql Select" -v "Selects per 5s" DEF:select=mysql.rrd:myselect:AVERAGE:step=5 LINE1:select#FF0000:"Selects/5"
简单解释一下:-s表示开启画图展现的时间,不指定的话默认为当前之间的前10秒,-t指定图表的标题,-v指定图表侧标题。
DEF:select定义临时变量,AVERAGE为图表展现聚合函数,step为步长为5秒。
LINE1表示线条的粗细,还有LINE2和LINE3两个级别。select为我们刚刚定义的变量,即对哪个变量应用这些线条粗细以及颜色等等。
#FF0000表示颜色,这个16进制数据表示颜色,其余颜色则是由其他的16进制数据产生。
“Selects/5”表示提示块的字符。生成图标后,如下:
除此之外,我们还可以在一个图表上显示多个数据展示图
# rrdtool graph mysql.png -s 1439192683 -t "Mysql Select" -v "Selects per 5s" DEF:select=mysql.rrd:myselect:AVERAGE:step=5 DEF:select2=mysql.rrd:myselect:MAX:step=10 LINE1:select#FF0000:"Selects/3" LINE2:select2#00ff00:"MAX in 10s"

当然,我们也可以只取值,不用线条展示,如下:
# rrdtool graph mysql.png /-s 1439192683 /-t "Mysql Select" -v "Selects per 5s" /DEF:select=mysql.rrd:myselect:AVERAGE:step=5 /DEF:select2=mysql.rrd:myselect:MAX:step=10 /DEF:max30=mysql.rrd:myselect:MAX:step=30LINE1:select#FF0000:"Selects/3" /LINE2:select2#00ff00:"MAX in 10s" /GPRINT:max30:MAX:"Maximum\: %10.2lf"

[
