Shinken est un ensemble de démons travaillant de manière autonome pour collecter les statuts des équipements supervisés. Mais dans certains cas, Shinken ne peut pas accéder aux équipements à superviser.
Le Receiver permet alors de recevoir des messages de l’extérieur et de les transmettre aux démons concernés.
Mais comme la source de message peut-être différente, il est nécessaire d'ajouter des modules au Receiver qui traduiront les messages reçus dans un format que Shinken comprendra.
Le module receiver-module-generic-endpoint est un module qui est utile pour servir de base au développement de vos modules de Receiver.
Il y a plusieurs manières de récolter des informations du monde extérieur:
Nous avons donc fait évoluer l'architecture du Receiver et des modules accrochés au Receiver pour qu'ils puissent recevoir des informations des hôtes/clusters ainsi que leurs checks associés à gérer.
Nous avons aussi permis que les traitements faits par les modules de Receiver puissent se répartir sur un ou plusieurs processus ( des workers ).
Ce lien vous permet de récupérer l'archive contenant le module d'exemple:
Il faut un nom pour votre module. Ce nom doit respecter les règles suivantes :
Dans cette documentation, on le nommera NOMduMODULE
Nous suivons maintenant pour tout nouveau module la convention suivante: NOMduDEMON_module_NOMduMODULE |
Le module est installé avec deux actions:
Il faut donc copier dans le package d'exemple :
Il est important de renommer TOUTES les parties du module, si votre module a encore des classes ayant le même nom que le module "generic", alors il y aura des problèmes d'import du code par le daemon et le résultat sera incorrect. |
Dans le code livré par défaut, le nom du module est MODULE_CODE_NAME.
Pour que le module s'active il faut:
Important: Si vous avez besoin de l'inventaire des hôtes/clusters, il faut que le module soit configuré pour recevoir les données d'inventaires que vous souhaitez gérer via ce Receiver. Pour cela, il faut utiliser les paramètres suivants:
Le module d'exemple a un fonctionnement très simple:
Exemple de communication avec le module via curl:
curl --data 'key=my_value' http://127.0.0.1:9000/my_api |
Modifier le module pour qu'il corresponde à vos attentes
Il est important de bien lire les commentaires dans le code d'exemple avant toute modification.
Le code est divisé en deux parties:
Le code dans le module va être très limité, car la seule méthode que vous pouvez modifier/surcharger est get_raw_stats qui est utilisée pour les checks de supervision et le healthcheck.
Il est important de:
Le code dans le worker est celui où sera votre code métier ainsi que votre boucle principale d'actions.
Ici encore certaines règles s'appliquent afin de s'assurer une stabilité dans le temps:
Les méthodes que vous pouvez surcharger sont multiples.
Méthodes surchargeables concernant le fonctionnement global du worker:
ATTENTION: toutes les autres méthodes ( exceptées init_worker_before_main qui est appelée avant le worker_main ) sont faites dans des threads différentes. Vous devez donc faire attention à l'accès concurrent de vos données. |
Les méthodes concernant l'inventaire des hôtes:
Lorsque l'inventaire est mis à jour, les objets d'inventaires vous sont fournis:
Les méthodes appelables sur ces objets sont:
Pour les hôtes et les clusters:
Concernant les checks, les méthodes appelables sont:
| IMPORTANT: aucune modification ne doit être faite sur ces objets. Seules ces méthodes sont à appeler, les autres pouvant modifier l'élément et créer de graves incohérences ou bien être supprimer/renommer dans les futures versions. |
Dans le worker il est possible actuellement d'effectuer les commandes suivantes:
Toutes les commandes doivent avoir une forme telles que:
[ EPOCH ] NOM_COMMANDE ; ARG1 ; ARG2 ; ARG3
Dans le module d'exemple, la méthode export_http montre comment définir l'envoi d'un OK pour tous les hôtes de l'inventaire.
Mais ce n'est qu'un exemple. L'important est le bloc pour l'envoi des commandes.
ATTENTION: Les commandes créées doivent être encodés au format UTF-8. De ce fait, à la création d'un objet ExternalCommand, si la chaîne de caractère ne respecte pas ce format, une exception Python de type ExternalCommandDecodeError est remontée. Vous devez gérer ce cas d'erreur. Si vous ne le faites pas, un code d'erreur 500 sera retournée et une Traceback apparaîtra dans les logs. |
cmd = '[%s] PROCESS_HOST_CHECK_RESULT;%s;0;Is alive' % (int(time.time()), host_name)
logger.info('[%s] Generating a command UP for %s' % (self.get_name(), host_name))
try:
ext = ExternalCommand(cmd)
except ExternalCommandDecodeError:
logger.warning("[%s] The command line is not in UTF-8 format" % self.get_name())
abort(400, "Not in UTF-8 format")
# give back the check result to the daemon
self.send_object_to_main_daemon(ext) |
Pour pousser un résultat d'hôte/cluster vers les Schedulers
Pour pousser un résultat de check vers les Schedulers
Pour créer une prise en compte sur un hôte/cluster
Pour créer une prise en compte d'élément check.
Pour créer une période de maintenance sur un hôte/cluster.
Pour créer une période de maintenance sur un check d'hôte/cluster.