This is a machine translation based on the English version of the article. It might or might not have already been subject to text preparation. If you find errors, please file a GitHub issue that states the paragraph that has to be improved. |
1. Introduction
À ce stade, nous partons du principe que vous vous êtes déjà familiarisé avec les principes de base des programmes de source de données et des agents spéciaux, et que vous en comprenez les mécanismes fondamentaux. Les agents spéciaux ajoutent une configurabilité simple à un programme de source de données. Les règles de la configuration sont utilisées à cette fin. Cette configurabilité peut affecter à la fois la portée et le type des données récupérées, ainsi que leur prétraitement avant qu’elles ne soient transférées, en tant que sortie de l’agent, vers la chaîne de traitement ultérieure.
Chaque agent spécial est un programme exécutable de manière indépendante, sans dépendance vis-à-vis des interfaces de programmation de Checkmk. Tout comme les programmes de source de données, les agents spéciaux sont également appelés à l’intervalle de vérification habituel (généralement une minute par défaut). Un processus est lancé par l’agent spécial et la sortie de l’agent est transférée vers la sortie standard. L’agent spécial se termine ensuite. Cela vous permet d’implémenter des agents spéciaux dans n’importe quel langage de programmation. Cependant, les processus de courte durée font que les langages compilés « juste à temps » tels que Java sont moins adaptés que les langages compilés ou les langages interprétés à démarrage rapide.
Les processus déclenchés sont configurés via des paramètres de ligne de commande lors de l’appel de l’agent spécial. Pour ce faire, vous déterminez comment les éléments de l’interface graphique, tels que les champs de saisie de texte ou les cases à cocher, doivent être mappés à des paramètres spécifiques.
Les exemples de code créés pour cet article sont disponibles dans notre dépôt GitHub et l'agent spécial Open-Meteo finalisé est disponible sous forme de MKP dans la boutique Checkmk.
2. Création d'un agent spécial « minimal »
Lors du développement d’agents spéciaux, vous devez également vous assurer d’utiliser l’utilisateur du site correspondant pour la création du fichier. Si les propriétaires ou les autorisations ne sont pas correctement définis, cela peut entraîner des problèmes et des incompatibilités. |
Contrairement au programme de source de données, un agent spécial ne peut pas être situé n’importe où dans le système de fichiers.
Il dispose d’un emplacement spécifique dans la hiérarchie des répertoires de Checkmk.
De plus, le nom du fichier doit commencer par agent_.
Par ailleurs, les agents spéciaux doivent toujours être signalés au site Checkmk.
Un agent spécial minimal et exécutable nécessite donc au moins trois fichiers : l’agent spécial, la configuration des règles et la configuration des appels.
2.1. Préparation de l’environnement
À titre de préparation, vous devez donc créer trois répertoires, tous situés sous ~/local/lib/python3/cmk_addons/plugins/<plug-in_family>.
Le quatrième répertoire indiqué dans l’exemple ci-dessous est facultatif — il peut être utilisé pour une vérification basée sur un agent.
2.2. L'agent spécial
Quoi de mieux comme agent spécial minimal qu’une vérification locale fournissant un service « Hello World ! » ? Même un simple script shell générant deux lignes de sortie peut le faire :
Ce script ne doit pas avoir d'extension de fichier. |
N'oubliez pas : le fichier doit être rendu exécutable :
Cela attribuera les autorisations nécessaires :
pour le propriétaire du fichier (lecture, écriture, exécution)
pour le groupe associé au fichier (lecture, exécution)
pour les autres utilisateurs (lecture, exécution).
2.3. Configuration de la règle
Une règle minimale est désormais créée :
Le titre et la catégorie sont définis.
Le formulaire graphique de configuration reste vide.
L'name fait référence au nom de l'agent spécial, auquel est attribué le préfixe agent_.
Un agent configuré de cette manière sera disponible dans Other integrations.
Cependant, son modèle de configuration ne contient aucune entrée en raison de l'elements={} vide.
2.4. La configuration de l'appel
Cette configuration combine l'agent spécial à exécuter avec les paramètres obtenus via l'interface graphique et les paramètres par défaut.
Ces paramètres deviennent désormais des paramètres d'appel.
L'name fait à nouveau référence au nom de l'agent spécial, auquel est ajouté le préfixe agent_.
Cela fournit les exigences de base pour l'agent spécial. Vous pouvez, bien sûr, ajouter des informations supplémentaires à tout moment.
2.5. Le premier test
Une fois les fichiers créés, vérifiez d'abord si Checkmk peut les valider :
Ensuite, redémarrez le serveur web du site :
Si vous souhaitez que la nouvelle règle soit immédiatement visible dans la recherche, vous devrez redémarrer la base de données en mémoire Redis :
Si vous ouvrez maintenant Setup > Agents > Other integrations, vous devriez voir la nouvelle entrée « Hello special! » dans la section « Custom integrations ».
Si celle-ci est manquante, vérifiez d'abord si vous avez bien stocké tous les fichiers à l'emplacement indiqué. Si vous recherchez d'autres sources d'erreur possibles, vous pouvez le faire facilement dans les éditions commerciales via l'administration des paquets d'extension Checkmk. Sinon, nous avons répertorié les sources d'erreur les plus importantes et les solutions possibles dans le chapitre Dépannage.
3. Un exemple plus complexe : un service météo complet
Une vérification dont l'état ne change jamais est, disons-le, assez prévisible. Nous allons donc oser franchir le pas vers un « véritable » agent spécial qui interroge une API Web ou REST et reçoit en réponse un objet sous forme de structure JSON ou XML. Il s'agit là également de formats de données courants lors de l'accès aux API de périphériques réseau tels que les périphériques SAN.
Afin que vous n’ayez pas besoin de matériel spécifique pour cet exercice, nous utiliserons l’API gratuite d’Open-Meteo.com.
Notre objectif est d’écrire un agent spécial complet configuré avec une latitude et une longitude.
Pour simplifier l’exercice, l’agent spécial interprétera également les données directement.
Par exemple, l’agent spécial devra considérer l’état « WARN » pour les températures inférieures à 5 degrés Celsius, et l’état « CRIT » pour les températures inférieures à 0 degré.
Nous abrégerons notre requête en « ometemp », l’agent spécial en « agent_ometemp », et ainsi de suite.
Open-Meteo autorise une utilisation gratuite à des fins non commerciales et se réserve le droit de bloquer des adresses IP en cas de requêtes trop nombreuses. Les requêtes à l'API toutes les minutes restent dans des limites acceptables. Néanmoins, vous ne devez pas abuser du service et devez supprimer les règles d'agent spécial utilisant ce service une fois les tests réussis. Veillez tout particulièrement à ce que les règles d'affectation d'agent spécial créées pour le test ne s'appliquent qu'à un seul hôte et non à des dizaines ou des centaines ! |
3.1. Préparation de l'environnement
Comme dans l'exercice précédent, créez d'abord les répertoires requis — cette fois-ci sous le nom ometemp au lieu de hellospecial.
3.2. L'agent spécial
Maintenant que des données réelles doivent être traitées, vous devrez également réfléchir au langage de programmation et au prétraitement, par exemple.
Notre exercice interroge une API publique et reçoit des données JSON.
Cela pourrait être effectué dans le shell à l’aide d’une commande curl.
Cependant, comme Checkmk est fourni avec un environnement Python bien équipé, il est judicieux de l’utiliser.
La décision suivante concerne le traitement des données. Par exemple, vous pouvez simplement transmettre les données JSON à la sortie de l’agent ou les convertir en format de tableau dans l’agent spécial. En pratique, vous prendrez généralement cette décision en fonction de votre environnement de travail : La « répartition des tâches » a-t-elle été prise en compte lors du développement de votre contrôle ? Les données préparées simplifient-elles le développement du plug-in de contrôle basé sur l’agent associé ? Ou rendent-elles même celui-ci superflu ? Ce dernier cas de figure se présente si les données peuvent être préparées de manière à pouvoir être analysées par un plug-in de contrôle existant.
Notre exemple se contente de transférer la réponse JSON.
L'analyse s'effectue ensuite dans le plug-in de contrôle basé sur un agent.
La longitude et la latitude sont saisies à l'aide des arguments de ligne de commande --latitude et --longitude.
Pour faciliter la lecture des arguments de ligne de commande, nous utilisons la bibliothèque argparse.
Comme Open-Meteo prend en charge la latitude et la longitude encodées dans l'URL, une URL avec des espaces réservés suffit.
Essayez cette URL dans le navigateur en remplaçant les paramètres par vos propres coordonnées de latitude et de longitude.
Rappel : ce script ne doit pas avoir d'extension de fichier. |
La section de l'agent ometemp ne contiendra que l'objet JSON reçu.
Testez l'agent spécial en l'appelant depuis la ligne de commande.
Votre sortie sur la ligne de commande devrait désormais ressembler à ceci :
<<<ometemp:sep(0)>>>
{'latitude': 48.14, 'longitude': 11.6, 'generationtime_ms': 0.01728534698486328, 'utc_offset_seconds': 0, 'timezone': 'GMT', 'timezone_abbreviation': 'GMT', 'elevation': 536.0, 'current_units': {'time': 'iso8601', 'interval': 'seconds', 'temperature_2m': '°C'}, 'current': {'time': '2025-01-09T12:45', 'interval': 900, 'temperature_2m': 9.8}}3.3. La configuration de la règle
L'étape suivante consiste à configurer les règles pour l'agent. Une fois cette opération terminée, cette règle s'affichera dans Setup > Agents > Other integrations, dans le groupe « Environmental ».
Les en-têtes du groupe dans Setup > Agents > Other integrations seront rendus visibles de manière dynamique. Cela signifie que le groupe « Environmental » ne sera visible qu’une fois que le premier agent spécial qui y est classé sera disponible. Vous trouverez un aperçu (non exhaustif) des groupes utilisables sous la rubrique « Fichiers et répertoires » à la fin de cet article. |
L'agent spécial a ainsi été créé.
Après avoir vérifié l'état du site via cmk-validate-plugins, redémarrez le serveur web du site :
Une règle pourrait désormais être créée à partir de cet agent spécial à l'aide d'Add rule: Open-Meteo temperature. Cette règle n'aura toutefois pas encore beaucoup d'utilité, car elle ne contient actuellement que les deux champs permettant de saisir la longitude et la latitude.
Extension : Utilisation de mots de passe
Dans de nombreux cas, un nom d'utilisateur et un mot de passe ou une clé API sont nécessaires pour accéder aux données.
Des éléments d'formspec distincts sont disponibles pour la gestion des mots de passe.
Ceux-ci vous permettent soit de définir des mots de passe ad hoc, soit d'accéder au magasin de mots de passe.
Dans cet exemple, l'extension suivante du script créé ci-dessus peut être utilisée à cette fin.
Complétez la première ligne avec les variables supplémentaires et insérez les nouvelles sections de programme :
N'oubliez pas de redémarrer le serveur web du site après avoir modifié (dans ce cas, étendu) un script.
Comme l'exemple avec Open-Meteo ne nécessite pas de mot de passe, nous présentons ici la gestion de base des mots de passe, mais ne les incluons pas dans l'appel API.
3.4. La configuration de l'appel
Ensuite, nous étendons le nouvel agent spécial afin qu’il ne contienne pas seulement la longitude et la latitude, mais qu’il les traite également. Notre objectif final est d’obtenir les valeurs de température actuelles pour notre emplacement. La configuration suivante combine donc l’agent spécial à exécuter avec les paramètres obtenus depuis l’interface graphique — c’est-à-dire depuis notre section de règles existante — et les paramètres issus des normes.
Les valeurs de longitude et de latitude, que vous pouvez généralement spécifier, sont désormais transférées vers le dictionnaire nommé params.
Parallèlement, l’objet host_config contient tous les paramètres spécifiques à l’hôte qui doivent être utilisés ici.
Par exemple, host_config.primary_ip_config.address vous donne accès à l’adresse IP principale, et host_config.name contient le nom d’hôte.
Lors du transfert vers l'agent spécial, notez que l'appel est effectué via un shell.
La liste des paramètres d'appel ne peut donc contenir que des chaînes de caractères.
Les paramètres deviennent alors des paramètres d'appel qui se retrouvent dans la liste command_arguments.
Utilisation des mots de passe
L'exemple présenté ici transmet les mots de passe en texte clair sous forme d'arguments de ligne de commande.
Sans mesures de sécurité supplémentaires, ces mots de passe pourraient être lus à partir de la table des processus, par exemple.
Cette vulnérabilité peut être minimisée en modifiant l'entrée dans la table des processus au démarrage du programme.
En Python, par exemple, cela peut être réalisé à l'aide du module |
Les mots de passe étant stockés sous forme d'objet, l'accès s'effectue via la fonction `unsafe()` de cet objet :
3.5. Le plug-in de vérification
Par souci d'exhaustivité, nous présentons également ici le plug-in de vérification basé sur un agent. Le développement de ces plug-ins est décrit en détail dans l'article consacré aux plug-ins de vérification basés sur un agent.
Une différence par rapport à l’exemple mentionné dans l’article réside dans le transfert du JSON renvoyé par l’API REST :
Le plug-in de vérification reçoit toujours la section de l’agent sous la forme d’une liste bidimensionnelle (« liste de listes ») de chaînes de caractères.
Tout d’abord, nous utilisons la fonction `itertools` pour transformer cette liste bidimensionnelle en une liste unidimensionnelle.
Nous concaténons ensuite ce tableau résultant avec des espaces, ce qui convertit l’intégralité de la section agent en une seule chaîne de caractères.
Enfin, nous veillons à remplacer les guillemets simples par des guillemets doubles afin de pouvoir charger la chaîne directement en tant qu’objet avec `json.loads()`.
3.6. Test final
Il est toujours recommandé d'effectuer une validation à l'aide de la commande « cmk-validate-plugins » si vous avez apporté des modifications à des éléments exécutés dans le cadre des processus Checkmk.
Dans cet article, cela concerne notamment les règles, la configuration des appels et les plug-ins de vérification.
Si vous n'avez apporté des modifications qu'à la configuration des appels et à l'agent spécial lui-même, il suffit de générer une nouvelle configuration pour le noyau de surveillance et de le redémarrer. Pour ce faire, utilisez la commande suivante :
Si vous avez également modifié des règles ou des plug-ins de contrôle, générez d'abord la configuration du noyau de surveillance, puis redémarrez l'ensemble du site :
Les scripts décrits dans cet article pour l'agent spécial, la configuration des règles et la configuration des appels, lorsqu'ils sont utilisés en combinaison avec ce plug-in de vérification, devraient désormais vous fournir un service fonctionnel dans Checkmk :

4. Dépannage
Même lorsque vous développez vos propres agents spéciaux, des erreurs et des problèmes peuvent (malheureusement) survenir.
Identifier la cause d’une erreur est tout aussi important que de la corriger.
Pour avoir une première idée des causes possibles, vous devriez d’abord exécuter la commande « cmk-validate-config ».
Les sections suivantes vous aideront à isoler davantage la source d’un problème.
4.1. Avertissements dans l'aperçu des services de l'hôte
Si le service Check_MK passe soudainement à l'état « WARN » ou « CRIT » après l'activation de son agent spécial, consultez l'Summary associée.

Si l’Summary indique une connexion avec le nouvel agent spécial, vérifiez les propriétés de l’hôte. La valeur Configured API integrations and Checkmk agent doit être sélectionnée pour le paramètre Checkmk agent / API integrations.

4.2. La règle a disparu ou un avertissement s'affiche
Si votre agent spécial n'apparaît pas (ou n'apparaît plus) dans Checkmk sous « Setup > Agents > Other integrations », il se peut qu'il y ait une erreur dans la configuration de la règle (rulesets/special_agent.py).
Si vous utilisez l'une des éditions commerciales, vous verrez peut-être apparaître un avertissement rouge lorsque vous essayez de modifier la règle ou d'en créer une nouvelle.
Suivez le lien vers la page du rapport d'erreur.
La cause possible du problème y sera affichée.
Consultez ensuite les descriptions d'erreur :
Par exemple, vous obtiendrez un résultat similaire à celui-ci :
2024-12-17 10:15:51,742 [40] [cmk.web 2669118] Error converting to legacy rulespec 'ometemp' : name 'migrate_to_password' is not definedVérifiez la syntaxe de votre fichier d'rulesets/special_agent.py.
Vérifiez si toutes les bibliothèques requises ont été prises en compte et si toutes les variables ont été importées.
Vérifiez si toutes les indentations sont correctes et vérifiez l'ensemble de la syntaxe.
Si votre règle était auparavant visible dans Checkmk et qu’elle a soudainement disparu à la suite d’une modification de sa configuration, vous ne le remarquerez que si vous souhaitez adapter des règles existantes ou en créer de nouvelles. Ce problème n’affectera pas la surveillance des services existants. |
4.3. Messages d'erreur lors de l'activation des modifications
Il peut également y avoir un problème dans la configuration de l'appel ou dans l'agent spécial lui-même. Cela se manifeste, par exemple, par l'affichage d'un avertissement jaune lors de l'Activate changes.
Vérifiez le fichier d'server_side_calls/special_agent.py en suivant les informations fournies dans le message d'erreur.
Si cela ne résout pas l'erreur, vous pouvez rechercher à nouveau les messages d'erreur sur la ligne de commande :
Après un court instant, vous obtiendrez un résultat similaire à celui-ci (ici abrégé pour plus de clarté) :
Traceback (most recent call last):
File "/omd/sites/devtest/bin/cmk", line 118, in <module>
exit_status = modes.call(mode_name, mode_args, opts, args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/modes/__init__.py", line 70, in call
return handler(*handler_args)
^^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/modes/check_mk.py", line 562, in mode_dump_agent
for source in sources.make_sources(
^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 407, in make_sources
return _Builder(
^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 140, in __init__
self._initialize_agent_based()
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 198, in _initialize_agent_based
special_agents = tuple(make_special_agents())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/omd/sites/devtest/lib/python3/cmk/base/sources/_builder.py", line 187, in make_special_agents
for agent_data in special_agent.iter_special_agent_commands(agentname, params):
File "/omd/sites/devtest/lib/python3/cmk/base/server_side_calls/_special_agents.py", line 139, in iter_special_agent_commands
yield from self._iter_commands(special_agent, params)
File "/omd/sites/devtest/lib/python3/cmk/base/server_side_calls/_special_agents.py", line 115, in _iter_commands
for command in special_agent(processed.value, self.host_config):
File "/omd/sites/devtest/local/lib/python3/cmk_addons/plugins/ometemp/server_side_calls/special_agent.py", line 13, in _agent_arguments
"--user", params['bulla'],
~~~~~~^^^^^^^^^
KeyError: 'bulla'Les dernières lignes du résultat sont particulièrement intéressantes :
Dans le fichier server_side_calls/special_agent.py, une tentative d'accès à un élément du dictionnaire params qui n'existe pas est en cours.
4.4. Vérification de la sortie de l'agent
Une autre source d'erreur peut être que le plug-in de vérification ne génère aucune donnée. Cela peut également être vérifié en ligne de commande :
Si vous recevez ici un message d'erreur au lieu d'une chaîne contenant les données de mesure actuelles, utilisez ce message d'erreur pour corriger le problème.
5. Fichiers et répertoires
5.1. Répertoires
| Chemin d'accès au fichier | Description |
|---|---|
|
Répertoire de base pour le stockage des fichiers de plug-in. |
|
Emplacement de stockage des fichiers exécutables. |
|
Emplacement de stockage des fichiers de jeux de règles. |
|
Emplacement de stockage des fichiers de configuration des appels. |
|
Emplacement de stockage des plug-ins de vérification basés sur des agents. |
|
Les agents spéciaux standard sont installés ici. |
|
Stockage des agents spéciaux que vous avez modifiés. |
|
Emplacement de stockage de vos propres programmes ou scripts qui doivent figurer dans le chemin de recherche et qui peuvent être exécutés directement sans spécifier de chemin d'accès. Si un programme se trouve à la fois dans |
5.2. Regroupements disponibles dansOther integrations
| Nom | Description |
|---|---|
|
Surveillance des applications |
|
Surveillance du cloud |
|
Surveillance des systèmes de gestion de configuration |
|
Surveillance des bases de données |
|
Tout ce qui ne rentre pas dans les autres catégories |
|
Surveillance de l'environnement et des environs |
|
Surveillance du système d'exploitation Linux |
|
Surveillance du réseau |
|
Surveillance des intergiciels |
|
Surveillance des systèmes de notification |
|
Surveillance du système d'exploitation en général |
|
Surveillance des périphériques |
|
Surveillance de l'alimentation électrique |
|
Surveillance du matériel serveur |
|
Surveillance des systèmes de stockage |
|
Surveillance synthétique |
|
Surveillance des environnements de virtualisation |
|
Surveillance du système d'exploitation Windows |
