PDA

View Full Version : Plugin pour graphiques (CPU, mémoire, processus) détaillés


fredo
10-18-2007, 01:17 PM
Bonjour,

Je recherche des plugins Nagios, Centreon ou NRPE qui puissent fournir des graphiques (cf. pièces jointes) aussi détaillés que ceux que l'on obtient avec Collectd (http://collectd.org).

Par exemple pour la mémoire, on a des informations importantes comme les caches et les buffers en plus de la mémoire utilisée.

Linux utilise toute la mémoire pour les applications, les caches et les buffers. Ce limiter à afficher que la mémoire utilisée ne renseigne pas vraiment sur la pression réelle. La quantité de cache et de buffers est une indication que l'on ne trouve pas avec les graphiques qui utilisent les sondes SNMP.

Merci de vos réponses.

fredo
10-23-2007, 07:27 PM
Bonjour,

L'absence de réponse signifie t-il que personne n'a réussi à obtenir de tels graphiques avec Nagios ou Centreon ? :-(

DonKiShoot
10-24-2007, 12:04 PM
Cela signifie que ta question est zarbi car on a déjà des graphs comme ça avec Centreon par exemple.

fredo
10-24-2007, 04:09 PM
Cela signifie que ta question est zarbi car on a déjà des graphs comme ça avec Centreon par exemple.

Merci de votre réponse, je m'étonnais de ne pas en avoir. :D

Je me suis peut-être mal exprimé, prenons l'exemple de la mémoire. J'ai déjà des graphs pour la mémoire en utilisant la commande check_centreon_remote_storage avec comme argument "Real Memory", elle utilise le plugin check_centreon_snmp_remote_storage. Cette commande ne retourne que la mémoire totale et celle utilisée, elle ne fournit pas la valeur des pages cache et buffer cache.

J'ai regardé dans la liste des plugins disponibles sur le serveur, il y a ceux fournit par Centreon 1.4.1 et ceux par les paquets Debian nagios-plugins-standard, nagios-plugins-basic et nagios-nrpe-plugin. Je n'ai pas trouvé de plugin fournissant ces deux informations complémentaires pour la mémoire.

Je n'utilise peut-être pas le bon plugin ou de la bonne façon, quel plugin utilisez-vous pour obtenir ces graphs ?

DonKiShoot
10-24-2007, 07:41 PM
Cherche sur internet sur nagiosexchange par exemple.
Sur le site de manubulon il y a aussi de trés bon plugins.

fredo
11-28-2007, 08:34 PM
J'ai regardé les sites en question, je n'ai pas vraiment trouvé de sonde adaptée à mon besoin.

Si je liste les données pour chaque sondes, on a :

- Mémoire
o libre
o page cache
o buffer cache
o utilisée

- Processus
o paging
o blocked
o zombies
o stopped
o running
o sleeping

- CPU
o nice
o user
o wait-io
o system


Je me suis penché sur le cas de la mémoire. Tout d'abord, la valeur des "page cache" n'est pas fournis par SNMP (NetSNMP), on doit donc passer par des sondes NRPE.

Ensuite, la notion de mémoire utilisée peut avoir deux définitions, selon que l'on y inclut ou pas les "page cache" et les "buffer cache".

Pour les graphes, il est intéressant d'avoir la valeur de la mémoire utilisé sans les "page cache" et les "buffer cache", ce qui permet de tracer une courbe par donnée. Il est intéressant de voir les valeurs de la mémoire utilisé augmenter et des "page cache" et des "buffer cache" diminuer pour se dire qu'il faut ajouter des barrettes de RAM. :p

Pour les alertes, je préfère qu'elles soient basées sur la valeur de la mémoire utilisée sans les "page cache" et les "buffer cache". La politique de Linux étant d'utiliser au maximum la mémoire libre pour créer des "page cache" et des "buffer cache", générer des alertes en comptabilisant ces deux valeurs me parait inexacte et source de faux positifs. Seul la valeur de la mémoire utilisé sans "page cache" et les "buffer cache" reflète réellement l'utilisation de la mémoire par les applications.

J'ai utilisé et modifier le plugin "check_mem.pl" téléchargé sur NagiosExchange pour obtenir des graphes qui ressemble a ceux de Collectd.

Comme vous pouvez le voir sur le graphe ci-dessous pour la mémoire, les quatre données ont leurs courbes. Il manque juste la notion de cumule des courbes et le remplissage qui sont, je pense, du ressort de Centreon. Ce sont des paramètres que l'on pourrait trouver dans la page "Graphs Templates". :p

goldyfruit
12-06-2007, 04:53 PM
Yop,

Je cherche actuellement un plugin pour faire la même chose, j'ai bien trouvé un check_mem.pl mais il ne semble pas vraiment exploitable...

Pourrais-tu nous poster le script que tu utilises s'il te plaît ?

Une petite question, ce script permet-il d'utiliser l'argument -H ou doit-il être utiliser via check_nrpe ?

Merci. ;)

fredo
12-06-2007, 08:45 PM
J'utilise check_nrpe car il y a des données qui ne sont pas fournis par SNMP.

voici la commande pour NRPE que j'utilise dans le fichier "nrpe_local.cfg" :

command[check_local_mem]=/usr/lib/nagios/plugins/check_mem.pl -w 90,25 -c 95,50 -v -p

Ci-dessous le code modifié de check_mem.pl. J'ai depuis clarifié le code (sur une feuille de papier :razz: ), je n'ai pas pris le temps de changer le code du script.



#! /usr/bin/perl -w
#
# check_mem v1.7 plugin for nagios
#
# uses the output of `free` to find the percentage of memory used
#
# Copyright Notice: GPL
#
# History:
#
# v1.7 Ingo Lantschner - ingo AT boxbe DOT com
# + adapted for systems with no swap (avoiding divison through 0)
#
# v1.6 Cedric Temple - cedric DOT temple AT cedrictemple DOT info
# + add swap monitoring
# + if warning and critical threshold are 0, exit with OK
# + add a directive to exclude/include buffers
#
# v1.5 Rouven Homann - rouven.homann@cimt.de
# + perfomance tweak with free -mt (just one sub process started instead of 7)
# + more code cleanup
#
# v1.4 Garrett Honeycutt - gh@3gupload.com
# + Fixed PerfData output to adhere to standards and show crit/warn values
#
# v1.3 Rouven Homann - rouven.homann@cimt.de
# + Memory installed, used and free displayed in verbose mode
# + Bit Code Cleanup
#
# v1.2 Rouven Homann - rouven.homann@cimt.de
# + Bug fixed where verbose output was required (nrpe2)
# + Bug fixed where perfomance data was not displayed at verbose output
# + FindBin Module used for the nagios plugin path of the utils.pm
#
# v1.1 Rouven Homann - rouven.homann@cimt.de
# + Status Support (-c, -w)
# + Syntax Help Informations (-h)
# + Version Informations Output (-V)
# + Verbose Output (-v)
# + Better Error Code Output (as described in plugin guideline)
#
# v1.0 Garrett Honeycutt - gh@3gupload.com
# + Initial Release
#
use strict;
use FindBin;
use lib $FindBin::Bin;
use utils qw($TIMEOUT %ERRORS &print_revision &support);
use vars qw($PROGNAME $PROGVER);
use Getopt::Long;
use vars qw($opt_V $opt_h $verbose $opt_w $opt_c $opt_p);

$PROGNAME = "check_mem";
$PROGVER = "1.7";

# add a directive to exclude buffers:
my $DONT_INCLUDE_BUFFERS = 1;

sub print_help ();
sub print_usage ();

Getopt::Long::Configure('bundling');
GetOptions ("V" => \$opt_V, "version" => \$opt_V,
"h" => \$opt_h, "help" => \$opt_h,
"v" => \$verbose, "verbose" => \$verbose,
"w=s" => \$opt_w, "warning=s" => \$opt_w,
"c=s" => \$opt_c, "critical=s" => \$opt_c,
"p" => \$opt_p, "perfdata" => \$opt_p);

if ($opt_V) {
print_revision($PROGNAME,'$Revision: '.$PROGVER.' $');
exit $ERRORS{'UNKNOWN'};
}

if ($opt_h) {
print_help();
exit $ERRORS{'UNKNOWN'};
}

print_usage() unless (($opt_c) && ($opt_w));

my ($mem_critical, $swap_critical) = ($1,$2) if ($opt_c =~ /([0-9]+),([0-9]+)/);
my ($mem_warning, $swap_warning) = ($1,$2) if ($opt_w =~ /([0-9]+),([0-9]+)/);


# print threshold in output message
my $mem_threshold_output = " (";
my $swap_threshold_output = " (";

if ( $mem_warning > 0 && $mem_critical > 0) {
$mem_threshold_output .= "W> ".$mem_warning.", C> ".$mem_critical;
}
elsif ( $mem_warning > 0 ) {
$mem_threshold_output .= "W> ".$mem_warning;
}
elsif ( $mem_critical > 0 ) {
$mem_threshold_output .= "C> ".$mem_critical;
}

if ( $swap_warning > 0 && $swap_critical > 0) {
$swap_threshold_output .= "W> ".$swap_warning.", C> ".$swap_critical;
}
elsif ( $swap_warning > 0 ) {
$swap_threshold_output .= "W> ".$swap_warning;
}
elsif ( $swap_critical > 0 ) {
$swap_threshold_output .= "C> ".$swap_critical;
}

$mem_threshold_output .= ")";
$swap_threshold_output .= ")";

my $verbose = $verbose;

my ($mem_percent, $mem_total, $mem_used, $swap_percent, $swap_total, $swap_used, $mem_free, $mem_cached, $mem_buffers) = &sys_stats();
my $free_mem = $mem_total - $mem_used;
my $free_swap = $swap_total - $swap_used;

# set output message
my $output = "Memory Usage".$mem_threshold_output.": ". $mem_percent.'% <br>';
$output .= "Swap Usage".$swap_threshold_output.": ". $swap_percent.'%';

# set verbose output message
my $verbose_output = "Memory Usage:".$mem_threshold_output.": ". $mem_percent.'% '."- Total: $mem_total MB, used: $mem_used MB, free: $free_mem MB<br>";
$verbose_output .= "Swap Usage:".$swap_threshold_output.": ". $swap_percent.'% '."- Total: $swap_total MB, used: $swap_used MB, free: $free_swap MB<br>";

# set perfdata message
my $perfdata_output = "";

if (!$opt_p) {
$perfdata_output .= "MemUsed=$mem_percent\%;$mem_warning;$mem_critical";
$perfdata_output .= " SwapUsed=$swap_percent\%;$swap_warning;$swap_criti cal";
}
else {
$mem_free = $mem_free * 1024 * 1024;
$mem_cached = $mem_cached * 1024 * 1024;
$mem_buffers = $mem_buffers * 1024 * 1024;
$mem_used = $mem_used * 1024 * 1024;

$perfdata_output .= "MemFree=$mem_free";
$perfdata_output .= " MemCached=$mem_cached";
$perfdata_output .= " MemBuffers=$mem_buffers";
$perfdata_output .= " MemUsed=$mem_used";
}

# if threshold are 0, exit with OK
if ( $mem_warning == 0 ) { $mem_warning = 101 };
if ( $swap_warning == 0 ) { $swap_warning = 101 };
if ( $mem_critical == 0 ) { $mem_critical = 101 };
if ( $swap_critical == 0 ) { $swap_critical = 101 };


if ($mem_percent>$mem_critical || $swap_percent>$swap_critical) {
if ($verbose) { print "<b>CRITICAL: ".$verbose_output."</b>|".$perfdata_output."\n";}
else { print "<b>CRITICAL: ".$output."</b>|".$perfdata_output."\n";}
exit $ERRORS{'CRITICAL'};
} elsif ($mem_percent>$mem_warning || $swap_percent>$swap_warning) {
if ($verbose) { print "<b>WARNING: ".$verbose_output."</b>|".$perfdata_output."\n";}
else { print "<b>WARNING: ".$output."</b>|".$perfdata_output."\n";}
exit $ERRORS{'WARNING'};
} else {
if ($verbose) { print "OK: ".$verbose_output."|".$perfdata_output."\n";}
else { print "OK: ".$output."|".$perfdata_output."\n";}
exit $ERRORS{'OK'};
}

sub sys_stats {
my @memory = split(" ", `free -mt`);
my $mem_total = $memory[7];
my $mem_used;
if ( $DONT_INCLUDE_BUFFERS) { $mem_used = $memory[15]; }
else { $mem_used = $memory[8];}
my $mem_buffers = $memory[11];
my $mem_cached = $memory[12];
my $mem_free = $mem_total - $memory[8];
my $swap_total = $memory[18];
my $swap_used = $memory[19];
my $mem_percent = ($mem_used / $mem_total) * 100;
my $swap_percent;
if ($swap_total == 0) {
$swap_percent = 0;
} else {
$swap_percent = ($swap_used / $swap_total) * 100;
}
return (sprintf("%.0f",$mem_percent),$mem_total,$mem_used, sprintf("%.0f",$swap_percent),$swap_total,$swap_used,$mem_free,$ mem_cached,$mem_buffers);
}

sub print_usage () {
print "Usage: $PROGNAME -w <warn> -c <crit> [-v] [-h]\n";
exit $ERRORS{'UNKNOWN'} unless ($opt_h);
}

sub print_help () {
print_revision($PROGNAME,'$Revision: '.$PROGVER.' $');
print "Copyright (c) 2005 Garrett Honeycutt/Rouven Homann/Cedric Temple\n";
print "\n";
print_usage();
print "\n";
print "-w <MemoryWarn>,<SwapWarn> = Memory and Swap usage to activate a warning message (eg: -w 90,25 ) .\n";
print "-c <MemoryCrit>,<SwapCrit> = Memory and Swap usage to activate a critical message (eg: -c 95,50 ).\n";
print "-p = Print perfdata for memory and swap in bytes.\n";
print "-v = Verbose Output.\n";
print "-h = This screen.\n\n";
support();
}

goldyfruit
12-10-2007, 11:32 AM
Merci bien. :p

J'ai quelques petites erreurs quand je lance le script en console.

Use of uninitialized value in numeric gt (>) at ./check_mem.pl line 90.
Use of uninitialized value in numeric gt (>) at ./check_mem.pl line 90.
Use of uninitialized value in numeric gt (>) at ./check_mem.pl line 90.
Use of uninitialized value in numeric gt (>) at ./check_mem.pl line 100.
Use of uninitialized value in numeric gt (>) at ./check_mem.pl line 100.
Use of uninitialized value in numeric gt (>) at ./check_mem.pl line 100.
Use of uninitialized value in concatenation (.) or string at ./check_mem.pl line 131.
Use of uninitialized value in concatenation (.) or string at ./check_mem.pl line 131.
Use of uninitialized value in concatenation (.) or string at ./check_mem.pl line 132.
Use of uninitialized value in concatenation (.) or string at ./check_mem.pl line 132.
Use of uninitialized value in numeric eq (==) at ./check_mem.pl line 147.
Use of uninitialized value in numeric eq (==) at ./check_mem.pl line 148.
Use of uninitialized value in numeric eq (==) at ./check_mem.pl line 149.
Use of uninitialized value in numeric eq (==) at ./check_mem.pl line 150.

fredo
12-11-2007, 12:30 PM
Merci bien. :p

J'ai quelques petites erreurs quand je lance le script en console.

Il faut peut-être que tu le lance du répertoire où sont les plugins, il y a dans ce répertoire le fichier "utils.pm".

Tu as utilisé quelle ligne de commande ?

Ici, j'ai ce résultat :

/usr/lib/nagios/plugins$ ./check_mem.pl -w 90,25 -c 95,50 -v -p
OK: Memory Usage: (W> 90, C> 95): 61% - Total: 3666 MB, used: 2252 MB, free: 1414 MB<br>Swap Usage: (W> 25, C> 50): 0% - Total: 549 MB, used: 0 MB, free: 549 MB<br>|MemFree=341835776 MemCached=679477248 MemBuffers=460324864 MemUsed=2361393152

goldyfruit
12-17-2007, 12:29 PM
Merci bien !
Le problème venait de ma commande, je n'utilisais pas les bonnes valeurs !

Résultat obtenu :

[brouette@servtest libexec]# ./check_mem.pl -w 90,25 -c 95,50 -v -p
OK: Memory Usage: (W> 90, C> 95): 38% - Total: 375 MB, used: 144 MB, free: 231 MB<br>Swap Usage: (W> 25, C> 50): 0% - Total: 511 MB, used: 0 MB, free: 511 MB<br>|MemFree=15728640 MemCached=165675008 MemBuffers=59768832 MemUsed=150994944

fredo
12-20-2007, 09:15 PM
Tu peux ensuite créer dans les "Vues Oreon" un nouveau "Graphs Templates", voici les données que j'utilise :

- Propriétés
Nom du Template Memory_Usage
Titre Vertical Bytes
Largeur 600 px
Hauteur 200 px
Limite Basse 0
Limite Haute
Base 1024
Couleur de fond de la Grille #FFFFFF
Couleur Principale de la Grille #800000
Seconde Couleur de la Grille #808080
Couleur du Contour #000000
Couleur de fond #F3F6F6
Couleur de la Police #3C3334
Couleur de la Flèche #FFFFFF
Couleur du Haut #6E917F
Couleur du Bas #4B75B3
Séparer les composants Non
Template par défaut des graphs Centreon Non

- Composantes :
Mem_Page
Mem_Used
Mem_Free
Mem_Buffer

Au niveau des "Courbes Templates", j'essaye de retrouver les couleurs de collectd :

Nom du Template Mem_Page
Nom de la Courbe Page cache
Ordre 2
Epaisseur 1
Couleur de la Courbe #0000FF
Couleur du Remplissage #B7B7F7
Transparence
Inverser Non
Remplissage Non
Afficher la valeur Max Oui
Afficher la valeur Min Oui
Afficher la Moyenne Oui
Afficher la dernière Valeur Oui
Template par défaut des graphs Centreon Non


Nom du Template Mem_Used
Nom de la Courbe Used
Ordre 4
Epaisseur 1
Couleur de la Courbe #FF0000
Couleur du Remplissage #F7B7B7
Transparence
Inverser Non
Remplissage Non
Afficher la valeur Max Oui
Afficher la valeur Min Oui
Afficher la Moyenne Oui
Afficher la dernière Valeur Oui
Template par défaut des graphs Centreon Non


Nom du Template Mem_Free
Nom de la Courbe Free
Ordre 1
Epaisseur 1
Couleur de la Courbe #00EE00
Couleur du Remplissage #B7EFB7
Transparence
Inverser Non
Remplissage Non
Afficher la valeur Max Oui
Afficher la valeur Min Oui
Afficher la Moyenne Oui
Afficher la dernière Valeur Oui
Template par défaut des graphs Centreon Non


Nom du Template Mem_Buffer
Nom de la Courbe Buffer cache
Ordre 3
Epaisseur 1
Couleur de la Courbe #F0A000
Couleur du Remplissage #F3DFB7
Transparence
Inverser Non
Remplissage Non
Afficher la valeur Max Oui
Afficher la valeur Min Oui
Afficher la Moyenne Oui
Afficher la dernière Valeur Oui
Template par défaut des graphs Centreon Non


Il manque dans les propriétés du graphs template une option pour cumuler les courbes. On peut imaginer que cela fonctionne ainsi :

- La courbe Used est tracée avec les valeurs de Mem_Used.

- La courbe Buffer cache est tracée avec l'addition des valeurs de Mem_Used et Mem_Buffer.

- La courbe Page cache est tracée avec l'addition des valeurs de Mem_Used, Mem_Buffer et Mem_Page.

- La courbe Free est tracée avec l'addition des valeurs de Mem_Used, Mem_Buffer, Mem_Page et Mem_Free.

On doit normalement obtenir une horizontal pour la dernière courbe. Reste le problème du remplissage entre les courbes. :D