有种你掰弯我百度云:RRDtool 系列连载 -9 : 绘图(下篇) - RRDtool - 阿勃的 blog

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 19:49:32
RRDtool 系列连载-9 : 绘图(下篇)
九、 其他(Miscellaneous)

[Copy to clipboard] [ - ] CODE: [-n|--font FONTTAG:size:[font]]
[-g|--no-legend]
[-b|--base value]
A)-n | --font 是一个有意思的选项。CU 的 abel 兄曾提供了一个中文 patch 可以实现显示中文的效果。但对于我这等对 C 一窍不通的家伙,就不知道怎么用了。

    不过幸好 –n 选项可以实现这个目的,只需要中文字体的文件就可以搞定了。

     首先你要找出一个中文的字体文件。例如/usr/share/fonts/zh_CN/TrueType/gkai00mp.ttf 。你也可以把 Windows 上的 C:\Windows\Fonts 下面的中
     
     文字体拷贝到 Linux 上,例如home/bob/Fonts/simhei.ttf (黑体)效果不错,其他的则不太行,会出现模糊或者重叠的情况。建议就使用黑体算了。

     其次是确定字体大小。中文字体不宜小于 7 ,否则看不清楚

     确定你要修改的是图表的那个部分。有 DEFAULT(全部),TITLE (标题)、AXIS(坐标轴字体)、UNIT(Y轴单位字体)、LEGEND(图例字体)几种。

下面就以实际的例子来说明如何显示中文 :

实例1 :使用 –n 让 RRDtool 显示中文

[Copy to clipboard] [ - ] CODE: [root@dns1 bob]# rrdtool graph 4.png \
> -n TITLE:10:'/home/bob/Fonts/simhei.ttf' \                # 修改标题的字体为黑体
> -n AXIS:10:'/home/bob/Fonts/simhei.ttf' \                # 修改 X 轴的字体为黑体
> --start now-240000 \                # 大于3天的数据
> DEF:value1=eth0.rrd:eth0_in:AVERAGE \
> AREA:value1#00ff00:in -t "33小时前的 eth0 接口流量" -v "traffic"
> -Y –w 600        # 图表宽度为 600 pixel
503x190
[root@dns1 bob]#
这就是最终的效果了,可以看到标题和 X 轴都是中文的,但 Y 轴的字体还是默认的字体。



B)-g |--no-legend 用于取消图表下方的图例,不过不建议这么做。

C)-b|--base value 在 MRTG 和 RRDtool 中,默认 1k=1000 ,使用 –b 可以进行调整,例如 –b 1024

十)数字报表

看看上面的图表,是不是觉得还少了些什么呢?对了,就是只有图,没有文字说明。如何象 MRTG 那样能够显示“最大值”、“平均值”、“当前值”呢?

这就需要用到 GRPINT 和 COMMENT 语句了。
GPRINT 就是在图表的下方(仍然属于图片的内部)输出最大值、最小值、平均值这些东东;COMMENT 就是用来输出一些字符串,例如报表的表头。

A)GPRINT的格式是GPRINT:vname:CF:format 。由于 format 部分太多参数了,我这里就用最常用的那个 : %x.ylf 。

B)COMMENT 的格式是COMMENT:text 。要注意 COMMENT 默认是不输出换行的,如果要输出换行,必须用 “\n” 。

下面就以一个实例来说明如何打印报表 : 绘制1小时前的流量图,并打印数字报表(参照 abel 兄给出的例子)

[Copy to clipboard] [ - ] CODE: [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" -Y
687x270
[root@dns1 bob]#


注意比较 Y 轴刻度值和“流出”部分的值的关系, Y 轴刻度值 —“流入” =“流出”

由于时间精力有限,关于对齐方面的工作就大家自己试验吧.如果绘制的对象数量不是很多,可以用横向报表,不要用这种垂直的格式,

这种格式的好处是便于比较各个对象的值。不过我可以肯定,如何让这些数字和上面的表头对齐是一个会令你极度抓狂的工作的!!!

上面的  COMMENT 一是输出表头,二是输出空行。注意,要用 COMMENT 输出空行,必须用 COMMENT:’ \n’ 。

注意到 ‘\’ 前面的空格吗?这个是不可以漏的,否则就不会有空行的效果了。

十一)特殊功能

[Copy to clipboard] [ - ] CODE: VRULE:time#color[:legend]
HRULE:value#color[:legend]
SHIFT:vname:offset
A)VRULE/HRULE 可以用于在图表上面绘制垂直线/水平线。例如我们想要在图表上面标出最大值,可以用 HRULE 在 Y 轴的指定刻度值

    那里绘制一根水平线,例如 HRUE:100000#ff0000:”最大值” 在 100k 处画一根水平线,并指出这是最大值。



SHIFT 可以用来移动数据,例如 abel 兄曾经在 “[教學]中的教學(二) RRDTOOL 1.2 更新項目”中提到过一个问题,

就是“xx同期相比”如何画?下面就以如何比较3天的数据。

实例1 :绘制连续3天的数据

[Copy to clipboard] [ - ] CODE: [root@dns1 bob]# rrdtool graph 1.png \
> DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=now-1d \                # 1天前
> DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1d:start=now-2d \                # 2天前
> DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2d:start=now-3d \                # 3天前
> LINE1:value1#00ff00:"1 day ago" \
> LINE1:value2#ff0000:"2 days ago" \
> LINE1:value3#000000:"3 days aog" \
> -Y
475x168
You have new mail in /var/spool/mail/root
[root@dns1 bob]#


为什么只有1天前的数据呢?因为我们没有指定 –-start ,RRDtool 默认只绘制1天前的数据。由于这里覆盖了3天,

所以我们可以把 –-start 定义为 –-start now-3d 就可以了。



现在是不是3天的数据都画出来了呢?不过由于它们是横向排列的,所以要比较同个时间段的并不容易,能否把它们

按“垂直”的方式排列呢?这就要用到 SHIFT 了!

[Copy to clipboard] [ - ] CODE: [root@dns1 bob]# rrdtool graph 3.png \
> DEF:value1=eth0.rrd:eth0_in:AVERAGE:end=now:start=now-1d \                # 1天前
> DEF:value2=eth0.rrd:eth0_in:AVERAGE:end=now-1d:start=now-2d \                # 2天前
> DEF:value3=eth0.rrd:eth0_in:AVERAGE:end=now-2d:start=now-3d \                # 3天前
> LINE1:value1#00ff00:"1 day ago"  \                                                               
> SHIFT:value2:86400 LINE1:value2#ff0000:"2 days ago" \                        # 把曲线向右移动1天
> SHIFT:value3:172800 LINE1:value3#000000:"3 days ago" \                        # 把曲线向右移动2天
> -Y –w 600
475x168
[root@dns1 bob]#




和上面的图表比较,是否可以发现 X 轴不同了,不再是3天,而是1天多1点了。而且3根曲线重叠在一起了,可以看出在这三天中,

只有1天前的23点左右有一点流量之外,其余绝大部分都没有流量。

这就是 SHIFT 的功能了,可以把曲线/方块沿着 X 轴移动(左右都可以),我们达到比较同期数据的目的。是不是很好用呢?

十二)总结

这次的内容可真够多的,足足写了19页。不过工具性的东西就是这样 :别看内容 N多,你只要动手画出1个图之后,就会觉得一

切都很简单了。以后只要套用就可以了。关键是如何更好的把你想要的数据以合适的发给你是呈现出来。

上面这些内容都是我通过实验得出的,由于具体的环境不同,可能会跟大家的不同,或者出现错误。我希望大家不要客气,有错误

的地方就指正,有什么好的发现也提出来,一起完善 RRDtool 的文档。这样就可以让越来越多的人了解、掌握 RRDtool 了 。   

(^_^)!