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. 'GPRINT:5min:LAST:Current\:%8.2lf%s\n'
  77. ); 
  78. if (my $ERROR = RRDs::error) { 
  79. print "ERROR: $ERROR\n" if $debug; 
  80. return 0
  81.  
  82. sub GETSNMP { 
  83.     my $s = shift; 
  84.     my $oid = shift || return "U"
  85.     my $response = $s->get_request($oid); 
  86.     my $retval = $response->{$oid} || "U"
  87.     print "$oid -> $retval\n" if $debug; 
  88.     return ($retval =~ /(\d+)/) ? $retval : 'U'
  89.  
  90. foreach my $ip(@hosts){ 
  91.      #create rrd 
  92.      my $rrd_filename = "$rrd_path$ip-loadaverage.rrd"
  93.      print "$rrd_filename\n" if $debug; 
  94.      unless(-e $rrd_filename){ 
  95.          &CREATERRD($rrd_filename); 
  96.      } 
  97.  
  98.     #get data 
  99.      my($s, $err) = Net::SNMP->session( 
  100.      -hostname => $ip, 
  101.      -community => "CHKTIME"
  102.      -timeout => 1
  103.      -version => 2 
  104.      );    
  105.  
  106.     my $LoadAverage = GETSNMP($s,$oid); 
  107.     print $LoadAverage."\n" if $debug; 
  108.     my ($L1m,$L5m,$L15m)=split(" ",$LoadAverage); 
  109.     print "\n".$L1m."\t".$L5m."\t".$L15m."\n" if $debug; 
  110.     
  111.     #update rrd 
  112.     if( -e $rrd_filename){ 
  113.          &UPDATERRD($rrd_filename,$L1m,$L5m,$L15m); 
  114.    } 
  115.  
  116.     #graph picture 
  117.     &GRAPHPNG("$ip-loadaverage.rrd",86400);  

 



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

 

相关文章
|
监控 安全 网络协议
|
存储 监控 Linux
zabbix使用snmp监控Linux主机(二十)
使用snmp监控Linux主机 1.snmp协议介绍 SNMP(简单网络管理协议)也是应用层的一种协议,默认端口号为161,我们平时监控Linux主机都是安装一个agent客户端进行监控,但是有的公司还需要监控网络设备和Windows主机,这时就不得不采用snmp协议去监控设备了
749 0
zabbix使用snmp监控Linux主机(二十)
|
存储 监控 安全
Zabbix SNMP监控安装、配置与服务器实例(学习笔记六)
SNMP可以监控路由器、打印机、UPS、摄像头、服务器等。 1、安装、配置snmp  yum install net-snmp* -y # vim /etc/snmp/snmpd.
2753 0
|
8月前
|
存储 监控
第六十五章 使用 SNMP 监控 IRIS - 用户定义的 SNMP 监视器类示例
第六十五章 使用 SNMP 监控 IRIS - 用户定义的 SNMP 监视器类示例
57 0
|
8月前
|
监控 程序员 数据库
第六十四章 使用 SNMP 监控 IRIS - 扩展 IRIS MIB
第六十四章 使用 SNMP 监控 IRIS - 扩展 IRIS MIB
62 0
|
8月前
|
监控 网络协议 Unix
第六十三章 使用 SNMP 监控 IRIS - SNMP 故障排除
第六十三章 使用 SNMP 监控 IRIS - SNMP 故障排除
91 0
|
8月前
|
监控 网络协议 安全
第六十二章 使用 SNMP 监控 IRIS
第六十二章 使用 SNMP 监控 IRIS
76 0
|
监控 网络架构
Zabbix的snmp监控
Zabbix的snmp监控
126 0
|
运维 监控 数据安全/隐私保护
【运维知识进阶篇】zabbix5.0稳定版详解5(SNMP网络管理协议监控)
【运维知识进阶篇】zabbix5.0稳定版详解5(SNMP网络管理协议监控)
327 0
|
存储 消息中间件 Prometheus
统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?
统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?
统一观测丨使用 Prometheus 监控 SNMP,我们该关注哪些指标?