Monitorizando espacio en disco con Nagios y Perl

Imagen de vfmBOFH

Holas.

Me aburro. Así que voy a compartir con vosotros la primera mierda que se me ha pasado por la cabeza. Y con lenguaje florido y pedante. Soy así de estupendo, yo.

Hallábame yo tocándome las $BALLS at two hands cuando notificóseme vía nagios que ciertos servidores hallábanse con un problema de espacio en disco. Tal problema consistía que tenían ocupado un 210% de su espacio disponible. Teniendo en cuenta que dicho espacio correspondía a una monstruosidad aberrante de varios TB que no debería tener ocupado más del 20%, creo que coincidireis conmigo en calificar dicha notificación como una patada en el ojete. Con bota de punta de hierro.

Después de ahogar el alarido que tal patada ojetera me puso en disposición de exhalar, conecté por ssh a los servidores en cuestión, y corroboré que el punto de montaje en cuestión no tenía más del 14% ocupado. Ello hizo que mis gónadas recuperaran tanto su posición anatómicamente correcta, como su habitual aspecto lozano, viril y peludo. Ello también hizo que sospechara automáticamente del check que nagios lanzaba contra los susodichos servidores.

Después de tirar un par de snmpwalks (a ciegas. Viva grep y LMQLP) el Masmola observó que la combinación HOST-RESOURCES-MIB y el check cutre que nagios trae por defecto (que consulta los valores en crudo basándose en las OID de dicha MIB), leía los valores de espacio en disco en las variables de 32 bits que la MIB maneja. Así que en cuanto los servidores le escupían la barbaridad monstruosa (en bytes) que tenían de capacidad, la zorra de la MIB le quitaba como dos o tres dígitos a la cifra -ahora no lo recuerdo muy bien- y el mamón del check cascaba como los mirlos al comparar con el espacio usado, que aparentaba ser superior.

Una vez diagnosticado el problema, nos pusimos con la solución, la cual acabó siendo un check mierder codeado en Perl (Perl Rocks) el cual usa otra MIB, la UCD-SNMP-MIB. Ésta tiene unas OID muy chulas que te muestran el porcentaje de uso de cada punto de montaje del sistema de ficheros. Y éste check es el que voy a compartir con vosotros. Huelga decir que para que la mierda ésta funcione, tanto el host nagios como el host a monitorizar deben tener cargada la UCD-SNMP-MIB. Si no sabeis cómo hacerlo, no sé que coño haceis leyendo esto. Bueno, ahí va:

Editado: He añadido un par de líneas al código para control de errores. Devolverá UNKNOWN si hay errores de sesión SNMP (timeouts y tal) y CRITICAL si no se encuentra el punto de montaje especificado. Gracias a dvastazion por la idea.

#!/usr/bin/perl ##################################################################### 
# Licencia HLQTSDLH 
# Check chorra para los puntos de montaje de gran tamaño 
# Como SNMP muestra los tamaños de los discos usando 32 bits 
# casca como los mirlos con grandes volúmenes 
# Aquí usaremos el porcentaje 
##################################################################### 
# Parámetros 1: Host, 2: community, 3: punto de montaje 4: warn 5: crit 
use strict; use SNMP; use lib "/usr/lib/nagios/plugins"; 
use utils qw(%ERRORS); 
my %ERRORS=('OK'=>0,'WARNING'=>1,'CRITICAL'=>2,'UNKNOWN'=>3); my $warning = $ARGV[3] + 0; 
my $critical = $ARGV[4] + 0; 
my $session = new SNMP::Session(DestHost => $ARGV[0], Community => $ARGV[1], Version => 2 ); 
if (!defined($session)) { 
printf"ERROR Abriendo sesión SNMP: $SNMP::Session::ErrorStr\n"; exit $ERRORS{"UNKNOWN"}; 
} 
#Preparamos la variable donde almacenaremos las duplas punto-montaje/porcentaje 
my $vars = new SNMP::VarList(['dskPath'], ['dskPercent']); 
#chivato para control de errores con el punto de montaje 
my $chivato = undef; 
# Primera colecta de datos my ($mp,$perc) = $session->getnext($vars); 
if ($session->{ErrorStr}) { 
printf"ERROR de sesión: $session->{ErrorStr}.\n"; 
exit $ERRORS{"UNKNOWN"}; 
} 
# bucle para el resto 
while (!$session->{ErrorStr} && $$vars[0]->tag eq "dskPath"){ 
# Buscamos el punto de montaje correcto... 
if ($mp eq $ARGV[2]) { 
$chivato = 1; last; 
} 
else { ($mp,$perc) = $session->getnext($vars); 
} 
}; 
# Evaluamos el porcentaje y mandamos la señal a nagios 
# Si chivato está definido. Si no, es que el punto de montaje no se ha encontrado 
if (defined $chivato){ 
if ($perc < $warning) { 
printf "OK, porcentaje usado: $perc%% sobre un warn de $warning%%\n"; exit $ERRORS{"OK"}; 
} 
elsif ($perc < $critical) { 
printf "WARN, porcentaje usado $perc% sobre un crit de $critical%\n"; exit $ERRORS{"WARNING"}; 
} 
else { 
printf "CRIT, porcentaje usado $perc%% sobre un crit de $critical%%\n"; exit $ERRORS{"CRITICAL"}; 
} 
} 
#Si no se encuentra el punto de montaje, tiramos un Critical 
else { 
printf "CRIT, el punto de montaje no se encuentra\n"; exit $ERRORS{"CRITICAL"}; 
} 

Como podeis ver, no es nada del otro mundo. Pero es útil. Y como me lo he currado yo, ahí lo dejo. Salut.

7 comments

16
Ago

Imagen de vfmBOFH

Que conste que codeo poco, pero cuando lo hago indento el código.

La mierda ésta parece comerse los tabuladores.

Atentamente, La voz ésa del interior de tu cabeza que oyes cuando lees algo.

16
Ago

Imagen de dvastazion

Una observación, que seguro que como estoy de vacas y procesando el vozka de anoche no veo....En el caso de que no consigas ver la cadena SNMP o no llegues a entrar en el bucle, por "error no contemplado" ;)...¿te escupirá un 2 y por tanto te dará un crítical?

Anda, alégrame el día.

16
Ago

Imagen de vfmBOFH

Ya dije que es un check chorra. Falta el control de errores.

- Si no encuentra la cadena del punto de montaje, te da un ok con un % de espacio usado que seguramente será el del último punto de montaje de la tabla SNMP.

- Si da error de sesión, no estoy del todo seguro, pero creo que sí que salta el uknown.

Aquí la gracia era el descubrir la MIB UCD y el juego que da poder manejar porcentajes de uso y no cantidades en bytes.

EDITADO
Para tener bajo control el que no se encuentre el punto de montaje, basta con añadir un $chivato = undef antes de la colecta de datos, darle un valor si se encuentra el punto de montaje, y anidar los condicionales que evalúan el porcentaje dentro de un condicional que evalúe si $chivato está definido o no. Subiré el script modificado cuando tenga un segundo.

Atentamente, La voz ésa del interior de tu cabeza que oyes cuando lees algo.

16
Ago

Me parece cojonudo, la gestión de errores en los check ahorran sustos ;)... la semana pasada a las 3 de la mañana me salto un crítica en 37 FS por una mierda de check rápido que codee el día anterior me tuvo pegado al terminal....luego era una mierda de login failure no contemplado...

14
Sep

Eso te pasa por usar SNMP, que esta obsolético y solo lo quieren usar los "Ciscoboys"

Con lo majo que es el NRPE...

26
Sep

Los que os quejáis de SNMP es porque no lo habéis probado. Basta instalar un snmpd, dar permisos de subred y tirar. Te quitas del tirón la configuración del NRPE, ya que por defecto puedes monitorizar por SNMP la memoria (en check muuuy detallado), load average, ocupación de discos, tráfico de interfaces de red, throughput In/Out en discos... vamos que te quitas el grueso de la configuración de monitorización en cliente.

Yo los únicos check que tengo por NRPE son los de Oracle y los checks de CPU Stats.

Todos los checks con performance data para tener históricos de datos en gráficas.

Me gustaría ver cuánto tardáis en configurar NRPE xP

13
Feb

Hola amigos,

me ha encantado el post, pero tengo una duda y me gustaría comentarla por si podeis ayudarme.

Acabo de comenzar con esto del monitoreo en Nagios y tengo switch gestionables y unos aparatos que se llaman Barix para hacer Streaming que me gustaría monitoizar. 

Ya he sacado los oids con el snmpwalk, pero ya no se que hacer más!! Alguien me ayuda