Vous êtes ici:

Menu


2 - Créer ses plugins en Perl - Deuxième Partie

Stacks Image 5251
Voici la suite de la création de plugin Perl. Nous aborderons les données de performances permettant la création de graphes. Pour cet exemple, nous utiliserons une ligne de commande linux qui nous permet d'afficher le processus le plus gourmand en processeur. Le plugin se nommera pour la cause check_top_process.pl
Nous utiliserons des seuils Critique et Warning. Cet article a été mis à jour avec le nouveau module Monitoring::Plugin.
PS : J’ai repris cet article grâce à l’aide de Daniel Hussenet qui m’a proposé une solution plus simple.

2.1 Principe du plugin

Il fallait trouver une idée simple de plugin. En voici la principe, nous allons récupérer le processus le plus gourmand en processeur d’une machine tournant sous Linux. Ceci nous permettra d’affecter des seuils critical et warning. Commençons à nous intéresser à la commande ps. Avec les paramètres qui vont bien, cette commande va vous afficher les processus du serveur avec le pourcentage d’utilisation du cpu.
Commande seule
ps -eo pcpu,pid,user,args
Aperçu du résultat
%CPU   PID USER     COMMAND
 1.1     1 root     /sbin/init
 0.0     2 root     [kthreadd]
 0.0     3 root     [ksoftirqd/0]
 0.0     5 root     [kworker/0:0H]
 0.1     7 root     [rcu_preempt]
 0.0     8 root     [rcu_sched]
 0.0     9 root     [rcu_bh]
……….
 0.0  2595 root     [kworker/u2:0]
 0.0  2920 root     [kworker/0:2]
10.1  3103 pi       -bash
 0.5  3113 pi       /bin/sh /usr/bin/startx
 0.3  3135 pi       xinit /etc/X11/xinit/xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -auth /tmp/serverauth.dlINFNi1O9
13.8  3136 root     /usr/bin/X -nolisten tcp :0 vt1 -auth /tmp/serverauth.dlINFNi1O9
12.5  3142 pi       /usr/bin/lxsession -s LXDE-pi -e LXDE
 0.0  3166 pi       /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session x-session-manager
 0.0  3169 pi       /usr/bin/dbus-launch --exit-with-session x-session-manager
 2.0  3170 pi       /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
15.0  3176 pi       /usr/lib/gvfs/gvfsd
16.0  3180 pi       /usr/lib/gvfs/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
 0.0  3182 root     /lib/systemd/systemd-udevd
 0.0  3187 root     sudo ps -eo pcpu,pid,user,args
 0.0  3192 root     [kworker/u2:1]
 0.0  3195 root     ps -eo pcpu,pid,user,args
Comme vous pouvez le constater, la première ligne ne nous intéresse pas. La liste des processus n’est pas triée en fonction de l’utilisation du CPU mais plutôt par rapport au processus père. Il faut y remédier par l’utilisation de pipe et de deux commande. La première va supprimer la première ligne, la seconde va trier la liste par l’utilisation du processus. Voici la commande modifiée :
ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r
Aperçu du résultat
25.7  4653 pi       /usr/lib/libreoffice/program/soffice.bin --calc --splash-pipe=5
 7.0  4763 root     sudo ps -eo pcpu,pid,user,args
 1.0  4765 pi       sort -k1 -n -r
 1.0  4764 pi       tail -n +2
 1.0     1 root     /sbin/init
 0.9  3210 pi       lxpanel --profile LXDE-pi
 0.7    91 root     /lib/systemd/systemd-journald
 0.6  3136 root     /usr/bin/X -nolisten tcp :0 vt1 -auth /tmp/serverauth.dlINFNi1O9
 0.4   788 centreo+ /usr/sbin/centengine /etc/centreon-engine/centengine.cfg
 0.4   530 message+ /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
 0.3   699 snmp     /usr/sbin/snmpd -LS4d -Lf /dev/null -u snmp -g snmp -I -smux mteTrigger mteTriggerConf -p /run/snmpd.pid
 0.3  4634 pi       /usr/lib/libreoffice/program/oosplash --calc
 0.2     7 root     [rcu_preempt]
 0.2  3227 pi       /usr/lib/gvfs/gvfs-udisks2-volume-monitor
 0.1   560 root     /usr/sbin/rsyslogd -n
 0.1   460 root     /lib/systemd/systemd-logind
 0.1  4604 root     [kworker/0:3]
 0.1  3230 root     /usr/lib/udisks2/udisksd --no-debug
 0.1  3221 root     /usr/lib/policykit-1/polkitd --no-debug
 0.1  3211 pi       pcmanfm --desktop --profile LXDE-pi
…………………….
Pour finir, on ne gardera que la première ligne avec cette autre commande.
ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r | head -1
Aperçu du résultat
3.0  4653 pi       /usr/lib/libreoffice/program/soffice.bin --calc --splash-pipe=5
Maintenant que nous avons notre commande, passons à la création du plugin.

2.2 Création du plugin

Le plugin se nommera check_top_process.pl et sera créé dans le dossier des plugins. Commençons par les déclarations du programme.
#!/usr/bin/perl -w
#===============================================================================
# Auteur : kermith72
# Date   : 22/10/2013
# version: 2.00
# But    : plugin Nagios verification de processus (top processus)
#===============================================================================
use strict; # rends le language moins permissif, déclaration de variable obligatoire,...
use warnings; # affichage des avertissements, on peut utiliser /usr/bin/perl -w
use Monitoring::Plugin; # Chargement du module CPAN

# déclaration variable $licence
my $licence = "This program is free software; you can redistribute it and/or modify it under"
        ." the terms of the GNU General Public License as published by the Free Software"
        ." Foundation ; either version 2 of the License.";

# déclaration de la sonde
my $np = Monitoring::Plugin->new(
        shortname => 'Top process',
        usage => 'Usage : %s -c|critical  -w|warning=',
        license => $licence,
        version => '3.00',
        blurb => "Ce plugin affiche le processus utilsant le plus de CPU"
                ."les parametres critical et warning sont obligatoire et s'expriment en pourcentage@"
        );

2.3 Ajout des paramètres

Créons nos paramètres. Ce sont les seuils warning et critical, ils seront obligatoires grâce à ce paramétrage required = 1
# Définition de l'argument --critical ou -c
$np->add_arg(
  spec     => 'critical|c=f',
  help     => 'pourcentage process critique',    # Aide au sujet de cette option
  required => 1,                  # Argument obligatoire
);

# Définition de l'argument --warning ou -w
$np->add_arg(
  spec     => 'warning|w=f',
  help     => 'pourcentage process warning',
  required => 1,
);

# Récupération des valeurs de paramètres
$np->getopts;

2.4 Logique du programme

Voici le corps du programme, nous récupérons le résultat de la commande unix ps. Le dernier pipe envoie le résultat de la commande dans un fichier pour traiter le résultat. J'ai exclu la logique pour le plugin Nagios.
#logique du plugin
open(FILE, "ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r | head -2 |");
while (<FILE>)
{
	# récupération du TOP CPU
	($cpu,$pid,$user,$command) = split;
     
   
}

__END__
La commande ps affiche un résultat proche de celui-ci.
0.2  1470 6002     /usr/local/centreon-broker/bin/cbd /usr/local/centreon-broker/etc/central-broker.xml
La commande split permet de récupérer chaque sous-chaîne de la ligne dans une variable.

2.5 Traitement des données de performances

Nous utiliserons la fonction add_perfdata pour rajouter les données de performances.
        # ajout des données de performances
        $np->add_perfdata(
                 label => "top_process",
                 value => $cpu,
                 uom => "%",
                 warning => $np->opts->warning,
                 critical => $np->opts->critical
             );

2.6 Traitement du code de retour pour le plugin

Le code de retour sera traité avec la fonction check_threshold en fonction des seuils passés en arguments. En trois lignes de programme avec la condition if, nous terminons notre plugin.
         # Recupération du code retour en fonction de warning et critical
         $code_retour = $np->check_threshold(
                 check => $cpu,
                 warning => $np->opts->warning,
                 critical => $np->opts->critical,
             );
         # traitement du code retour
         $np->plugin_exit( $code_retour, "process critical : $command with $cpu%") if $code_retour == CRITICAL;
         $np->plugin_exit( $code_retour, "process warning : $command with $cpu%") if $code_retour == WARNING;
         $np->plugin_exit( $code_retour, "all process OK") if $code_retour == OK;

2.7 Le programme complet

#!/usr/bin/perl -w
#===============================================================================
# Auteur : kermith72
# Date   : 12/07/2017
# version: 3.00
# But    : plugin Nagios verification de processus (top processus)
#===============================================================================
use strict; # rends le language moins permissif, déclaration de variable obligatoire,...
use warnings; # affichage des avertissements, on peut utiliser /usr/bin/perl -w
use Monitoring::Plugin; # Chargement du module CPAN

# déclaration variable $licence
my $licence = "This program is free software; you can redistribute it and/or modify it under"
        ." the terms of the GNU General Public License as published by the Free Software"
        ." Foundation ; either version 2 of the License.";

# déclaration de la sonde
my $np = Monitoring::Plugin->new(
        shortname => 'Top process',
        usage => 'Usage : %s -c|critical  -w|warning=',
        license => $licence,
        version => '3.00',
        blurb => "Ce plugin affiche le processus utilsant le plus de CPU"
                ."les parametres critical et warning sont obligatoire et s'expriment en pourcentage@"
        );

# Définition de l'argument --critical ou -c
$np->add_arg(
  spec     => 'critical|c=f',
  help     => 'pourcentage process critique',    # Aide au sujet de cette option
  required => 1,                  # Argument obligatoire
);

# Définition de l'argument --warning ou -w
$np->add_arg(
  spec     => 'warning|w=f',
  help     => 'pourcentage process warning',
  required => 1,
);

# Récupération des valeurs de paramètres
$np->getopts;

# logique du programme
#declaration des variables
my $cpu;
my $pid;
my $user;
my $command;
my $code_retour;

# récupération du TOP CPU
open(FILE, "ps -eo pcpu,pid,user,args | tail -n +2 | sort -k1 -n -r | head -2 |");
while (<FILE>)
{
        ($cpu,$pid,$user,$command) = split;
        # ajout des données de performances
        $np->add_perfdata(
                 label => "top_process",
                 value => $cpu,
                 uom => "%",
                 warning => $np->opts->warning,
                 critical => $np->opts->critical
             );
         # Recupération du code retour en fonction de warning et critical
         $code_retour = $np->check_threshold(
                 check => $cpu,
                 warning => $np->opts->warning,
                 critical => $np->opts->critical,
             );
         # traitement du code retour
         $np->plugin_exit( $code_retour, "process critical : $command with $cpu%") if $code_retour == CRITICAL;
         $np->plugin_exit( $code_retour, "process warning : $command with $cpu%") if $code_retour == WARNING;
         $np->plugin_exit( $code_retour, "all process OK") if $code_retour == OK;
}


__END__

2.8 Test du plugin

Voici le test du plugin avec toutes les possibilités.
Commande passée sans argument
./check_top_process.pl 
Usage : check_top_process.pl -c|critical  -w|warning=

Missing argument: critical
Missing argument: warning
Retour OK
./check_top_process.pl -c 9 -w 1
Top process OK - all process OK | top_process=0.1%;1;9
Retour Warning
./check_top_process.pl -c 90 -w 70
Top process WARNING - process warning : /usr/bin/perl with 84.0% | top_process=84.0%;70;90
Retour Critical
./check_top_process.pl -c .05 -w .01
Top process CRITICAL - process critical : /usr/local/centreon-engine/bin/centengine with 0.1% | top_process=0.1%;.01;.05

2.9 Utilisation des données de performances

Comme ce plugin retourne des données de performance, vous avez la possibilité d'afficher des graphes comme ci-dessous.
Stacks Image 5307
Affichage du graphe lié au plugin check_top_process
Voici cette découverte de la création de plugin terminée, en espérant que cela va vous incite à approfondir le développement des plugins.
comments powered by Disqus
 Vous êtes ici: