利用perl rrdtool绘制网络流量图

简介:

。结合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绘制图像的简要原理。


 

 

三、代码

 

 
 
  1. #!/usr/bin/perl  
  2. use strict;  
  3. use warnings;  
  4. use RRD::Simple qw(:all);  
  5. use YAML;  
  6. use Sys::Statistics::Linux;  
  7. my $rrdfile =  '/home/mcshell/tmp/myfile.rrd';  
  8. my $rrdfile_tmp = '/home/mcshell/tmp/myfile_tmp.rrd';  
  9. my $rrd = RRD::Simple->new( file => "$rrdfile" );  
  10. my $rrd_tmp = RRD::Simple->new( file => "$rrdfile_tmp"); #建立一个临时rrd用于计算5分钟内变化的差值  
  11. unless(-e $rrdfile){  
  12.  $rrd->create(                                         #如果没有rrd则进行建立一个rrd  
  13.              bytesIn => "GAUGE",                      #定义数值源类型  
  14.              bytesOut => "GAUGE",        
  15.          );  
  16.  $rrd_tmp->create(  
  17.              bytesIn => "GAUGE",  
  18.              bytesOut => "GAUGE",  
  19.          );  
  20.  }  
  21. my ($now_input,$now_output,$input,$output);  
  22.  
  23. my $lxs = Sys::Statistics::Linux->new(    #这里进行获取网卡的流量(这个模块可以获取多个系统参数,如cpu,process,磁盘IO)  
  24.                                           #可以根据这些可以绘制这种图形。  
  25. netstats => {  
  26.             init     => 1,  
  27.             initfile => '/tmp/netstats.yml',  #数据存入yml文件  
  28.         },  
  29. );  
  30.      
  31.     my $stat = $lxs->get;  
  32. my $config = YAML::LoadFile('/tmp/netstats.yml');#解析yml文件  
  33. $now_input = $config->{eth0}->{rxbyt};    
  34. $now_output = $config->{eth0}->{txbyt};  
  35. my $info = $rrd->info("$rrdfile_tmp");  #获取tmp的数据  
  36. my $before_input_5=$info->{ds}->{bytesIn}->{last_ds};   #获取5分钟之前的数据  
  37. my $before_output_5=$info->{ds}->{bytesOut}->{last_ds};  
  38. if ($before_input_5  eq 'U' || $before_output_5 eq 'U'){  
  39.     $before_input_5 = $now_input;  
  40.     $before_output_5 = $now_output;  
  41. }  
  42. $input = $now_input - $before_input_5;   #5分钟变化的数据  
  43. $output = $now_output - $before_output_5;  
  44.  
  45. $rrd->update(  
  46.              bytesIn => "$input",  
  47.              bytesOut => "$output",  
  48.          );  
  49. $rrd_tmp->update(  
  50.              bytesIn => "$now_input",  
  51.              bytesOut => "$now_output",  
  52.          );  
  53. my $starttime = time;                #获取当前unix时间戳  
  54. my $endtime = $starttime - 7200;   #2个小时之前的unix时间戳  
  55. my %rtn = $rrd->graph(  #这里是定义每周,每月,每年的图形。  
  56.         timestamp => "both",   
  57.                 periods => [ qw{    weekly monthly annual}  ],  #定义所需的周期文件  
  58.                title => "Network Interface eth0",  
  59.                vertical_label => "Bytes/sec",  
  60.                line_thickness => 2,      #画线的像素  
  61.               extended_legend => 1,     #打开详细信息  
  62.          );  
  63.  %rtn = $rrd->graph(               #这里是定义一个2小时的图形,去掉下面的end,start为一天的图  
  64.              destination => "/var/www/html",  
  65.                 timestamp => "both",  
  66. periods => [ qw{ daily  }  ],  
  67.              title => "Network Interface eth0",  
  68.              vertical_label => "Bytes/sec",  
  69. line_thickness => 2,  
  70.          extended_legend => 2,  
  71.         end => $starttime,  
  72.        start =>$endtime,  
  73.        "COMMENT:                                              " => "",  
  74.        #此处的COMMENT是有空格的,尼玛真是一个一个空格来对齐下面的格式,靠O__O"…  
  75.        "GPRINT:bytesOut:AVERAGE: bytesOut平均值%8.2lf%s"=> "",  
  76.        "COMMENT:            " => "",  
  77.        "GPRINT:bytesIn:AVERAGE: bytesIn平均值%8.2lf%s"=> "",        
  78.          );  
  79.  
  80. my $lastUpdated = $rrd->last;  
  81.  print "myfile.rrd was last updated at " .  
  82.        scalar(localtime($lastUpdated)) . "\n";  
  83.  

在crontab中加入每五分钟运行一次。

四、验证图像

 

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









本文转自 mcshell 51CTO博客,原文链接:http://blog.51cto.com/mcshell/1092498,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
JSON 监控 网络安全
使用Perl编写的上网监控管理软件:网络数据包拦截与分析功能
网络安全一直是互联网时代的重要议题之一。随着网络技术的不断发展,网络攻击和数据泄露等问题也变得日益严重。为了有效监控和管理网络流量,开发了一款基于Perl语言的上网监控管理软件,该软件具有强大的网络数据包拦截与分析功能,能够帮助网络管理员实时监控网络流量,并及时发现和应对各种网络安全威胁。
149 0
|
1月前
|
机器学习/深度学习 数据采集 人工智能
m基于深度学习网络的手势识别系统matlab仿真,包含GUI界面
m基于深度学习网络的手势识别系统matlab仿真,包含GUI界面
41 0
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的火焰烟雾检测系统matlab仿真
基于yolov2深度学习网络的火焰烟雾检测系统matlab仿真
|
1月前
|
机器学习/深度学习 算法 计算机视觉
m基于深度学习网络的性别识别系统matlab仿真,带GUI界面
m基于深度学习网络的性别识别系统matlab仿真,带GUI界面
29 2
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真
|
1月前
|
机器学习/深度学习 算法 数据库
基于CNN卷积网络的MNIST手写数字识别matlab仿真,CNN编程实现不使用matlab工具箱
基于CNN卷积网络的MNIST手写数字识别matlab仿真,CNN编程实现不使用matlab工具箱
|
1月前
|
传感器 算法 Go
基于EKF扩展卡尔曼滤波的传感器网络目标跟踪matlab仿真
基于EKF扩展卡尔曼滤波的传感器网络目标跟踪matlab仿真
|
2月前
|
机器学习/深度学习 算法 数据挖掘
【MATLAB】tvf_emd_ MFE_SVM_LSTM 神经网络时序预测算法
【MATLAB】tvf_emd_ MFE_SVM_LSTM 神经网络时序预测算法
46 2
|
2月前
|
机器学习/深度学习 算法 数据挖掘
【MATLAB】REMD_ MFE_SVM_LSTM 神经网络时序预测算法
【MATLAB】REMD_ MFE_SVM_LSTM 神经网络时序预测算法
44 5
|
1月前
|
机器学习/深度学习 并行计算 算法
m基于深度学习网络的瓜果种类识别系统matlab仿真,带GUI界面
m基于深度学习网络的瓜果种类识别系统matlab仿真,带GUI界面
32 0