2 - Créer ses plugins en Perl - Deuxième Partie
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.
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,argsAperç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 -rAperç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 -1Aperç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|criticalRetour OK-w|warning= Missing argument: critical Missing argument: warning
./check_top_process.pl -c 9 -w 1 Top process OK - all process OK | top_process=0.1%;1;9Retour 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;90Retour 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.
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.