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. Pourquoi se donner la peine de créer ses propres checks ?
Grâce au grand nombre de plugins de supervision fournis en standard, Checkmk est déjà en mesure de surveiller une grande quantité de données pertinentes. Néanmoins, chaque environnement informatique est unique, ce qui fait que des exigences très spécifiques apparaissent souvent. Avec les checks locaux, vous pouvez créer vos propres services rapidement et facilement en apportant de petites extensions à l'agent sur l'ordinateur hôte cible.
Ces plugins locaux se distinguent des autres contrôles sur un point important : leur état est déterminé directement sur l'ordinateur hôte où les données sont récupérées.
Cela élimine la nécessité de créer des checks locaux à l'aide de Python, et vous êtes entièrement libre de choisir le langage de script. Les checks locaux offrent également une grande liberté aux administrateurs de serveurs. Les administrateurs de supervision n'ont qu'à décider s'ils souhaitent inclure de nouveaux checks locaux en tant que services.
Vous pouvez combiner le mécanisme fourni par les checks locaux avec toutes les méthodes prises en charge par Checkmk pour le transport des données d’agent : programmes source de données, agents spéciaux, données ferroutées et fichiers spool. Les données de toutes les sources sont fusionnées, mais des conflits surviendront si le nom du service est (par inadvertance) attribué deux fois — c’est pourquoi vous devez vous assurer que chaque nom de service est unique. |
2. Rédaction d'un check local simple
2.1. Création du script
Un check local peut être écrit dans n'importe quel langage de programmation pris en charge par l'ordinateur hôte cible. Le script doit être conçu de manière à ce que chaque check génère une ligne d'état composée de quatre parties. Voici un exemple :
0 "My service" myvalue=73 My output text which may contain spacesLes quatre parties sont séparées par des espaces et ont les significations suivantes :
| Exemple de valeur | Signification | Description |
|---|---|---|
|
État |
L'état du service est indiqué par un nombre : |
|
Nom du service |
Le nom du service tel qu'il apparaît dans Checkmk, entre guillemets doubles dans la sortie de la vérification. |
|
Valeur et métriques |
Valeurs des métriques pour les données. Vous trouverez plus d'informations sur la construction dans le chapitre consacré aux métriques. Il est également possible de coder un signe moins si le check ne produit aucune métrique. |
|
Détails de l'état |
Détails de l'état tels qu'ils s'afficheront dans Checkmk dans le champ « Summary ». Cette partie peut également contenir des espaces. |
Jusqu’à la version Checkmk 2.4.0 p4, il doit toujours y avoir exactement un espace ( |
Si vous avez des doutes quant à un résultat possible, vous pouvez simplement le tester en écrivant un petit script avec l'instruction echo.
Insérez le résultat que vous souhaitez tester dans l'instruction echo.
Notre exemple utilise des guillemets doubles à l'extérieur, car les variables à l'intérieur (variables d'environnement et celles définies dans le script) sont évaluées.
Par conséquent, vous devez encadrer les guillemets du nom du service avec \ afin que ces caractères ne soient pas interprétés par le shell comme le début et la fin d'une chaîne (et donc supprimés de la sortie) :
Pour les ordinateurs hôtes Windows, un tel script ressemblera beaucoup à ceci :
@echo off
echo 0 "My 1st service" - This static service is always OKLes deux scripts produisent le même résultat en sortie :
0 "My 1st service" - This static service is always OKPour Checkmk, seule cette sortie est pertinente, et non la manière dont vous l'avez générée.
À propos, vous pouvez écrire autant de sorties que vous le souhaitez dans un script. Chaque ligne de sortie aura son propre service créé dans Checkmk. Par conséquent, aucun caractère de nouvelle ligne n'est autorisé dans la sortie, à moins qu'ils ne soient masqués, par exemple pour une sortie sur plusieurs lignes dans Checkmk.
Pour savoir comment vérifier si le script local sera correctement exécuté par l'agent, veuillez vous reporter à la section Analyse des erreurs.
Si le noyau Nagios est utilisé (toujours dans la version communautaire de Checkmk), les caractères spéciaux suivants ne sont pas autorisés dans le nom du service
:
|
2.2. Distribution du script
Une fois le script écrit, il peut être distribué aux ordinateurs hôtes concernés. Le chemin d'accès utilisé dépendra du système d'exploitation. Vous trouverez une liste des chemins d'accès dans la section Fichiers et répertoires ci-dessous.
N'oubliez pas de rendre le script exécutable sur les systèmes de type Unix. Le chemin d'accès indiqué dans cet exemple concerne Linux (paquet d'agent avec les paramètres par défaut) :
Si vous utilisez la boulangerie d’agents, le script peut être distribué à l'aide d'une procédure basée sur des règles. Vous trouverez plus d'informations sur la création de règles dans le chapitre « Distribution via la boulangerie d’agents ».
2.3. Ajout du service à la supervision
À chaque invocation de l’agent Checkmk, le check local contenu dans le script sera également exécuté et ajouté à la sortie de l’agent. La reconnaissance du service fonctionne également automatiquement, comme pour les autres services :

Une fois le service ajouté à la supervision et les modifications activées, la mise en place du service que vous avez créé vous-même à l’aide d’un check local sera terminée. Si un problème survient lors de la reconnaissance du service, l’analyse des erreurs peut vous aider.
3. Métriques
3.1. Définition des métriques
Vous pouvez également définir des métriques dans un check local. La syntaxe la plus concise pour les données de métriques est la suivante :
metricname=valueoù «value» correspond à la valeur actuelle.
La syntaxe complète pour les données métriques est la suivante :
metricname=value;warn;crit;min;maxIci, warn et crit définissent les valeurs seuils (supérieures).
Pour que ces valeurs seuils s’affichent dans le graphique, le calcul dynamique doit être activé (état P).
L’état est alors calculé à l’aide de Checkmk.
Les derniers paramètres spécifiés pour min et max fixent la plage de valeurs.
Un exemple complet pourrait donc se présenter comme suit :
count=73;80;90;0;100Les valeurs sont séparées par des points-virgules.
Si une valeur n’est pas requise, le champ reste vide ou est omis à la fin, comme dans les exemples suivants pour warn, crit et max :
count=42;;;0Dans les éditions commerciales,
les valeurs pour |
3.2. Noms et unités utilisés par les métriques
Les définitions de métriques pour les checks locaux ne diffèrent pas de celles des autres types de checks. Au final, vous disposez de trois options pour attribuer des unités et des noms faciles à comprendre aux métriques :
Vous accédez à des définitions de métriques existantes qui « correspondent » à l’objectif recherché.
Vous créez vos propres métriques de manière ad hoc et unique — cela suffit souvent pour les simples compteurs.
Vous créez vos propres métriques et enregistrez une définition de métrique — cela vous offre la plus grande flexibilité.
Utilisation des définitions de métriques existantes
Le moyen le plus simple d’obtenir des unités adaptées, une légende ajustée automatiquement et souvent un Perf-O-Meter consiste à utiliser des définitions de métriques existantes.
Dans cet article, certains exemples utilisent les identifiants humidity ou temperature.
Il existe des définitions de métriques prédéfinies pour ces deux paramètres (humidité et température), qui fournissent aux métriques les unités correctes.
Dans les deux cas, la définition de la métrique fournit un Perf-O-Meter et les légendes des graphiques affichent alors les degrés Celsius et l’humidité relative en pourcentage.
Les définitions de métriques fournies les plus importantes se trouvent sur ~/lib/python3/cmk/plugins/collection/graphing (GitHub), d’autres sur ~/lib/python3/cmk/plugins/*/graphing (GitHub) et les unités utilisées sur ~/lib/python3/cmk/gui/plugins/metrics/unit.py (GitHub).
Il est souvent utile de rechercher des définitions de métriques ayant une correspondance exacte, car Checkmk fournit également des graphiques combinés pour les métriques associées.
Définition de métriques ad hoc
Dans les premiers exemples présentés dans cet article pour les métriques, nous avons utilisé des noms tels que myvalue, count ou metricname.
En l’absence d’une définition de métrique appropriée, ceux-ci se voient attribuer une majuscule initiale dans la légende du graphique et les traits de soulignement sont remplacés par des espaces.
Ainsi, outgoing_queue_size devient Outgoing queue size, ce qui est plus facile à lire.
Étant donné qu’un simple compteur ne nécessite pas d’unité, l’identifiant judicieusement choisi remplit déjà son rôle ici sans qu’il soit nécessaire de définir une métrique supplémentaire.
Si des unités sont réellement requises, vous devrez peut-être les inclure dans le nom.
Cela devient problématique si la tentative de définir une métrique ad hoc a par inadvertance l'effet expliqué dans la section précédente et attribue une définition de métrique existante.
La confusion peut atteindre son paroxysme notamment lorsque les unités ne correspondent pas : par exemple, une métrique fournie utilise une échelle en pourcentage avec des nombres à virgule flottante compris entre 0 et 100 %, mais la plage de valeurs de votre check local fournit un nombre sans limite sous forme de nombre à virgule fixe.
Ou bien vous disposez d’une file pour les requêtes en cours (Current requests queue), que vous souhaitez simplement nommer « current » : cela entraînerait l’attribution de la définition de la métrique relative à l’intensité électrique.
Ainsi, « current_requests_queue » serait un bien meilleur choix dans ce cas.
Vous pouvez jouer la carte de la sécurité en ajoutant un préfixe, par exemple : « mycompany_current_requests_queue ».
Rédaction de vos propres définitions de métriques
Si vous avez des exigences particulières, par exemple si vous avez besoin de graphiques avec une légende et un Perf-O-Meter, vous devrez créer vos propres définitions de métriques. Consultez le chapitre consacré aux métriques dans l'article sur la programmation de plugins de supervision basés sur des agents
3.3. Métriques multiples
Vous pouvez également générer plusieurs métriques.
Dans les définitions, celles-ci sont séparées par le caractère « pipe » (|), par exemple comme ceci :
count1=42|count2=23Sur les ordinateurs hôtes Windows, vous devez faire précéder ces barres verticales dans le script d'un accent circonflexe (^) afin que ces barres apparaissent également dans la sortie :
@echo off
echo 0 "My 2nd service" count1=42^|count2=23 A service with 2 graphsUne sortie complète avec deux métriques ressemblera alors à ceci :
Une fois que vous aurez également ajouté le nouveau service à la supervision, vous verrez, dans la liste des services, le texte correspondant aux détails de l'état dans le champ « Summary ». En cliquant sur le service, vous afficherez la page contenant ses détails. Les métriques sont affichées dans le champ « Details », et en dessous, vous verrez les graphiques du service générés automatiquement par Checkmk :

Cet exemple utilise une évaluation sur l'ordinateur hôte ( |
3.4. Calcul dynamique de l'état
Dans les sections précédentes, vous avez appris à fournir des valeurs pour les métriques et à les utiliser pour générer des graphiques. La suite logique consiste désormais à utiliser les valeurs de seuil supplémentaires transmises pour un calcul dynamique de l'état du service. C'est exactement ce que permet Checkmk afin de rendre le traitement des données reçues cohérent avec bon nombre des états générés via les plugins.
Si, dans le premier champ de la sortie, qui détermine l'état, vous transmettez la lettre P au lieu d'un nombre, l'état du service sera calculé sur la base des valeurs seuils transmises.
En plus de la valeur réelle, les valeurs seuils transmises sont alors également affichées sous forme de lignes jaunes et rouges dans le graphique.
Ce calcul dynamique ne signifie pas que les valeurs seuils peuvent être modifiées via les règles de supervision définies dans Checkmk. Les valeurs seuils fournies dans le check local sont toujours utilisées pour le calcul proprement dit. |
Le résultat ressemblerait alors à ceci :
… et l'affichage dans une vue de service comme ceci :

Cet affichage diffère du précédent sur deux points :
Pour les services dont l'état est « WARN » (En attente de métriques) ou « CRIT » (Métriques manquantes), l'Summarys du service affiche toutes les informations importantes relatives aux métriques (nom, valeur, valeurs seuils). Cela signifie que vous pouvez toujours voir comment cet état a été calculé à partir d'une valeur. Pour tous les autres états, les informations relatives aux métriques ne s'affichent que dans le champ « Details » (Métriques).
Si aucune métrique n'est transmise, l'état du service sera toujours « OK ».
Alternance entre l'évaluation dynamique et statique de l'état
Il peut être utile de basculer entre l’évaluation dynamique et statique de l’état dans le script qui fournit le check local.
Prenons par exemple un script de sauvegarde qui écrit un fichier spool au format du check local.
L’évaluation de l’état en fonction de la durée de la sauvegarde doit être dynamique, et le script doit donc écrire « P » :
P "Backup stuff" duration=2342;1800;3600 Successfully created the backup. Good luck restoring.Cependant, si la sauvegarde échoue après un court laps de temps, l’état est déterminé par la valeur de retour du script de sauvegarde et non par des valeurs seuils. Dans ce cas, le script doit définir l’état de manière statique à l’aide d’un nombre :
2 "Backup stuff" duration=123;1800;3600 Backup failed. Nuff said.Dans ce cas, il est tout simplement logique qu’aucune valeur seuil ne s’affiche dans le graphique, puisqu’il ne s’agit pas de la durée requise jusqu’à la sauvegarde (échouée), mais du fait que la sauvegarde n’a pas abouti.
3.5. Valeurs seuils supérieures et inférieures
Certains paramètres ont non seulement des valeurs seuils supérieures, mais aussi des valeurs seuils inférieures. L'enregistrement de l'humidité en est un exemple. Dans de tels cas, la check local offre la possibilité de passer deux valeurs seuil pour chacun des états « WARN » et « CRIT ». Celles-ci sont séparées par deux points et représentent respectivement les valeurs seuils inférieures et supérieures.
Dans la syntaxe générale, cela se présente comme suit :
metricname=value;warn_lower:warn_upper;crit_lower:crit_upper… dans l'exemple ci-dessous :
… et dans l'affichage d'une vue de service comme ceci :

Si vous ne vous intéressez qu'aux valeurs de seuil inférieures, omettez les champs correspondant aux valeurs de seuil supérieures :
Avec cette sortie, vous spécifiez que le service doit passer à l'état « WARN » si la valeur est inférieure à 40 et à l'état « CRIT » si elle est inférieure à 30 : le service recevra donc l'état « WARN » si la valeur spécifiée est 37.
Le système de métriques et de graphiques de Checkmk est limité aux valeurs seuils supérieures pour des raisons de simplicité. Cela signifie que, bien que la détermination de l'état d'un service fonctionne comme prévu, les informations affichées dans le composant de métriques et de graphiques ignorent les valeurs seuils inférieures. C'est pourquoi des éléments tels que les lignes jaunes et rouges dans les graphiques, les Perf-O-Meters et les « Service performance data » sont totalement absents de l'interface graphique de Checkmk lorsque seuls les valeurs seuils inférieures sont utilisées. |
3.6. Sorties sur plusieurs lignes
L'option permettant de répartir une sortie sur plusieurs lignes est également disponible.
Comme Checkmk fonctionne sous Linux, vous pouvez utiliser la séquence d'échappement '\n' pour forcer un saut de ligne.
Même si, en raison du langage de script, la barre oblique inversée elle-même doit être masquée, elle sera correctement interprétée par Checkmk :
Dans les détails du service, ces lignes supplémentaires seront visibles sous l'Summary :

4. Exécution asynchrone
Le résultat des checks locaux, tout comme celui des plugins d'agent, peut être mis en cache. Cela peut s'avérer nécessaire si un script nécessite un temps de traitement plus long. Un tel script est alors exécuté de manière asynchrone et uniquement à un intervalle de temps défini, et le dernier résultat est mis en cache. Si l'agent est interrogé à nouveau avant l'expiration du délai, il utilise ce cache pour le check local et le renvoie dans la sortie de l'agent.
La mise en cache n'est disponible que pour AIX, FreeBSD, Linux, OpenWrt et Windows. Sur les autres plateformes, utilisez des tâches cron en combinaison avec le répertoire spool. |
4.1. Configuration sous Linux
Sous Linux ou un autre système d'exploitation de type Unix, tout plugin peut être exécuté de manière asynchrone. Pour une check local, la configuration nécessaire est très similaire à celle d'un plugin. Pour ce faire, créez un sous-répertoire portant le nom du nombre de secondes pendant lesquelles vous souhaitez que la sortie soit mise en cache et placez votre script dans ce sous-répertoire.
Dans l'exemple suivant, le check local ne sera exécuté que toutes les 10 minutes (600 secondes) :
Les données mises en cache sont écrites dans un répertoire de cache.
Pour un service fournissant des données mises en cache, les informations spécifiques au cache sont ajoutées à la vue du service :

4.2. Configuration sous Windows
Sous Windows, la configuration est également similaire à celle d'un plugin d'agent. Au lieu d'utiliser un sous-répertoire spécial comme sous Linux et autres, les options sont définies dans un fichier de configuration :
Comme vous pouvez le voir ci-dessus, sous Windows, vous pouvez configurer l'exécution asynchrone (avec async) et l'intervalle de temps (avec cache_age) séparément.
Sinon, sous Windows, vous pouvez également effectuer la configuration dans la boulangerie d’agents.
5. Distribution via la boulangerie d’agents
Si vous utilisez déjà la boulangerie d’agents dans les éditions commerciales, vous pouvez également distribuer les scripts avec des checks locaux à plusieurs ordinateurs hôtes de cette manière.
Pour ce faire, créez d'abord le répertoire custom sur le serveur Checkmk en tant qu'utilisateur de l'instance sous ~/local/share/check_mk/agents/, puis une arborescence de sous-répertoires pour chaque paquet de checks locaux :
Dans l'exemple ci-dessus, le répertoire du paquet est mycustompackage.
En dessous, le répertoire lib indique si le script est un plugin de supervision ou un check local.
Le répertoire local qui suit attribue ensuite explicitement le fichier.
Placez le script avec le check local dans ce répertoire.
Sous Linux, vous pouvez configurer l'exécution asynchrone de manière analogue à ce qui est décrit dans le chapitre précédent en créant désormais un répertoire sous |
Dans l'environnement de configuration de Checkmk, le répertoire de paquets mycustompackage apparaîtra comme nouvelle option :
Ouvrez Setup > Agents > Windows, Linux, Solaris, AIX, créez une nouvelle règle avec Agents > Agent rules > Generic agent options > Deploy custom files with agent et sélectionnez le paquet nouvellement créé :

Checkmk intégrera alors automatiquement le check local de manière correcte dans le paquet d'installation du système d'exploitation approprié. Une fois les modifications activées et l'agent compilé, la configuration sera terminée. Il ne reste plus qu'à déployer les agents.
6. Analyse des erreurs
6.1. Test du script
Si vous rencontrez des problèmes avec un script que vous avez écrit vous-même, vous devriez vérifier les sources d'erreur potentielles suivantes :
Le script se trouve-t-il dans le bon répertoire ?
Le script est-il exécutable et les autorisations d'accès sont-elles correctes ? Ceci est particulièrement important si vous n'exécutez pas l'agent ou le script sous le compte root ou LocalSystem.
-
La sortie est-elle conforme à la syntaxe indiquée ? La sortie du check local doit respecter la syntaxe décrite dans les chapitres Création du script et Métriques. Dans le cas contraire, une exécution sans erreur ne peut être garantie.
Des problèmes et des erreurs peuvent notamment survenir lorsqu’un check local est destiné à effectuer une tâche qui nécessite un plugin de supervision à part entière, par exemple lorsque la sortie du check local lui-même contient un en-tête de section ou la définition d’un nom de domaine tel qu’utilisé lors du transport de données ferroutées.
Sous Linux, lorsque le script de l’agent ou le plugin d’agent est appelé directement dans un shell, les variables d’environnement disponibles peuvent être différentes de celles utilisées lors d’un appel par l’Agent Controller de l’agent Checkmk. Sous Windows, le contrôleur d'agent s'exécute également sous le compte LocalSystem, mais l'appel dans le terminal est effectué sous un utilisateur normal ou un administrateur. Outre l'environnement différent, cela peut signifier que des autorisations font défaut. Afin de pouvoir analyser la sortie du script de l'agent dans des conditions aussi proches que possible de celles dans lesquelles l'agent Checkmk est appelé, vous devriez utiliser l'Agent Controller en mode dump si possible. |
6.2. Test de la sortie de l'agent sur l'ordinateur hôte cible
Si le script lui-même est correct, l'agent peut être exécuté sur l'ordinateur hôte.
Avec les systèmes d'exploitation de type Unix tels que Linux, BSD, etc., l'instruction ci-dessous est disponible.
L'option `-A` permet de spécifier le nombre de lignes supplémentaires à afficher après un résultat positif.
Ce nombre peut être personnalisé en fonction du nombre de lignes de sortie attendues :
Dans la dernière ligne, vous pouvez reconnaître un service mis en cache grâce aux informations « cached » qui précèdent, indiquant l'heure Unix actuelle et l'intervalle d'exécution en secondes.
Sous Windows, vous pouvez obtenir un résultat très similaire avec PowerShell et le Cmdlet Select-String, comme avec l’instruction grep sous Linux. Dans l’instruction suivante, les deux chiffres situés après le paramètre Context déterminent le nombre de lignes à afficher avant et après le résultat :
Selon l’environnement, le langage de programmation utilisé, la version de Windows et certaines autres conditions, vous êtes souvent confronté au jeu de caractères UTF-16 sous Windows. De plus, la combinaison des caractères Carriage Return et Line Feed pour les sauts de ligne y est fréquente. Cependant, Checkmk, en tant qu’application Linux, s’attend à du UTF-8 et à de simples Line Feeds, sans aucune exception. Notre article sur le répertoire spool comprend un chapitre expliquant le dépannage des problèmes liés au jeu de caractères. |
6.3. Test de la sortie de l'agent sur le serveur Checkmk
En guise de dernière étape, le traitement de la sortie du script peut également être testé sur le serveur Checkmk à l'aide de l'instruction « cmk » — une fois pour la reconnaissance du service :
… ainsi que le traitement de la sortie du service à l'aide d'une instruction similaire :
Pour ces deux instructions, nous avons raccourci la sortie en supprimant les lignes non pertinentes pour ce thème.
Vous pouvez également ouvrir la liste des services de l'ordinateur hôte dans la supervision, puis accéder à l'Check_MKs sur le service et à la colonne « Icons ». Vous pouvez alors sélectionner l'entrée de menu « Download agent output » pour récupérer un fichier texte contenant la sortie complète de l'agent.
Si des erreurs surviennent lors d'un check local, Checkmk les identifiera dans la sortie du service. Cela s'applique également aux métriques erronées, aux informations fausses ou incomplètes dans la sortie du script, ou à un état non valide. Ces messages d'erreur devraient vous aider à identifier rapidement les erreurs dans un script.
7. Fichiers et répertoires
Tous les chemins d'accès indiqués renvoient à des paquets d'installation qui ont été packagés avec des configurations standard. Si vous avez installé un script de l'agent non packagé ou si vous avez adapté les répertoires d'installation à l'aide d'une règle Bakery, veuillez rechercher les chemins d'accès dans le script lui-même ou adapter les chemins d'accès à votre propre configuration.
7.1. Répertoire des scripts sur l'ordinateur hôte cible
Vous stockez les contrôles locaux dans ces répertoires. Les contrôles locaux peuvent être n'importe quel fichier exécutable.
| Chemin d'accès | Système d'exploitation |
|---|---|
|
AIX, Linux et Solaris |
|
Windows |
7.2. Répertoire de cache sur l'ordinateur hôte cible
Les données mises en cache de sections individuelles, y compris la section « local », sont stockées ici et rattachées à l'agent à chaque exécution tant que les données sont valides.
| Chemin d'accès | Système d'exploitation |
|---|---|
|
AIX, Linux et Solaris |
