Développement de plugins pour les agents

Caractéristiques de base du plugin agent

Le plugin agent est exécuté par l'agent logiciel de Pandora FMS et doit donc présenter certaines caractéristiques particulières :

  • Chaque exécution de plugin peut renvoyer un ou plusieurs modules avec leurs valeurs correspondantes. Le résultat sera au format XML.
  • Il doit être possible d'accéder à distance soit aux ressources locales de la machine, soit aux ressources d'une autre machine.
  • Il est possible d'utiliser n'importe quel type de langage de programmation pris en charge par le système d'exploitation sur lequel l'agent logiciel Pandora FMS est installé.
  • Toutes les dépendances ou tous les logiciels nécessaires à l'exécution du plugin doivent être disponibles ou installés sur la même machine que celle qui exécute l'agent Pandora FMS.

L'agent plugin peut effectuer une sorte de tâche de reconnaissance car le plugin peut renvoyer plusieurs modules en une seule fois et le nombre peut changer d'une fois à l'autre.

Sous UNIX et GNU/Linux, le résultat de l'exécution du plugin doit être 0, sinon le résultat plugin sera ignoré.

Exemple de développement d'un plugin pour agent

Ce plugin d'agent renvoie le pourcentage d'utilisation du filesystem sur le système.

#!/usr/bin/perl
 
use strict;
 
sub usage() {
        print "\npandora_df.pl v1r1\n\n";
        print "usage: ./pandora_df\n";
        print "usage: ./pandora_df tmpfs /dev/sda1\n\n";
}
 
# Retrieve information from all filesystem
my $all_filesystems = 0;
 
# Check command line parameters
if ($#ARGV <0) {
        $all_filesystems = 1;
}
 
if ($ARGV[0] eq "-h") {
        usage();
        exit(0);
}
 
# Parse command line parameters
my %filesystems;
foreach my $fs (@ARGV) {
        $filesystems{$fs} = '-1%';
}
 
# Retrieve filesystem information
# -P use the POSIX output format for portability
my @df = `df -P`;
shift (@df);
 
# No filesystems? Something went wrong.
if ($#df <0) {
        exit 1;
}
 
# Parse filesystem usage
foreach my $row (@df) {
        my @columns = split (' ', $row);
        exit 1 if ($#columns <4);
        $filesystems{$columns[0]} = $columns[4] if (defined ($filesystems{$columns[0]}) || $all_filesystems == 1);
}
 
while (my ($filesystem, $use) = each (%filesystems)) {
 
        # Remove the trailing %
        chop ($use);
 
        # Print module output
        print "<module>\n";
        print "<name><![CDATA[" . $filesystem . "]]></name>\n";
        print "<type><![CDATA[generic_data]]></type>\n";
        print "<data><![CDATA[" . $use . "]]></data>\n";
        print "<description>% of usage in this volume</description>\n";
        print "</module>\n";
}
 
exit 0;

Une partie fondamentale du code est la fonction usage :

sub usage() {
        print "\npandora_df.pl v1r1\n\n";
        print "usage: ./pandora_df\n";
        print "usage: ./pandora_df tmpfs /dev/sda1\n\n";
}

Cette fonction décrit la version et la manière d'utiliser plugin, elle est très importante et devrait toujours être affichée lors de l'exécution du plugin sans aucun paramètre ou avec une option -h (ou -help) :

if ($ARGV[0] eq "-h") {
        usage();
        exit(0);
}

En ce qui concerne les valeurs renvoyées par l'extension plugin, on peut constater qu'une fois que les données des fichiers suivants ont été collectées, une partie de XML est créée et imprimée par la sortie standard pour chacun d'entre eux, ce qui est fait dans les lignes suivantes :

while (my ($filesystem, $use) = each (%filesystems)) {
 
        # Remove the trailing %
        chop ($use);
 
        # Print module output
        print "<module>\n";
        print "<name><![CDATA[" . $filesystem . "]]></name>\n";
        print "<type><![CDATA[generic_data]]></type>\n";
        print "<data><![CDATA[" . $use . "]]></data>\n";
        print "<description>% of usage in this volume</description>\n";
        print "</module>\n";
}

Le résultat renvoyé par ce plugin pourrait être :

<module>
  <name><![CDATA[tmpfs]]></name>
  <type><![CDATA[generic_data]]></type>
  <data><![CDATA[0]]></data>
  <description>% of usage in this volume</description>
</module>
<module>
  <name><![CDATA[/dev/mapper/VolGroup-lv_home]]></name>
  <type><![CDATA[generic_data]]></type>
  <data><![CDATA[26]]></data>
  <description>% of usage in this volume</description>
</module>
<module>
  <name><![CDATA[/dev/sda9]]></name>
  <type><![CDATA[generic_data]]></type>
  <data><![CDATA[34]]></data>
  <description>% of usage in this volume</description>
</module>

Le nombre de modules renvoyés par ce plugin dépend du nombre de filesystem configurés et peut changer entre les exécutions.

Le fragment XML est ajouté au XML général généré par l'agent logiciel et est envoyé au serveur Pandora FMS pour être traité par l'application Data Server.

Dépannage

Si Pandora FMS ne reconnaît pas l'agent plugin, ne reçoit pas les informations attendues ou si l'agent ne fonctionne tout simplement pas, voici quelques éléments à prendre en compte.

Révision de pandora_agent.conf

L'agent logiciel a besoin d'une ligne dans ce fichier avec le chemin correct de plugin.

Exemple :

/etc/pandora/pandora_agent.conf
module_plugin /etc/pandora/plugins/MyMonitor.pl /etc/pandora/plugins/MyMonitor.conf 2> /etc/pandora/plugins/MyMonitor.err

MyMonitor.pl est le plugin de l'agent, MyMonitor.conf est le fichier de configuration passé en argument, et MyMonitor.err est un fichier qui recevra les éventuelles erreurs d'exécution du plugin et gardera la sortie standard propre.

Redémarrer le démon pandora_agent_daemon

L'agent logiciel exécute les plugins toutes les 5 minutes et il est possible de redémarrer l'agent logiciel avec l'utilisateur root ou équivalent à partir de la ligne de commande :

/etc/init.d/pandora_agent_daemon restart

Vérifier les autorisations des plugins

Le plugin et les fichiers à utiliser doivent avoir les bonnes permissions de lecture, d'écriture et d'exécution.

chmod 755 <plugin_path >

Validation des résultats

Une meilleure façon de trouver les erreurs consiste à exécuter le plugin manuellement sur la ligne de commande. La sortie de l'exécution doit être soigneusement vérifiée.

Validation du XML résultant

Le XML produit par le plugin doit avoir une syntaxe XML valide. Pour le vérifier, vous pouvez suivre ces deux étapes depuis la ligne de commande (vous devez avoir installé xmllint) :

  1. Créer un document XML avec la sortie du plugin : ./Plugin.pl> Plugin.xml.
  2. Vérification du document XML : xmllint Plugin.xml.

Debug mode

Vous pouvez activer le mode développement en changeant la valeur du tag debug dans le fichier pandora_agent.conf de 0 à 1. Une fois que vous avez fait cela, lorsque l'agent logiciel exécute le plugin, les résultats seront sauvegardés dans un document XML avec toutes les informations de l'agent.

Le nom du document sera le nom de l'agent avec l'extension .data, et sera situé dans le répertoire 'tmp' (vous devriez vérifier le log de l'agent PFMS dans '/var/log/pandora/pandora_agent.log). En vérifiant le document, vous serez en mesure de voir si les données du plugin sont collectées et si elles sont conformes aux attentes.

Lorsque vous activez le mode Debug, l'agent ne s'exécute qu'une seule fois et se termine.

Forum