Difference between revisions of "Monitoring openvz resources using nagios and snmp"
m |
(Add quta soft limit check) |
||
Line 19: | Line 19: | ||
echo rouser my_username priv > /etc/snmp/snmpd.conf | echo rouser my_username priv > /etc/snmp/snmpd.conf | ||
echo "extend .1.3.6.1.4.1.2021.51 beancounters /bin/cat /proc/user_beancounters" >> /etc/snmp/snmpd.conf | echo "extend .1.3.6.1.4.1.2021.51 beancounters /bin/cat /proc/user_beancounters" >> /etc/snmp/snmpd.conf | ||
+ | echo "extend .1.3.6.1.4.1.2021.52 vzquota /bin/cat /proc/vz/vzquota" >> /etc/snmp/snmpd.conf | ||
echo createUser my_username MD5 my_password DES >> /var/lib/snmp/snmpd.conf | echo createUser my_username MD5 my_password DES >> /var/lib/snmp/snmpd.conf | ||
/etc/init.d/snmpd start | /etc/init.d/snmpd start | ||
Line 108: | Line 109: | ||
${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ]; | ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ]; | ||
if ( ($held > $barrier) && ($barrier != 0) ) { | if ( ($held > $barrier) && ($barrier != 0) ) { | ||
− | print "WARNING: Limits on $vid: $resource held->$held , barrier->$barrier ( limit->$limit ) | + | print "WARNING: Limits on $vid: $resource held->$held , barrier->$barrier ( limit->$limit ) " ; |
$ret=1; | $ret=1; | ||
} | } | ||
Line 140: | Line 141: | ||
my $limit=$beancounters{$vmachine_id}{$resource}[3]; | my $limit=$beancounters{$vmachine_id}{$resource}[3]; | ||
if ( $failcnt_old < $failcnt ){ | if ( $failcnt_old < $failcnt ){ | ||
− | print "CRITICAL: Incrased failcnt $vmachine_id: $resource from $failcnt_old to $failcnt (held->$held , maxheld->$maxheld , barrier->$barrier , limit->$limit ) | + | print "CRITICAL: Incrased failcnt $vmachine_id: $resource from $failcnt_old to $failcnt (held->$held , maxheld->$maxheld , barrier->$barrier , limit->$limit ) " ; |
$ret=2; | $ret=2; | ||
} | } | ||
Line 148: | Line 149: | ||
} | } | ||
− | if ($ret == 0 ) { print "Ok. \n" ; } | + | # if ($ret == 0 ) { print "Ok. \n" ; } |
# print Dumper(%beancounters_old) ; | # print Dumper(%beancounters_old) ; | ||
+ | # print "\n"; | ||
exit($ret); | exit($ret); | ||
' | ' | ||
− | + | RET1=$? | |
fi | fi | ||
echo "$DATA" > $FILE | echo "$DATA" > $FILE | ||
+ | ##################################################################################### | ||
+ | ######### quota check | ||
+ | ##################################################################################### | ||
+ | DATA=`snmpwalk -v 3 -u $USER -l authPriv -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \ | ||
+ | | perl -ne '/"(.*)"/ ; print "$1\n" ;'` | ||
+ | |||
+ | if [ "$?" != "0" ]; then | ||
+ | echo "Unknown snmp error" | ||
+ | exit 1 | ||
+ | fi | ||
+ | |||
+ | |||
+ | echo "$DATA" | perl -n -e' | ||
+ | my $vid ; | ||
+ | my $ret=0 ; | ||
+ | while(<STDIN>){ | ||
+ | my %vid; | ||
+ | if ( /\D*(\d+):.*/ ){ $vid=$1; } | ||
+ | if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){ | ||
+ | $resource=$1 ; | ||
+ | $usage=$2 ; | ||
+ | $softlimit=$3 ; | ||
+ | $hardlimit=$4 ; | ||
+ | $time=$5 ; | ||
+ | $expire=$6 ; | ||
+ | if ( $usage >= $softlimit ){ | ||
+ | print "WARNING: VZquota limit exceeded on $vid: $resource usage->$usage, softlimit->$softlimit, hardlimit->$hardlimit, time->$time, expire->$expire " ; | ||
+ | $ret=1; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | exit($ret); | ||
+ | ' | ||
+ | RET2=$? | ||
+ | |||
+ | ##################################################################################### | ||
+ | ########### return | ||
+ | ##################################################################################### | ||
+ | |||
+ | if [ $RET1 -gt $RET2 ]; then | ||
+ | RET=$RET1 | ||
+ | else | ||
+ | RET=$RET2 | ||
+ | fi | ||
+ | |||
+ | if [ $RET = 0 ]; then | ||
+ | echo Ok. | ||
+ | fi | ||
exit $RET | exit $RET | ||
</pre> | </pre> |
Revision as of 13:52, 8 May 2007
Contents
snmpd configuration
Debian Etch example:
apt-get install snmpd
edit /etc/default/snmpd : remove -u snmp and replace 127.0.0.1 with your ip, Full/etc/default/snmpd example:
export MIBDIRS=/usr/share/snmp/mibs SNMPDRUN=yes SNMPDOPTS='-Lsd -Lf /dev/null -I -smux -p /var/run/snmpd.pid 207.46.250.119' TRAPDRUN=no TRAPDOPTS='-Lsd -p /var/run/snmptrapd.pid'
Create user(my_username) and add new mib:
/etc/init.d/snmpd stop echo rouser my_username priv > /etc/snmp/snmpd.conf echo "extend .1.3.6.1.4.1.2021.51 beancounters /bin/cat /proc/user_beancounters" >> /etc/snmp/snmpd.conf echo "extend .1.3.6.1.4.1.2021.52 vzquota /bin/cat /proc/vz/vzquota" >> /etc/snmp/snmpd.conf echo createUser my_username MD5 my_password DES >> /var/lib/snmp/snmpd.conf /etc/init.d/snmpd start
Testing snmp:
snmpwalk -v 3 -u my_usrname -l authPriv -a MD5 -A my_password -x DES -X my_password 207.46.250.119
Warning: the minimum pass phrase length is 8 characters.
nagios configuration
example nagios configuration
add to configuration:
define command { command_name check_snmp_openvz_on_port # command_line /usr/local/bin/check_snmp_openvz.sh $HOSTADDRESS$ PORT USER PASSWORD command_line /usr/local/bin/check_snmp_openvz.sh $HOSTADDRESS$ $ARG1$ $ARG2$ $ARG3$ }
define host { host_name openvz-server alias Serwer Openvz address 207.46.250.119 use generic-host contact_groups admins }
define service{ use generic-service host_name openvz-server service_description Virtual Machines Limits check_command check_snmp_openvz_on_port!161!my_username!my_password max_check_attempts 1 }
nagios plugin
It is shell script:
# cat /usr/local/bin/check_snmp_openvz.sh #!/bin/bash HOST=$1 PORT=$2 USER=$3 PASS=$4 export FILE=/tmp/$HOST.beancounters RET=0 DATA=`snmpwalk -v 3 -u $USER -l authPriv -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.51.4 \ | perl -ne '/"(.*)"/ ; print "$1\n" ;'` if [ "$?" != "0" ]; then echo "Unknown snmp error" exit 1 fi if [ -f $FILE ]; then echo "$DATA" | perl -n -e' use Data::Dumper; my $file=$ENV{"FILE"}; my $ret=0 ; my $vid ; my $resource ; my $held ; my $maxheld ; my $barrier ; my $limit ; my $failcnt ; my %beancounters ; my %beancounters_old ; while(<STDIN>){ my %vmachine; if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters{$vid}=\%vmachine ; } if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) { $resource=$1 ; $held=$2 ; $maxheld=$3 ; $barrier=$4 ; $limit=$5 ; $failcnt=$6 ; ${beancounters{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ]; if ( ($held > $barrier) && ($barrier != 0) ) { print "WARNING: Limits on $vid: $resource held->$held , barrier->$barrier ( limit->$limit ) " ; $ret=1; } } } # read and parse old data open(MYINPUTFILE, "<$file"); while(<MYINPUTFILE>){ my %vmachine; if ( /\D*(\d+):.*/ ){ $vid=$1; $beancounters_old{$vid}=\%vmachine ; } if ( /^[\W\d]+([a-z]+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ) { $resource=$1 ; $held=$2 ; $maxheld=$3 ; $barrier=$4 ; $limit=$5 ; $failcnt=$6 ; ${beancounters_old{$vid}}{$resource}=[$held , $maxheld , $barrier , $limit ,$failcnt ]; } } foreach my $vmachine_id (keys %beancounters) { foreach my $resource (keys %{$beancounters{$vmachine_id}} ) { if ( defined($beancounters{$vmachine_id}{$resource}[4]) && defined($beancounters_old{$vmachine_id}{$resource}[4]) ){ my $failcnt=$beancounters{$vmachine_id}{$resource}[4]; my $failcnt_old=$beancounters_old{$vmachine_id}{$resource}[4]; my $held=$beancounters{$vmachine_id}{$resource}[0]; my $maxheld=$beancounters{$vmachine_id}{$resource}[1]; my $barrier=$beancounters{$vmachine_id}{$resource}[2]; my $limit=$beancounters{$vmachine_id}{$resource}[3]; if ( $failcnt_old < $failcnt ){ print "CRITICAL: Incrased failcnt $vmachine_id: $resource from $failcnt_old to $failcnt (held->$held , maxheld->$maxheld , barrier->$barrier , limit->$limit ) " ; $ret=2; } } } } # if ($ret == 0 ) { print "Ok. \n" ; } # print Dumper(%beancounters_old) ; # print "\n"; exit($ret); ' RET1=$? fi echo "$DATA" > $FILE ##################################################################################### ######### quota check ##################################################################################### DATA=`snmpwalk -v 3 -u $USER -l authPriv -a MD5 -A $PASS -x DES -X $PASS $HOST:$PORT .1.3.6.1.4.1.2021.52.4 \ | perl -ne '/"(.*)"/ ; print "$1\n" ;'` if [ "$?" != "0" ]; then echo "Unknown snmp error" exit 1 fi echo "$DATA" | perl -n -e' my $vid ; my $ret=0 ; while(<STDIN>){ my %vid; if ( /\D*(\d+):.*/ ){ $vid=$1; } if ( /\s*(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+).*/ ){ $resource=$1 ; $usage=$2 ; $softlimit=$3 ; $hardlimit=$4 ; $time=$5 ; $expire=$6 ; if ( $usage >= $softlimit ){ print "WARNING: VZquota limit exceeded on $vid: $resource usage->$usage, softlimit->$softlimit, hardlimit->$hardlimit, time->$time, expire->$expire " ; $ret=1; } } } exit($ret); ' RET2=$? ##################################################################################### ########### return ##################################################################################### if [ $RET1 -gt $RET2 ]; then RET=$RET1 else RET=$RET2 fi if [ $RET = 0 ]; then echo Ok. fi exit $RET