? ? 一直很想了解nagios中的pnp是如何工作的,正好看到这几天cu上有人问rrdtool如何图像。这几天特地的翻了翻rrd的资料,补习了下。结合perl的一些模块,获取所需要的数据,最后调用rrdtools绘制图像。好了,废话不多说了,开始讲解实现过程。
一、 所需软件以及安装方法
? ? 1.安装rrdtool (这里不多说了,网上文章太多了),安装默认路径/usr/local/rrdtool/
? ? 2.安装perl所需要的模块:
RRD::Simple ---------用于调用rrdtool绘制图像
Sys::Statistics::Linux ---------用于获取系统的一些动态数据(例如,网卡流量,CPU,磁盘IO)存储在yml文件中
YAML----------用于解析yml中的数据
#cpan ??
cpan>install??RRD::Simple ?Sys::Statistics::Linux YAML
二、rrdtool的简要原理
? 可能直接贴代码,很多人不理解原理。这里我就讲下rrdtool绘制图像的简要原理。
?

?
三、代码
?
- #!/usr/bin/perl ?
- use?strict; ?
- use?warnings; ?
-
use?RRD::Simple?qw(:all); ?
- use?YAML; ?
-
use?Sys::Statistics::Linux; ?
-
my?$rrdfile?=??'/home/mcshell/tmp/myfile.rrd'; ?
-
my?$rrdfile_tmp?=?'/home/mcshell/tmp/myfile_tmp.rrd'; ?
-
my?$rrd?=?RRD::Simple->new(?file?=>?"$rrdfile"?); ?
-
my?$rrd_tmp?=?RRD::Simple->new(?file?=>?"$rrdfile_tmp");?#建立一个临时rrd用于计算5分钟内变化的差值 ?
- unless(-e?$rrdfile){ ?
-
?$rrd->create(?????????????????????????????????????????#如果没有rrd则进行建立一个rrd ?
-
?????????????bytesIn?=>?"GAUGE",??????????????????????#定义数值源类型 ?
-
?????????????bytesOut?=>?"GAUGE",?????? ?
- ?????????); ?
-
?$rrd_tmp->create( ?
-
?????????????bytesIn?=>?"GAUGE",?
-
?????????????bytesOut?=>?"GAUGE",?
- ?????????); ?
- ?} ?
-
my?($now_input,$now_output,$input,$output); ?
- ?
-
my?$lxs?=?Sys::Statistics::Linux->new(????#这里进行获取网卡的流量(这个模块可以获取多个系统参数,如cpu,process,磁盘IO) ?
- ??????????????????????????????????????????#可以根据这些可以绘制这种图形。 ?
- netstats?=>?{ ?
- ????????????init?????=>?1,?
-
????????????initfile?=>?'/tmp/netstats.yml',??#数据存入yml文件 ?
- ????????},?
- ); ?
- ??? ?
- ????my?$stat?=?$lxs->get; ?
-
my?$config?=?YAML::LoadFile('/tmp/netstats.yml');#解析yml文件 ?
- $now_input?=?$config->{eth0}->{rxbyt};?? ?
- $now_output?=?$config->{eth0}->{txbyt}; ?
-
my?$info?=?$rrd->info("$rrdfile_tmp");??#获取tmp的数据 ?
- my?$before_input_5=$info->{ds}->{bytesIn}->{last_ds};???#获取5分钟之前的数据 ?
- my?$before_output_5=$info->{ds}->{bytesOut}->{last_ds}; ?
-
if?($before_input_5??eq?'U'?||?$before_output_5?eq?'U'){ ?
- ????$before_input_5?=?$now_input; ?
- ????$before_output_5?=?$now_output; ?
- } ?
- $input?=?$now_input?-?$before_input_5;???#5分钟变化的数据 ?
-
$output?=?$now_output?-?$before_output_5; ?
- ?
-
$rrd->update( ?
-
?????????????bytesIn?=>?"$input",?
-
?????????????bytesOut?=>?"$output",?
- ?????????); ?
-
$rrd_tmp->update( ?
-
?????????????bytesIn?=>?"$now_input",?
-
?????????????bytesOut?=>?"$now_output",?
- ?????????); ?
-
my?$starttime?=?time;????????????????#获取当前unix时间戳 ?
- my?$endtime?=?$starttime?-?7200;???#2个小时之前的unix时间戳 ?
- my?%rtn?=?$rrd->graph(??#这里是定义每周,每月,每年的图形。 ?
-
????????timestamp?=>?"both",? ?
- ????????????????periods?=>?[?qw{????weekly?monthly?annual}??],??#定义所需的周期文件 ?
-
???????????????title?=>?"Network?Interface?eth0",?
-
???????????????vertical_label?=>?"Bytes/sec",?
- ???????????????line_thickness?=>?2,??????#画线的像素 ?
- ??????????????extended_legend?=>?1,?????#打开详细信息 ?
- ?????????); ?
-
?%rtn?=?$rrd->graph(???????????????#这里是定义一个2小时的图形,去掉下面的end,start为一天的图 ?
-
?????????????destination?=>?"/var/www/html",?
-
????????????????timestamp?=>?"both",?
- periods?=>?[?qw{?daily??}??],?
-
?????????????title?=>?"Network?Interface?eth0",?
-
?????????????vertical_label?=>?"Bytes/sec",?
- line_thickness?=>?2,?
- ?????????extended_legend?=>?2,?
-
????????end?=>?$starttime,?
- ???????start?=>$endtime,?
-
???????"COMMENT:??????????????????????????????????????????????"?=>?"",?
- ???????#此处的COMMENT是有空格的,尼玛真是一个一个空格来对齐下面的格式,靠O__O"… ?
-
???????"GPRINT:bytesOut:AVERAGE:?bytesOut平均值%8.2lf%s"=>?"",?
-
???????"COMMENT:????????????"?=>?"",?
-
???????"GPRINT:bytesIn:AVERAGE:?bytesIn平均值%8.2lf%s"=>?"",?????? ?
- ?????????); ?
- ?
-
my?$lastUpdated?=?$rrd->last; ?
-
?print?"myfile.rrd?was?last?updated?at?"?. ?
-
???????scalar(localtime($lastUpdated))?.?"n"; ?
- ?
在crontab中加入每五分钟运行一次。
四、验证图像
?

五、总结
如果想定制自己的个性化颜色以及多个数据点,可以先学习下rrdtool的使用方法,只要理解了rrdtool的工作原理,
以及数据源的处理,可以更好的理解cacti,nagios是如何绘制图像的。
有什么问题,以及建议欢迎留言