• 热门专题

perl rrdtool绘制网络流量图

作者:mcshell   发布日期:2012-12-18 09:08:15
Tag标签:perl  rrdtool  
  •     一直很想了解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)  
                                              #可以根据这些可以绘制这种图形。   www.it165.net
    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是如何绘制图像的。
    有什么问题,以及建议欢迎留言

     
About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规