微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

perl snmp rrdtool 画图

上一篇文章中,有兄弟问我要code source,因前面写的数据收集用的是本地获取的,所以就想先改进下数据收集方式,再发出来。今天,我采用snmp方式把数据收集出来,并画图。

以下代码仅供参考:

 
 
  1. #!/usr/bin/perl 
  2. use Net::SNMP; 
  3. use RRDs; 
  4.  
  5. my @hosts=("localhost","127.0.0.1","192.168.x.y"); 
  6. my $debug=1
  7. my $rrd_path="/usr/rrd/"
  8. my $pic_path="/usr/rrd/pic/"
  9. my $oid=".1.3.6.1.4.1.2021.51.101.1"
  10.  
  11. sub CREATERRD{ 
  12. my ($rrdname)=shift; 
  13.   
  14. RRDs::create("$rrdname"
  15.  "--step"300
  16.  "DS:1min:GAUGE:600:U:U"
  17.  "DS:5min:GAUGE:600:U:U"
  18.  "DS:15min:GAUGE:600:U:U"
  19.  "RRA:AVERAGE:0.5:1:600"
  20.  "RRA:AVERAGE:0.5:6:700"
  21.  "RRA:AVERAGE:0.5:24:775"
  22.  "RRA:AVERAGE:0.5:288:797"
  23.  ); 
  24.  my $ERROR = RRDs::error; 
  25.  if ($ERROR){ 
  26.  print "ERROR unable to create ${ERROR} \n " if $debug; 
  27.  print "create no\n" if $debug; 
  28.  return 0
  29. }else
  30.  print "$rrdname createok\n" if $debug; 
  31.  return 1
  32.  } 
  33.  
  34. sub UPDATERRD{ 
  35.     my ($rrdname,$L1min,$L5min,$L15min)=@_; 
  36.     RRDs::update ("$rrdname","N:$L1min:$L5min:$L15min"); 
  37.     my $ERROR=RRDs::error; 
  38.     if ($ERROR){ 
  39.         print "ERROR unable to update ${ERROR} \n" if $debug; 
  40.         return 0
  41.     }else
  42.         print "update success\n" if $debug; 
  43.         return 1
  44.     } 
  45.  
  46.  
  47. sub GRAPHPNG{ 
  48.     my ($rrdfile,$starttime)=@_; 
  49.     my $rrdtitle1; 
  50.     if($rrdfile=~/(.*)\.rrd$/i){ 
  51.         $rrdtitle1=$1
  52.          
  53.     }else
  54.         $rrdtitle1=$rrdfile; 
  55.     } 
  56.     my $pngfile=$pic_path.$rrdtitle1.".png"
  57.     print $pngfile."\n" if $debug; 
  58.     my $rrdfile=$rrd_path.$rrdfile; 
  59. RRDs::graph($pngfile, 
  60. '--title',$rrdtitle1, 
  61. '--font''TITLE:10:'
  62. '--font''LEGEND:10:'
  63. '--base',1000
  64. '--height',120
  65. '--width',600
  66. '--vertical-label','cpu LoadAverage'
  67. '--start',-$starttime, 
  68. "DEF:1min=$rrdfile:1min:AVERAGE"
  69. "DEF:5min=$rrdfile:5min:AVERAGE"
  70. "DEF:15min=$rrdfile:15min:AVERAGE"
  71. "AREA:1min#EACC00FF:1Min Average"
  72. 'GPRINT:1min:LAST: Current\:%8.2lf%s\n'
  73. "AREA:5min#EA8F00FF:5Min Average"
  74. 'GPRINT:5min:LAST:Current\:%8.2lf%s\n'
  75. "AREA:15min#FF0000FF:15Min Average"
  76. ); 
  77. if (my $ERROR = RRDs::error) { 
  78. print "ERROR: $ERROR\n" if $debug; 
  79. return 0
  80.  
  81. sub GETSNMP { 
  82.     my $s = shift; 
  83.     my $oid = shift || return "U"
  84.     my $response = $s->get_request($oid); 
  85.     my $retval = $response->{$oid} || "U"
  86.     print "$oid -> $retval\n" if $debug; 
  87.     return ($retval =~ /(\d+)/) ? $retval : 'U'
  88.  
  89. foreach my $ip(@hosts){ 
  90.      #create rrd 
  91.      my $rrd_filename = "$rrd_path$ip-loadaverage.rrd"
  92.      print "$rrd_filename\n" if $debug; 
  93.      unless(-e $rrd_filename){ 
  94.          &CREATERRD($rrd_filename); 
  95.      } 
  96.  
  97.     #get data 
  98.      my($s, $err) = Net::SNMP->session( 
  99.      -hostname => $ip, 
  100.      -community => "CHKTIME"
  101.      -timeout => 1
  102.      -version => 2 
  103.      );    
  104.  
  105.     my $LoadAverage = GETSNMP($s,$oid); 
  106.     print $LoadAverage."\n" if $debug; 
  107.     my ($L1m,$L5m,$L15m)=split(" ",$LoadAverage); 
  108.     print "\n".$L1m."\t".$L5m."\t".$L15m."\n" if $debug; 
  109.     
  110.     #update rrd 
  111.     if( -e $rrd_filename){ 
  112.          &UPDATERRD($rrd_filename,$L1m,$L15m); 
  113.    } 
  114.  
  115.     #graph picture 
  116.     &GRAPHPNG("$ip-loadaverage.rrd",86400);  

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐