[微软技术] rrdtools
转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]
本文链接: http://www.php-oa.com/2009/10/25/rrdtools.html
大多的时候都是使用 RRD 来存放监控的数据库。因为这是个环形数据库,所以写到最后就会从开始的位置写起来。
做一个监控系统,都会经历的步骤,就是使用 RRD 的步骤。创建 RRD 的文件,采集数据,存入 RRD ,显示成图象。
Perl 有一个RRDs.pm 来操作 RRD 的模块,在 RRD 最常用的几个操作是 fetch,update,graph,分别对应相关的上面讲的作用,update 是更新 RRD 存的内容, graph 是用来显示成图片的方法.
使用这个和在 Linux 下操作 rrdtool 指令和选项基本一样。
基本的使用象下面这样∶
#!/usr/bin/perl use RRDs; my $rrdFile = 'test.rrd'; RRDs::create($rrdfile,@OPTIONS);
这个等同于 shell 命令下的
rrdtool create test.rrd [OPTIONS]
这在 Perl 上都有对应的操作。
创建 RRD 文件
Perl 创建基本是 RRD 文件,是它最复杂的方法之一,如果详细了解了怎么创建,相信你会对 rrd 了解多了的。从下面可以见到 create 时主要有三个部分的参数,普通参数,DS 参数,RRA 的参数。
#!/usr/bin/perl
use RRDs;
my $file = 'test.rrd';
if ( ! -f $file ) {
eval {
RRDs::create(
$file,
'--step', '300',
'DS:num:GAUGE:600:U:U',
'DS:sub:GAUGE:600:U:U',
'RRA:AVERAGE:0.5:1:1440', #5分, 5日
'RRA:AVERAGE:0.5:6:1008', #30分, 21日
'RRA:AVERAGE:0.5:24:1344', #2时间, 112日
'RRA:AVERAGE:0.5:288:2500', #24时间, 500日
'RRA:MAX:0.5:1:1440', #5分, 5日
'RRA:MAX:0.5:6:1008', #30分, 21日
'RRA:MAX:0.5:24:1344', #2时间, 112日
'RRA:MAX:0.5:288:2500', #24时间, 500日
);
my $ERR=RRDs::error;
die $ERR if $ERR;
};
die "init failed: $@" if $@;
}
开始之前,我们需要先了解几个东西,
Define Data Sources (Inputs)
600 是秒数的有效期(heart beat),会计算在这段时间内的平均值,没有的话,就会显示 UN.
Define Archives (Outputs)
创建时的格式如下:
rrdtool create filename [--start|-b start time][--step|-s step]
[DS:ds-name:DST:dst arguments]
[RRA:CF:cf arguments]
我们现在来详细分析这些参数,我们根据上面三行,可以分成三个基本的部分
(1. 基本参数(filename [--start|-b start time][--step|-s step])
- filename : rrd 的文件名
- –step: 数据的更新频率,默认为 300s (–step)
- –start: 数据的开始时间,默认是现在
(2. DS 参数(DS:ds-name:DST:dst arguments)
DS:ds-name:DST:Heartbeat:Min:Max
- DS: 指明这是 DS 的属性
- num: DS 的名字为 num,
-
GAUGE: 指这个部分的数据类型,所有的类型如下
- Counter: 这是一个累计的值,必须是正数.
- Derive: 这个和 Counter 基本一样,但可以处理负数
- Absolute: 这个数值是相对的值,以第一笔资料来对比
- Gauge: 这个类型用得最多,是直接的数值
- 600: 数据的有效的范围,单位是 s.注意如果指定时间内没有 update ,就会出面UNKN画图就会不全。所以需要非常注意这个地方,另外这个时间的设置,需要为step的倍数
- U:U: 有效的最大值和最小值都是无限 U.
(3. RRA 的格式
RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows
如上:'RRA:AVERAGE:0.5:1:1440',
- RRA: 声明这是 RRA 的属性
- AVERAGE: 存什么样的值,有四种可以选择平均值(AVERAGE),最小值(MIN),最大值(MAX),最后的值(LAST),在这是平均值
- 0.5: 连续性,是指可以有 50% 的合并的数据点是 UNKNOWN.
- 1: 时间特性,steps 这是指当一个 steps (300s) 做为一笔记录,因为 steps 为 300s 也就是 5 分钟,所以每 5 分钟存一笔记录
- 1440: 笔数,以一个步长做一步记录,一共存 1440 笔记录
如上'RRA:AVERAGE:0.5:6:1008'
多个 RRA 的关系
更新 RRD 的资料
在 Perl 中进行数据的更新(Update)非常容易,基本这个的选项最少,和命令行版一样简洁.
在 Perl 中进行 update 时的使用的方法如下:
RRDs::update(
$file,
'-t', 'num:sub',
'--', join(':', 'N', $number, $subtract),
);
my $ERR=RRDs::error;
die $ERR if $ERR;
上面这个还是比较容易理解,-t 是用来指定要更新的模板中的有那些 DS 需要更新。上面的[]表示可选,其中 N|timestamp 表示,要么你需要使用Unix time ,在 Perl 中直接使用 time() 函数,如果在 Shell 中,使用 `date +%s` 来取得这个时间.也可以直接使用 N。使用 N 时,会使用当前时间来更新.
基本的更新的格式:
rrdtool update filename --template|-t ds-name:ds-name:...
time|N:value[:value...]
从 RRD 输出图象
#!/usr/bin/perl
use RRDs;
my $rrdpath = 'test.rrd';
my $png = "test.png";
my (@opt, @GraphOpt, @GraphDraw)
push @GraphOpt,
"-i",
"--alt-autoscale-max",
"--imgformat","PNG",
"--width","400",
"--height","120",
"--lower-limit","0",
"--base","1000",
"--vertical-label","bits per second";
push @GraphDraw,
"AREA:in#00CF00:in ",
"GPRINT:in:LAST: cur\\: %8.2lf %s / ",
"GPRINT:in:AVERAGE:ave\\: %8.2lf %s / ",
"GPRINT:in:MAX:max\\: %8.2lf %s \\n",
"LINE:out#002A97:out ",
"GPRINT:out:LAST:cur\\: %8.2lf %s / ",
"GPRINT:out:AVERAGE:ave\\: %8.2lf %s / ",
"GPRINT:out:MAX:max\\: %8.2lf %s";
push @opt,
"--start" , "-8hour", "--title" , "traffic";
push @opt,@GraphOpt
"DEF:inb=$eth0_rrd:in:AVERAGE",
"DEF:outb=$eth0_rrd:out:AVERAGE",
"CDEF:in=inb,8,*",
"CDEF:out=outb,8,*",
@GraphDraw;
my ($argv,$xsize,$ysize) = RRDs::graph($png, @opt);
if ($ERROR = RRDs::error) {
die $ERROR;
}
在 Linux 中可以使用 rrdtool info test.rrd 来查看建议的 rrd 的信息


















