利用perl rrdtool绘制网络流量图

利用perl rrdtool绘制网络流量图,第1张

概述    一直很想了解nagios中的pnp是如何工作的,正好看到这几天cu上有人问rrdtool如何图像。这几天特地的翻了翻rrd的资料,补习了下。结合perl的一些模块,获取所需要的数据,最后调用rrdtools绘制图像。好了,废话不多说了,开始讲解实现过程。 一、 所需软件以及安装方法     1.安装rrdtool (这里不多说了,网上文章太多了),安装默认路径/usr/local/rrdt

    一直很想了解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是如何绘制图像的。 有什么问题,以及建议欢迎留言 总结

以上是内存溢出为你收集整理的利用perl rrdtool绘制网络流量图全部内容,希望文章能够帮你解决利用perl rrdtool绘制网络流量图所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1292135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存