check_mem.pl - Plugin Nagios para checar consumo de RAM

Publicado por Sandro Marcell 26/12/2008

[ Hits: 13.236 ]

Homepage: http://sanmarcell.wordpress.com

Download check_mem.pl




Simples plugin para o Nagios, que monitora o consumo REAL de memória RAM e apresenta os dados em forma de porcentagem. Pode ser usado tanto em servidores locais como em hosts remotos, via nrpe.

Exemplo de uso:

check_mem.pl -w 60% - c 90%
ou
check_mem.pl --warning=60% --critical=90%

Mais detalhes:

check_mem.pl -a

Falou!!!

  



Esconder código-fonte

#!/usr/bin/perl -w
#
# check_mem.pl v0.1
#
# Plugin Nagios para checagem de porcentagem de uso REAL da memoria RAM
# pelo sistema (Versao Perl).
#
# Sandro Marcell (sandro_marcell@yahoo.com.br)
# Boa Vista, Roraima - 18/12/2008
#
# Obs.:
# - Licenca: "GNU Public License v2"
# - Plugin testado no Nagios, compilado com suporte a 'ePN'
# (Embedded Perl Nagios)
# - Testado somente em sistemas Linux
# - Plugin passivel de melhorias ;)
use strict;
use Getopt::Long qw(:config no_ignore_case);

# 'Embedded Perl Nagios':
use lib "/usr/local/nagios/libexec"; 
use utils qw(%ERRORS $TIMEOUT);

# Inicializando variaveis:
my $warning  = "";
my $critical = "";
my %opc = ();
my (
   $ramtotal ,
   $ramlivre ,
   $rambuffer,
   $ramcache ,
   $ramusada ,
   $putil    ,
);

# Sinal 'timeout' recebido, finaliza o plugin com status unknown:
$SIG{'ALRM'} = sub {
   print("ERRO: Nagios time-out\n");
   exit($ERRORS{'UNKNOWN'});
};

# Como utilizar o plugin:
sub __uso__ {
   print <<FIM;
check_mem.pl v0.1 (Nagios plugin)

Plugin para checagem de porcentagem de uso REAL da memoria RAM pelo sistema

Uso: check_mem.pl -aV [-w VALOR%] [-c VALOR%]

Opcoes:
-a, --ajuda
   Mostra esta tela de ajuda
-V, --versao
   Mostra a versao do plugin
-w VALOR%, --warning=VALOR%
   Finaliza o plugin com status 'warning', quando VALOR% for superado
-c VALOR%, --critical=VALOR%
   Finaliza o plugin com status 'critical', quando VALOR% for superado
FIM
   exit($ERRORS{'UNKNOWN'});
}

sub __ajuda__ {
   print("Faca 'check_mem.pl -a' para mais detalhes\n");
   exit($ERRORS{'UNKNOWN'});
}

# Subrotina responsavel pela checagem do status de uso da memoria:
sub __memstatus__ {
   unless (open(ARQUIVO , "< /proc/meminfo")) {
      print("ERRO: '/proc/meminfo' $!\n");
      exit($ERRORS{'CRITICAL'});
   }
   
   # Capturando linhas especificas do arquivo:
   foreach (<ARQUIVO>) {
      $ramtotal  = "$_" if (/MemTotal:/);
      $ramlivre  = "$_" if (/MemFree:/);
      $rambuffer = "$_" if (/Buffers:/); 
      $ramcache  = "$_" if (/^Cached:/);
   }
   close(ARQUIVO);
   for my $i ($ramtotal , $ramlivre , $rambuffer , $ramcache) { $i =~ s/[^0-9]//g; }
   
   # Quantidade real de RAM em uso:
   $ramusada = $ramtotal - ($ramlivre + $rambuffer + $ramcache);
   # Porcentagem utilizada:
   $putil = $ramusada * 100 / $ramtotal;   
}

# Parametros que podem ser definidos pelo usuario:
GetOptions(\%opc,
   "a|ajuda",
   "V|versao",
   "w|warning=s",
   "c|critical=s",
) or __ajuda__;

__uso__ if (defined($opc{'a'}));

if (defined($opc{'V'})) {
   print("check_mem.pl v0.1 (18/12/2008)\n");
   exit($ERRORS{'OK'});
}

# Valor 'warning':
if (defined($opc{'w'})) {
   $warning  = $opc{'w'};
   # Somente valores entre [1-100] seguidos de '%' sao validos:
   unless ($warning =~ /^([1-9][0-9]?|1[0]{0,2})\%{1}$/) {
      print("ERRO: Valor invalido para a opcao 'w'\n");
      __ajuda__;
   }
   # Se '$warning' estiver dentro do padrao, remove-se o '%'
   $warning =~ s/\%//;   
}

# Valor 'critical':
if (defined($opc{'c'})) {
   $critical = $opc{'c'};
   unless ($critical =~ /^([1-9][0-9]?|1[0]{0,2})\%{1}$/) {
      print("ERRO: Valor invalido para a opcao 'c'\n");
      __ajuda__;
   }
   $critical =~ s/\%//;
}   

# Opcoes obrigatorias [-w] e [-c]:
if ($warning eq "" or $critical eq "") {
   print("check_mem.pl: Argumentos insuficientes\n");
   __ajuda__;
}

__memstatus__;
$putil = sprintf("%3d" , $putil);
$ramtotal = sprintf("%3d" , $ramtotal / 1024);
$ramlivre = sprintf("%3d" , ($ramlivre + $rambuffer + $ramcache) / 1024);

# Testes condicionais:
if ($putil > $warning) {
   print("RAM WARNING - ${putil}% em uso (Disponivel: ${ramlivre}MB de ${ramtotal}MB)\n");
   # Retorna o codigo de saida para o Nagios:
   exit($ERRORS{'WARNING'});
} elsif ($putil > $critical) {
   print("RAM CRITICAL - ${putil}% em uso (Disponivel: ${ramlivre}MB de ${ramtotal}MB)\n");
   exit($ERRORS{'CRITICAL'});
} else {
   print("RAM OK - ${putil}% em uso (Disponivel: ${ramlivre}MB de ${ramtotal}MB)\n");
   exit($ERRORS{'OK'});
}
# Fim

Scripts recomendados

Scalar - Alguns dos usos mais comuns deste tipo de variável do Perl

Xshot

Assistente de instalação por apt!

Conversor de moedas

Queimando CDs on-the-fly


  

Comentários
[1] Comentário enviado por SMarcell em 29/12/2008 - 09:42h

Ah, caso alguém se interesse, aqui está a versão em Shell script:

http://www.slackbr.org/forum/viewtopic.php?f=45&t=17472

Falou!!! =)

[2] Comentário enviado por Nicolas777 em 03/10/2012 - 19:42h

Onde eu compilo isso?

[3] Comentário enviado por karlopires em 19/05/2015 - 15:22h

Olá prezados,
Teria como dizer onde coloco o arquivo check_mem.pl e o que fazer com o código? Nada muito detalhado só preciso de um norte. Já trabalho com o Nagios mas nunca adicionei plugins avulsos.
Desde já obrigado.

[4] Comentário enviado por xclaudin em 19/10/2015 - 15:06h


[3] Comentário enviado por karlopires em 19/05/2015 - 15:22h

Olá prezados,
Teria como dizer onde coloco o arquivo check_mem.pl e o que fazer com o código? Nada muito detalhado só preciso de um norte. Já trabalho com o Nagios mas nunca adicionei plugins avulsos.
Desde já obrigado.


To na mesma, não to sabendo adicionar esse plugin x.x


Contribuir com comentário