Checkmk
to checkmk.com
Important

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

Les plug-ins de vérification sont des modules logiciels écrits en Python qui s’exécutent sur un site Checkmk et qui créent et évaluent les services sur un hôte.

Checkmk comprend plus de 2 000 plug-ins de vérification prêts à l'emploi pour tous les matériels et logiciels imaginables. Ces plug-ins sont maintenus par l'équipe Checkmk et de nouveaux sont ajoutés chaque semaine. De plus, d'autres plug-ins sont disponibles sur Checkmk Exchange, fournis par nos utilisateurs.

Et pourtant, il peut toujours arriver qu’un appareil, une application ou simplement une certaine métrique, qui vous tient à cœur, ne soit pas encore couverte par l’un de ces plug-ins existants — peut-être simplement parce qu’il s’agit d’un élément développé au sein de votre organisation et que, par conséquent, personne d’autre ne peut en disposer. Dans l’article consacré à l’introduction au développement d’extensions pour Checkmk, vous découvrirez les options qui s’offrent à vous.

Cet article vous montre comment développer de véritables plug-ins de vérification pour l’agent Checkmk — y compris tout ce qui va avec. Il existe un article distinct pour les plug-ins de vérification basés sur SNMP.

Tip

Lors du développement d’un plug-in de vérification basé sur un agent, vous avez généralement besoin de deux plug-ins : le plug-in agent sur l’hôte surveillé, qui fournit les données, et le plug-in de vérification sur le serveur Checkmk, qui évalue ces données. Les deux doivent être écrits ensemble et optimisés l’un pour l’autre. C’est la seule façon pour qu’ils fonctionnent ensuite sans problème.

1.1. La documentation de l'API Check

Depuis la version 2.0.0 de Checkmk, une nouvelle API Check a été développée pour la programmation des plug-ins de vérification. Dans la version 2.4.0 de Checkmk, l’API Check V2 est la version actuelle. Dans cet article, nous vous montrerons comment utiliser l’API Check version 2 pour la programmation des plug-ins. Vous trouverez des informations sur la migration vers l’API Check version 2 à la fin de cet article, dans le chapitre « Migration ».

Vous pouvez accéder à tout moment à la documentation de l'API Check via l'interface utilisateur de Checkmk : Help > Developer resources > Plug-in API references. Dans la nouvelle fenêtre de navigateur, sélectionnez « Agent based ("Check API") > Version 2 » dans la barre de navigation de gauche :

“Page to access the Check API version 2 documentation.”

Vous y trouverez non seulement la documentation de l’API Check dans toutes les versions prises en charge, mais également la documentation de toutes les autres API pertinentes pour la création de plug-ins de contrôle. Dans cet article, nous utilisons non seulement l’API Check, mais également l’API Rulesets V1 lors de la création d’un ensemble de règles et l’API Graphing V1 lors de la création de définitions de métriques.

Tip

Même sans site Checkmk en fonctionnement, vous pouvez consulter une copie de la documentation de l'API des plug-ins à l'adresse docs.checkmk.com/plugin-api.

1.2. Prérequis

Si vous souhaitez programmer des plug-ins de vérification, vous aurez besoin des éléments suivants :

  • Connaissance du langage de programmation Python.

  • Une expérience avec Checkmk, en particulier en ce qui concerne les agents et les contrôles.

  • Une pratique de l'utilisation de Linux en ligne de commande.

2. Création d'un plug-in d'agent

Si vous souhaitez programmer des plug-ins pour Checkmk, il est très probable que vous ayez déjà configuré un serveur Checkmk. Si tel est le cas, vous avez sans doute également surveillé votre serveur Checkmk lui-même en tant qu’hôte.

Nous allons ici créer un scénario dans lequel il est utile que le serveur Checkmk et l'hôte surveillé soient identiques. Cela nous permet d'utiliser des requêtes Livestatus depuis l'hôte pour obtenir des informations sur les groupes d'hôtes fournis par le serveur Checkmk.

Dans l'exemple décrit, nous supposerons une organisation disposant de plusieurs sites :

  • Chacun de ces sites est représenté dans Checkmk par un groupe d'hôtes.

  • Chaque site dispose de sa propre équipe de service.

Afin de garantir que l'équipe de service appropriée puisse être avertie en cas de problème, chaque hôte doit être affecté à un site, c'est-à-dire également à un groupe d'hôtes. L'objectif de cet exemple est de mettre en place une vérification pour s'assurer qu'aucun hôte n'a oublié d'être affecté à un groupe d'hôtes.

L'ensemble du processus comprend deux étapes :

  1. Lire les informations de surveillance à partir de l’hôte. C’est le sujet de ce chapitre.

  2. Écrire un plug-in de vérification sur le site Checkmk qui évalue ces données. Nous vous montrerons cela dans le chapitre suivant.

Alors, c’est parti…​

2.1. Récupération et filtrage des informations

La première étape avant d'écrire un programme de plug-in est la recherche ! Cela signifie qu'il faut déterminer comment obtenir les informations dont vous avez besoin pour la surveillance.

Pour l'exemple choisi, nous partons du fait que le serveur Checkmk est également l'hôte. Cela signifie qu'au départ, il suffit de récupérer les données d'état via Livestatus, c'est-à-dire les données organisées en tables que Checkmk conserve en mémoire vive concernant les hôtes et les services surveillés.

Connectez-vous en tant qu'utilisateur du site et interrogez les informations sur les groupes d'hôtes à l'aide de la commande suivante :

OMD[mysite]:~$ lq "GET hostgroups"
action_url;alias;members;members_with_state;name;notes;notes_url;num_hosts;num_hosts_down;num_hosts_handled_problems;num_hosts_pending;num_hosts_unhandled_problems;num_hosts_unreach;num_hosts_up;num_services;num_services_crit;num_services_handled_problems;num_services_hard_crit;num_services_hard_ok;num_services_hard_unknown;num_services_hard_warn;num_services_ok;num_services_pending;num_services_unhandled_problems;num_services_unknown;num_services_warn;worst_host_state;worst_service_hard_state;worst_service_state
;Hamburg;myhost11,myhost22,myhost33;myhost11|0|1,myhost22|0|1,myhost33|0|1;Hamburg;;;3;0;0;0;0;0;3;123;10;0;10;99;0;14;99;0;24;0;14;0;2;2
;Munich;myhost1,myhost2,myhost3;myhost1|0|1,myhost2|0|1,myhost3|0|1;Munich;;;3;0;0;0;0;0;3;123;10;0;10;99;0;14;99;0;24;0;14;0;2;2
;check_mk;localhost;localhost|0|1;check_mk;;;1;0;0;0;0;0;1;66;0;0;0;4;0;1;4;61;1;0;1;0;1;1
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La première ligne de la sortie contient les noms des colonnes de la table hostgroups interrogée. Le point-virgule sert de séparateur. Les lignes suivantes contiennent ensuite le contenu de toutes les colonnes, également séparées par des points-virgules.

La sortie est déjà relativement confuse dans ce petit exemple et contient des informations qui ne sont pas pertinentes pour notre cas. En général, vous devriez laisser l'interprétation des données à Checkmk. Cependant, un filtrage préalable sur l'hôte peut réduire le volume de données à transférer si toutes ne sont pas réellement nécessaires. Dans ce cas, limitez donc la requête aux colonnes pertinentes (Columns), aux noms des groupes d'hôtes (name) et aux hôtes de ces groupes (members) :

OMD[mysite]:~$ lq "GET hostgroups\nColumns: name members"
Hamburg;myhost11,myhost22,myhost33
Munich;myhost1,myhost2,myhost3
check_mk;localhost
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

L'interface Livestatus attend que toutes les commandes et tous les en-têtes soient placés sur des lignes distinctes. Les sauts de ligne nécessaires sont indiqués par \n.

Dans cet exemple, il existe actuellement trois groupes d'hôtes : deux groupes pour les emplacements et un pour le groupe « check_mk ». Ce dernier contient un hôte appelé localhost.

Le groupe d'hôtes « check_mk » est une fonctionnalité spéciale au sein des groupes d'hôtes. Vous ne l'avez pas créé vous-même. Et vous ne pouvez pas ajouter activement un hôte à ce groupe. D'où vient donc ce groupe d'hôtes ? Comme, par définition, chaque hôte dans Checkmk doit appartenir à un groupe, Checkmk attribue par défaut chaque hôte que vous n'affectez pas spécifiquement à un groupe au groupe « spécial » check_mk. Dès que vous avez affecté un hôte à l'un de vos propres groupes d'hôtes, Checkmk le retire du groupe check_mk. Il n'est pas non plus possible de réaffecter un hôte au groupe d'hôtes check_mk.

Ce sont précisément ces propriétés du groupe « check_mk » qui sont utilisées dans notre exemple : Étant donné que chaque hôte doit être affecté à un emplacement, le groupe d’hôtes « check_mk » doit être vide. S’il n’est pas vide, une action est requise, c’est-à-dire que les hôtes qu’il contient doivent être affectés aux groupes d’hôtes et donc à leurs emplacements respectifs.

2.2. Intégrer la commande dans l'agent

Jusqu’à présent, en tant qu’utilisateur du site, vous avez utilisé la commande lq pour afficher les informations. Cela est utile pour comprendre les données.

Cependant, pour récupérer ces données depuis le serveur Checkmk, la nouvelle commande doit être intégrée à l’agent Checkmk sur l’hôte surveillé. Théoriquement, vous pourriez désormais modifier directement l’agent Checkmk dans le fichier `/usr/bin/check_mk_agent` et y inclure cette partie. Cette méthode présenterait toutefois l’inconvénient que votre nouvelle commande disparaîtrait à nouveau lors de la mise à jour du logiciel de l’agent, car ce fichier sera écrasé pendant la mise à jour.

Il est donc préférable de créer un plug-in d'agent. Pour cela, il vous suffit d'un fichier exécutable contenant la commande et situé dans le répertoire /usr/lib/check_mk_agent/plugins/.

Et il y a encore une chose importante : Les données ne peuvent pas être simplement affichées. Vous aurez toujours besoin d'un en-tête de section. Il s'agit d'une ligne spécialement formatée qui contient le nom du nouveau plug-in d'agent. Cet en-tête de section permet à Checkmk de reconnaître ultérieurement où commencent les données du nouveau plug-in d'agent et où se terminent celles du plug-in précédent. C'est plus simple lorsque le plug-in d'agent, l'en-tête de section et le plug-in de vérification portent le même nom — même si cela n'est pas obligatoire.

Vous devrez donc tout d’abord choisir un nom significatif pour votre nouveau plug-in de vérification. Ce nom ne peut contenir que des lettres minuscules (uniquement a-z, sans trémas ni accents), des traits de soulignement et des chiffres, et doit être unique. Évitez les conflits de noms avec les plug-ins de vérification existants. Si vous souhaitez connaître les noms déjà existants, vous pouvez les répertorier sur un site Checkmk via la ligne de commande à l’aide de la commande « cmk -L » :

OMD[mysite]:~$ cmk -L
3par_capacity               agent      HPE 3PAR: Capacity
3par_cpgs                   agent      HPE 3PAR: CPGs
3par_cpgs_usage             agent      HPE 3PAR: CPGs Usage
3par_hosts                  agent      HPE 3PAR: Hosts
3par_ports                  agent      HPE 3PAR: Ports
3par_remotecopy             agent      HPE 3PAR: Remote Copy
3par_system                 agent      HPE 3PAR: System
3par_volumes                agent      HPE 3PAR: Volumes
3ware_disks                 agent      3ware ATA RAID Controller: State of Disks
3ware_info                  agent      3ware ATA RAID Controller: General Information
3ware_units                 agent      3ware ATA RAID Controller: State of Units
acme_agent_sessions         snmp       ACME Devices: Agent Sessions
acme_certificates           snmp       ACME Devices: Certificates
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La sortie ci-dessous n'affiche que les premières lignes d'une très longue liste. Grâce à l'utilisation de préfixes, l'affectation de nombreux plug-ins de vérification est déjà facilement identifiable ici. L'utilisation de préfixes est donc également recommandée pour vos propres plug-ins de vérification. À noter que la deuxième colonne indique comment le plug-in de vérification concerné obtient ses données.

Un nom approprié pour le nouveau plug-in de vérification de notre exemple est myhostgroups.

Vous disposez désormais de toutes les informations nécessaires pour créer le script du plug-in d'agent. Créez un nouveau fichier myhostgroups en tant qu'utilisateur root dans le répertoire /usr/lib/check_mk_agent/plugins/ :

/usr/lib/check_mk_agent/plugins/myhostgroups
#!/bin/bash

columns="name members"
site="mysite"

echo '<<<myhostgroups:sep(59)>>>'
su - ${site} lq "GET hostgroups\nColumns: ${columns}"
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Qu'est-ce que cela signifie exactement ?

La première ligne contient le « shebang » (abréviation de « sharp » et « bang », ce dernier étant l'abréviation du point d'exclamation), grâce auquel Linux reconnaît qu'il doit exécuter le script avec le shell spécifié.

Afin de garantir la flexibilité du script, deux variables sont ensuite introduites :

  • la variable « columns », qui contient actuellement les noms des groupes et les membres associés,

  • la variable site, qui contient le nom du site Checkmk.

Utilisez la commande echo pour afficher l'en-tête de la section. Comme les colonnes du tableau sont séparées par un point-virgule, utilisez l'sep(59)e supplémentaire pour spécifier que le point-virgule est utilisé comme séparateur pour les données dans la sortie de l'agent. Le 59 correspond au code de caractère ASCII 59, le point-virgule. Sans cette e, le caractère espace (caractère ASCII 32) serait utilisé par défaut comme séparateur.

Pour pouvoir utiliser la commande lq, à laquelle vous avez accès en tant qu'utilisateur du site, dans un script exécuté par l'utilisateur root, faites-la précéder de su.

Tip

Il est possible que l'accès à lq via su pose des problèmes. Sinon, en tant qu'utilisateur root, vous pouvez également accéder à Livestatus directement dans le shell avec printf ou echo -e via un socket Unix. L'article sur Livestatus explique comment procéder.

Une dernière chose est importante une fois que vous avez créé le fichier : rendez-le exécutable :

root@linux# chmod +x /usr/lib/check_mk_agent/plugins/myhostgroups
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous pouvez tester le plug-in de l'agent directement en saisissant manuellement le chemin d'accès complet sous forme de commande :

root@linux# /usr/lib/check_mk_agent/plugins/myhostgroups
<<<myhostgroups:sep(59)>>>
Hamburg;myhost11,myhost22,myhost33
Munich;myhost1,myhost2,myhost3
check_mk;localhost
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les groupes d'hôtes qui ne contiennent aucun hôte ne sont pas répertoriés ici.

Tip

Notre exemple utilise un script shell très simple comme plug-in d'agent. Dans de nombreux cas, vous souhaiterez utiliser un langage de script ou des fichiers binaires plus faciles à maintenir. Tout ce qui est exécutable sur le système cible est autorisé. Lorsque vous utilisez Python, il y a un petit détail à noter : S'il n'y a pas de suffixe .py dans le nom du fichier, le « shebang » est évalué comme pour tous les autres langages de script. Si le suffixe .py est présent, le shebang est ignoré et l’agent Checkmk recherchera à la place l’interpréteur Python. Vous pouvez également spécifier son chemin d’accès absolu dans le fichier de configuration $MK_CONFDIR/python_path.cfg en tant que variable PYTHON3, qui diffère du Python système. Ceci est utile si un plug-in nécessite des modules Python spécifiques et, par conséquent, dépend d’un environnement virtuel Python (venv).

2.3. Test de l'agent

Les tests et le dépannage constituent les tâches les plus importantes lors de la création d'un plug-in d'agent fonctionnel. Il est préférable de procéder en trois étapes :

  1. Testez le plug-in d'agent « en mode autonome ». Vous venez de le faire dans la section précédente.

  2. Testez l'agent dans son ensemble en local.

  3. Récupérez l'agent depuis le serveur Checkmk.

Tester l'agent localement est très simple. À titre d'root, exécutez la commande « check_mk_agent » :

root@linux# check_mk_agent
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La nouvelle section doit apparaître quelque part dans la très longue sortie. Les plug-ins de l'agent sont générés par l'agent à la fin du traitement.

Vous pouvez faire défiler la sortie en ajoutant less (appuyez sur Spacebar pour faire défiler, / pour rechercher et Q pour quitter) :

root@linux# check_mk_agent | less
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous pouvez également rechercher les lignes qui vous intéressent dans la sortie. Par exemple, la commande « grep » avec l'option « -A » permet d'afficher quelques lignes supplémentaires après chaque occurrence. Cela vous permet de rechercher et d'afficher facilement la section souhaitée :

root@linux# check_mk_agent | grep -A3 '^<<<myhostgroups'
<<<myhostgroups:sep(59)>>>
Hamburg;myhost11,myhost22,myhost33
Munich;myhost1,myhost2,myhost3
check_mk;localhost
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Le troisième et dernier test s'effectue ensuite directement depuis le site Checkmk. Ajoutez l'hôte à la surveillance (par exemple via localhost), connectez-vous en tant qu'utilisateur du site, puis récupérez les données de l'agent avec cmk -d :

OMD[mysite]:~$ cmk -d localhost | grep -A3 '^<<<myhostgroups'
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Cela devrait produire le même résultat que la commande précédente.

Si cela fonctionne, votre agent est prêt. Et qu'avez-vous fait pour cela ? Vous avez créé un petit script sous le chemin /usr/lib/check_mk_agent/plugins/myhostgroups et l'avez rendu exécutable.

Tout ce qui suit se déroule désormais uniquement sur le serveur Checkmk : C'est là que vous écrivez le plug-in de vérification.

3. Création d'un plugin de vérification simple

La préparation de l'agent n'est que la moitié du travail. Vous devez maintenant indiquer à Checkmk comment traiter les informations provenant de la nouvelle section de l'agent, quels services il doit générer, quand ceux-ci doivent être envoyés à WARN ou CRIT, etc. Vous pouvez effectuer toutes ces opérations en programmant un plugin de vérification à l'aide de Python.

3.1. Préparation du fichier

Pour vos propres plug-ins de vérification, vous trouverez le répertoire de base déjà préparé dans la hiérarchie local du répertoire du site. Il s'agit de ~/local/lib/python3/cmk_addons/plugins/. Ce répertoire appartient à l'utilisateur du site et est donc accessible en écriture pour vous.

Dans ce répertoire, les plug-ins sont organisés en familles de plug-ins, dont les noms de répertoires peuvent être définis librement. Par exemple, tous les plug-ins relatifs aux appareils Cisco sont stockés dans le dossier cisco, de même que tous les plug-ins relatifs à vos groupes d’hôtes sont stockés dans le dossier myhostgroups. Cette convention permet à tous les plug-ins appartenant à la même famille de partager du code — et est utilisée exactement de la même manière par les plug-ins fournis avec Checkmk.

Dans ce sous-répertoire <plug-in_family>, d’autres sous-répertoires aux noms prédéfinis sont ensuite créés selon les besoins pour les différentes API, par exemple agent_based pour l’API Check des plug-ins de contrôle basés sur des agents. Nous présenterons à notre tour d’autres sous-répertoires pour l’API Rulesets et l’API Graphing ultérieurement.

Créez les deux sous-répertoires pour le nouveau plug-in de vérification basé sur un agent, puis accédez-y pour travailler :

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based
OMD[mysite]:~$ cd ~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous pouvez modifier votre plug-in de vérification à l'aide de n'importe quel éditeur de texte installé sur le système Linux.

Créez ici le fichier « myhostgroups.py » pour le plug-in de contrôle. La convention veut que le nom du fichier reflète le nom de la section de l'agent. Il est obligatoire que le fichier se termine par « .py », car à partir de la version 2.0.0 de Checkmk, les plug-ins de contrôle sont toujours de véritables modules Python.

Un cadre de base exécutable (téléchargeable sur GitHub), que vous allez développer étape par étape ci-après, se présente comme suit :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
#!/usr/bin/env python3

from cmk.agent_based.v2 import AgentSection, CheckPlugin, Service, Result, State, Metric, check_levels

def parse_myhostgroups(string_table):
    parsed = {}
    return parsed

def discover_myhostgroups(section):
    yield Service()

def check_myhostgroups(section):
    yield Result(state=State.OK, summary="Everything is fine")

agent_section_myhostgroups = AgentSection(
    name = "myhostgroups",
    parse_function = parse_myhostgroups,
)

check_plugin_myhostgroups = CheckPlugin(
    name = "myhostgroups",
    service_name = "Host group check_mk",
    discovery_function = discover_myhostgroups,
    check_function = check_myhostgroups,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous devez d'abord importer les fonctions et les classes requises pour les plug-ins de vérification à partir des modules Python. Pour notre exemple, nous n'importerons que ce qui sera nécessaire ou pourrait s'avérer utile dans la suite de cet article. Ici, `cmk.agent_based.v2` est utilisé pour spécifier que les modules de l'API Check V2 sont importés :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
from cmk.agent_based.v2 import AgentSection, CheckPlugin, Service, Result, State, Metric, check_levels
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

3.2. Écriture de la fonction parse

La fonction d'analyse a pour tâche d'« analyser » les données « brutes » de l'agent, c'est-à-dire de les analyser et de les découper, puis de les présenter sous une forme logiquement structurée, facile à traiter pour toutes les étapes suivantes.

Comme indiqué dans la section consacrée au test de l'agent, la section fournie par le plug-in de l'agent présente la structure suivante :

<<<myhostgroups:sep(59)>>>
Hamburg;myhost11,myhost22,myhost33
Munich;myhost1,myhost2,myhost3
check_mk;localhost

Checkmk divise déjà les lignes de la section fournie par le plug-in de l'agent en une liste de lignes en fonction du séparateur présent dans l'en-tête de la section (dans l'exemple ;) ; ces lignes sont à leur tour des listes de mots. La structure de données suivante est donc disponible dans Checkmk à la place des données brutes provenant du plug-in de l'agent :

[
    ['Hamburg', 'myhost11,myhost22,myhost33'],
    ['Munich', 'myhost1,myhost2,myhost3'],
    ['check_mk', 'localhost']
]
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans la liste interne, le premier élément contient le nom du groupe d'hôtes et le second les noms des hôtes appartenant au groupe.

Vous pouvez accéder à toutes ces informations, mais uniquement via leur position dans l'ensemble de données. Vous devrez donc toujours spécifier le nombre de crochets et le numéro de « séquence » du ou des contenus souhaités à l'intérieur de chaque crochet. Avec des volumes de données plus importants, cela devient de plus en plus complexe et il est de plus en plus difficile de garder une vue d'ensemble.

À ce stade, une fonction d’analyse offre des avantages évidents grâce à la structure qu’elle crée. Elle rend le code plus lisible, les accès sont plus performants et il est beaucoup plus facile de garder une vue d’ensemble. Elle transforme la structure de données fournie par Checkmk de telle sorte que vous pouvez accéder à chacune des valeurs individuelles par son nom (ou sa clé) à votre guise, sans avoir à parcourir à plusieurs reprises le tableau pour trouver ce que vous cherchez :

{
    'Hamburg': {'members': 'myhost11,myhost22,myhost33'},
    'Munich': {'members': 'myhost1,myhost2,myhost3'},
    'check_mk': {'members': 'localhost'}
}
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La convention veut que la fonction d'analyse porte le nom de la section de l'agent et commence par parse_. Elle reçoit string_table comme seul argument. Notez que vous n'êtes pas libre de choisir l'argument ici — il doit être nommé exactement ainsi.

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def parse_myhostgroups(string_table):
    # print(string_table)
    parsed = {}
    for line in string_table:
        parsed[line[0]] = {"members": line[1]}
    # print(parsed)
    return parsed
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Avec def, vous spécifiez en Python qu’une fonction doit être définie ci-dessous. parsed = {} crée le dictionnaire avec la structure de données améliorée. Dans notre exemple, nous allons parcourir chaque ligne, élément par élément. Le groupe d’hôtes suivi des membres du groupe d’hôtes est extrait de chaque ligne et assemblé en une entrée pour le dictionnaire.

Le dictionnaire est ensuite renvoyé avec `return parsed`.

Tip

Dans l'exemple ci-dessus, vous trouverez deux lignes commentées. Si vous les commentez ultérieurement lors du test du plug-in de vérification, les données avant et après l'exécution de la fonction parse s'afficheront sur la ligne de commande. Cela vous permet de vérifier si la fonction fait réellement ce qu'elle est censée faire.

3.3. Création de la section agent

Pour que toute cette procédure ait un effet, vous devez créer la nouvelle section d'agent avec la nouvelle fonction parse. C'est la seule façon pour qu'elle soit reconnue et prise en compte par Checkmk. Pour ce faire, créez la section d'agent en tant qu'instance de la classe AgentSection :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
agent_section_myhostgroups = AgentSection(
    name = "myhostgroups",
    parse_function = parse_myhostgroups,
)
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Il est important ici que le nom de la section corresponde exactement à l'en-tête de section dans la sortie de l'agent. À partir de ce moment, chaque plug-in de vérification qui utilise la section « myhostgroups » reçoit la valeur de retour de la fonction parse. En règle générale, il s'agira du plug-in de vérification du même nom. Mais d'autres plug-ins de vérification peuvent également s'abonner à cette section, comme nous le montrerons dans l'extension du plug-in de vérification.

À ce propos : si vous souhaitez en savoir plus, vous pouvez consulter la documentation de l’API Check à ce stade. Vous y trouverez une description détaillée de cette classe, ainsi que des classes, fonctions et objets qui seront utilisés plus loin dans cet article.

“Check API documentation for the ‘AgentSection’ class.”

3.4. Création d’un plug-in de contrôle

Pour que Checkmk reconnaisse qu’il existe un nouveau plug-in de contrôle, celui-ci doit être créé. Pour ce faire, il suffit de créer une instance de la classe CheckPlugin.

Vous devez toujours spécifier au moins quatre éléments :

  1. name : le nom du plug-in de contrôle. Le plus simple est d’utiliser le même nom que celui de votre nouvelle section d’agent. De cette manière, le contrôle défini plus loin dans la fonction de contrôle sait automatiquement quelle section il doit évaluer.

  2. service_name : Le nom du service tel qu’il doit apparaître dans la surveillance.

  3. discovery_function : La fonction permettant de détecter les services de ce type (nous y reviendrons dans un instant).

  4. check_function : La fonction permettant d'effectuer la vérification proprement dite (nous y reviendrons dans un instant).

Le nom de l'instance doit commencer par check_plugin_. Il se présente alors comme suit :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
check_plugin_myhostgroups = CheckPlugin(
    name = "myhostgroups",
    service_name = "Host group check_mk",
    discovery_function = discover_myhostgroups,
    check_function = check_myhostgroups,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Il est préférable de ne pas essayer cela pour l'instant, car vous devez d'abord écrire les fonctions discover_myhostgroups et check_myhostgroups. Celles-ci doivent apparaître dans le code source avant la création de la section agent et du plug-in de vérification, comme décrit ci-dessus.

Important

Si le noyau Nagios est utilisé (toujours dans la communauté Checkmk), les caractères spéciaux suivants ne sont pas autorisés dans le nom du service :
`;~!$%^&*|\'"<>?,()=
Si ces caractères apparaissent tout de même dans les noms de service, ils sont simplement supprimés dans Checkmk.
Dans les éditions commerciales avec Checkmk Micro Core (CMC), le point-virgule (; ) n'est pas autorisé dans le nom. Le symbole du dollar ($ ) n'est affiché que s'il est échappé par une barre oblique inversée (\ ).
Ce qui suit s'applique à toutes les éditions : Si des guillemets simples apparaissent dans le nom du service, celui-ci ne sera pas détecté par la reconnaissance de service !

3.5. Écriture de la fonction de découverte

Une fonctionnalité particulière de Checkmk est la détection automatique des services à surveiller. Pour que cela fonctionne, chaque plug-in de vérification doit définir une fonction qui utilise la sortie de l'agent pour déterminer si un service de ce type ou quels services de ce type doivent être créés pour l'hôte en question.

La fonction de découverte est toujours appelée lorsqu’une découverte de services est effectuée pour un hôte. Elle décide alors si des services doivent être créés, et lesquels. Dans le cas standard, elle reçoit exactement un argument nommé section. Celui-ci contient les données de la section agent dans un format préparé par la fonction parse.

Par conséquent, implémentez la logique simple suivante : si la section agent myhostgroups existe, créez également un service adapté. Celui-ci apparaîtra alors automatiquement sur tous les hôtes sur lesquels le plug-in agent est déployé.

Pour les plug-ins de vérification qui ne créent qu’un seul service par hôte, aucune autre information n’est requise :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def discover_myhostgroups(section):
    yield Service()
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La fonction de découverte doit renvoyer un objet de type « service » pour chaque service à créer à l'aide de « yield » (et non de « return »). En Python, « yield » a la même fonction que « return » : les deux renvoient une valeur à la fonction appelante. La différence décisive réside dans le fait que « yield » mémorise où la fonction en est dans le traitement des données. L'appel suivant reprend après la dernière instruction « yield » — et ne recommence pas depuis le début. Cela signifie que non seulement le premier résultat est lu (comme ce serait le cas avec « return »), mais tous les résultats dans l’ordre (cet avantage prendra tout son sens plus loin dans notre exemple avec la découverte de services).

3.6. Écriture de la fonction de vérification

Vous pouvez maintenant passer à la fonction de vérification proprement dite, qui utilise la sortie actuelle de l'agent pour déterminer l'état que le service doit prendre et qui peut fournir des informations supplémentaires.

L'objectif de la fonction de vérification est de mettre en place une vérification permettant de déterminer si un groupe d'hôtes a été attribué à un hôte. Pour ce faire, elle vérifie si le groupe d'hôtes check_mk contient des hôtes. Si tel est le cas, le service doit recevoir l'état « CRIT ». Dans le cas contraire, tout est « OK », tout comme l'état du service.

Voici l'implémentation :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups(section):
    attr = section.get("check_mk")
    hosts = attr["members"] if attr else ""
    if hosts:
        yield Result(state=State.CRIT, summary=f"Default group is not empty; Current member list: {hosts}")
    else:
        yield Result(state=State.OK, summary="Everything is fine")
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Et voici maintenant l'explication : La fonction `check_myhostgroups()` récupère d'abord la valeur associée à la clé `check_mk` et la stocke dans la variable `attr`. Ensuite, la variable `hosts` est liée à la valeur `members` si celle-ci existe. S'il n'y a pas de `members`, `hosts` reste vide.

Cette opération est suivie d’une requête if pour l’évaluation proprement dite :

  • Si la variable hosts contient des données, c'est-à-dire si le groupe d'hôtes check_mk n'est pas vide, l'état du service passe à CRIT et un texte d'avertissement est généré. Ce texte contient également une liste des noms d'hôtes de tous les hôtes appartenant au groupe d'hôtes check_mk. La chaîne F-String de Python est utilisée pour générer le texte avec des expressions ; elle est ainsi nommée car la chaîne est précédée de la lettre f.

  • Si la variable hosts est vide, c'est-à-dire s'il n'y a aucun hôte dans le groupe d'hôtes check_mk, l'état du service passe alors à « OK ». Dans ce cas, un message approprié est également généré.

Une fois la fonction de vérification créée, le plug-in de vérification est prêt.

Le plug-in de vérification ainsi que le plug-in d'agent sont disponibles sur GitHub.

3.7. Test et activation du plug-in de vérification

Tout d'abord, assurez-vous que votre plug-in est syntaxiquement correct :

OMD[mysite]:~$ cmk-validate-plugins
Agent based plugins loading succeeded, Active checks loading succeeded, Special agents
loading succeeded, Rule specs loading succeeded, Rule specs forms creation succeeded,
Referenced rule specs validation succeeded, Loaded rule specs usage succeeded
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les tests supplémentaires et l'activation du plug-in s'effectuent en ligne de commande à l'aide de la commande `cmk`. Commencez par tester la découverte de service avec l'option `-I`. L'ajout de l'option `v` (pour un mode détaillé) générera une sortie détaillée. L'option `--detect-plugins` limite l'exécution de la commande à ce plug-in de vérification et l'localhoste à cet hôte spécifique :

OMD[mysite]:~$ cmk -vI --detect-plugins=myhostgroups localhost
Discovering services and host labels on: localhost
localhost:
+ FETCHING DATA
No piggyback files for 'localhost'. Skip processing.
Get piggybacked data
+ ANALYSE DISCOVERED HOST LABELS
SUCCESS - Found no new host labels
+ ANALYSE DISCOVERED SERVICES
+ EXECUTING DISCOVERY PLUGINS (1)
  1 myhostgroups
SUCCESS - Found 1 services
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Comme prévu, la découverte de services reconnaît un nouveau service dans le plug-in de vérification myhostgroups.

Vous pouvez désormais tester la vérification contenue dans le plug-in de vérification :

OMD[mysite]:~$ cmk --detect-plugins=myhostgroups -v localhost
+ FETCHING DATA
No piggyback files for 'localhost'. Skip processing.
Get piggybacked data
Host group check_mk  Default group is not empty; Current member list: localhost
No piggyback files for 'localhost'. Skip processing.
[agent] Success, [piggyback] Success (but no data found for this host), execution time 1.8 sec | execution_time=1.800 user_time=0.030 system_time=0.000 children_user_time=0.000 children_system_time=0.000 cmk_time_agent=1.780
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

En exécutant la vérification, l'état du service détecté précédemment sera déterminé.

Si tout s'est déroulé comme prévu, vous pouvez activer les modifications. Si ce n'est pas le cas, vous trouverez des informations utiles dans le chapitre consacré au dépannage.

Enfin, générez une configuration mise à jour du noyau de surveillance et redémarrez-le :

OMD[mysite]:~$ cmk -R
Generating configuration for core (type nagios)...
Precompiling host checks...OK
Validating Nagios configuration...OK
Restarting monitoring core...OK
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans la surveillance Checkmk, vous trouverez désormais le nouveau service Host group check_mk sur l'hôte localhost :

The new service created in the monitoring by the check plug-in.
Étant donné que le groupe d'hôtescheck_mk n'est pas vide, le service estCRIT

Félicitations pour la création réussie de votre premier plug-in Check!

4. Extension du module de vérification

4.1. Travaux préparatoires

Le premier module de vérification, récemment achevé, doit désormais être étendu étape par étape. Jusqu’à présent, le module agent ne fournissait que des informations sur les noms et les membres des groupes d’hôtes. Afin de pouvoir évaluer l’état des hôtes et des services qui y sont exécutés, par exemple, davantage de données sont nécessaires.

Extension du plug-in d'agent

Vous allez d'abord étendre une fois le plug-in agent afin de collecter toutes les informations qui seront nécessaires pour étendre le plug-in de vérification dans les sections suivantes.

Pour connaître les informations fournies par Checkmk concernant les groupes d'hôtes, vous pouvez interroger toutes les colonnes disponibles de la table des groupes d'hôtes à l'aide de la commande suivante en tant qu'utilisateur du site :

OMD[mysite]:~$ lq "GET columns\nFilter: table = hostgroups\nColumns: name"
action_url
alias
members
members_with_state
name
notes
notes_url
num_hosts
...
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Le résultat va encore plus loin. Le tableau comporte près de 30 colonnes, et la plupart d’entre elles ont même des noms significatifs. Les colonnes suivantes présentent un intérêt particulier ici : Nombre d’hôtes par groupe (colonne num_hosts), nombre d’hôtes dans l’état « UP » (num_hosts_up), nombre de services de tous les hôtes du groupe (num_services) et nombre de services dans l’état « OK » (num_services_ok).

Il ne reste plus qu’à l’agent de fournir ces nouvelles colonnes. Pour ce faire, vous pouvez étendre le plug-in d’agent créé au chapitre précédent.

En tant qu’utilisateur root, modifiez le script du plug-in de l’agent. Comme le script a déjà placé les valeurs configurables dans des variables, il suffit de modifier uniquement la ligne commençant par columns et d’y ajouter les quatre colonnes supplémentaires récupérées :

/usr/lib/check_mk_agent/plugins/myhostgroups
#!/bin/bash

columns="name members num_hosts num_hosts_up num_services num_services_ok"
site="mysite"

echo '<<<myhostgroups:sep(59)>>>'
su - ${site} lq "GET hostgroups\nColumns: ${columns}"
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Exécutez le script pour vérifier cela :

root@linux# /usr/lib/check_mk_agent/plugins/myhostgroups
<<<myhostgroups:sep(59)>>>
Munich;myhost3,myhost2,myhost1;3;3;180;144
Hamburg;myhost22,myhost33,myhost11;3;2;132;105
check_mk;localhost;1;1;62;45
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les quatre nouvelles valeurs — séparées chacune par un point-virgule — apparaissent désormais à la fin de chaque ligne.

Grâce à cette modification, le plug-in de l'agent fournit désormais des données différentes de celles d'auparavant. À ce stade, il est important de s'assurer que, avec ces nouvelles données, le plug-in de vérification continue de fonctionner comme prévu.

Extension de la fonction d'analyse

Dans un plug-in de vérification, la fonction d’analyse est chargée de convertir les données fournies par le plug-in agent. Lors de l’écriture de la fonction d’analyse, vous n’aviez pris en compte que deux colonnes du tableau du groupe d’hôtes. Désormais, six colonnes sont fournies au lieu de deux. La fonction d’analyse doit donc être personnalisée pour traiter les quatre colonnes supplémentaires.

En tant qu’utilisateur du site, modifiez la fonction d’analyse dans le fichier myhostgroups.py, qui contient le plug-in de vérification :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def parse_myhostgroups(string_table):
    parsed = {}
    column_names = [
        "name",
        "members",
        "num_hosts",
        "num_hosts_up",
        "num_services",
        "num_services_ok",
    ]
    for line in string_table:
        parsed[line[0]] = {}
        for n in range(1, len(column_names)):
            parsed[line[0]][column_names[n]] = line[n]
    return parsed
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Tout ce qui se trouve entre parsed = {} et return parsed a été modifié ici. Tout d'abord, les colonnes à traiter sont définies sous leurs noms sous la forme d'une liste column_names. Un dictionnaire est ensuite créé dans la boucle for en générant les paires clé-valeur de chaque ligne à partir du nom de la colonne et de la valeur lue.

Cette extension n'est pas essentielle pour la fonction de vérification existante, car la structure des données dans les deux premières colonnes reste inchangée. Seules des colonnes supplémentaires sont fournies, qui ne sont pas (encore) évaluées dans la fonction de vérification.

Maintenant que les nouvelles données peuvent être traitées, vous allez également les utiliser.

4.2. Détection de services

Dans le chapitre précédent, vous avez créé une vérification très simple qui crée un service sur un hôte. Cependant, il est également très courant qu’un seul contrôle sur un hôte donne lieu à plusieurs services.

L'exemple le plus courant est celui d'un service pour un système de fichiers sur un hôte. Le plug-in de vérification nommé « df » crée un service par système de fichiers sur l'hôte. Afin de distinguer ces services, le point de montage du système de fichiers (par exemple /var) ou la lettre du lecteur (par exemple C:) est intégré au nom du service. Il en résulte un nom de service tel que Filesystem /var ou Filesystem C:. Le mot /var ou C: est désigné ici par le terme « élément ». Nous parlons donc également d’un contrôle avec des éléments.

Si vous souhaitez créer une vérification avec des éléments, vous devez implémenter les fonctions suivantes :

  • La fonction de découverte doit générer un service pour chacun des éléments à surveiller sur l'hôte.

  • Vous devez inclure l'élément dans le nom du service à l'aide du paramètre de remplacement %s (par exemple, "Filesystem %s").

  • La fonction de vérification est appelée une fois, séparément pour chaque élément, et reçoit celui-ci en tant qu’argument. À partir des données de l’agent, elle doit ensuite extraire les données pertinentes pour cet élément.

Pour tester cela en pratique, vous allez créer un service distinct pour chaque groupe d'hôtes existant.

Étant donné que le plug-in de vérification myhostgroups créé au chapitre précédent pour vérifier le groupe standard check_mk devrait continuer à fonctionner, ce plug-in de vérification reste tel quel. Pour l'extension, créez le nouveau plug-in de vérification myhostgroups_advanced dans le fichier existant myhostgroups.py. — dans un premier temps, comme précédemment, en créant une instance de la classe CheckPlugin.

Vous trouverez ici l'ancien code et le nouveau code mis en évidence :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
check_plugin_myhostgroups = CheckPlugin(
    name = "myhostgroups",
    service_name = "Host group check_mk",
    discovery_function = discover_myhostgroups,
    check_function = check_myhostgroups,
)

check_plugin_myhostgroups_advanced = CheckPlugin(
    name = "myhostgroups_advanced",
    sections = [ "myhostgroups" ],
    service_name = "Host group %s",
    discovery_function = discover_myhostgroups_advanced,
    check_function = check_myhostgroups_advanced,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Afin de distinguer le nouveau plugin de vérification de l'ancien, on lui attribue un nom unique avec l'option « myhostgroups_advanced ». Le paramètre « sections » détermine les sections de la sortie de l'agent auxquelles le plugin de vérification est abonné. Ici, l'option « myhostgroups » est utilisée pour spécifier que le nouveau plugin de vérification utilise les mêmes données que l'ancien : la section du plugin de l'agent préparée par la fonction « parse ». Le nom du service contient désormais l'espace réservé %s. Le nom de l'élément sera inséré ultérieurement à cet endroit par Checkmk. Dans les deux dernières lignes, les noms de la nouvelle fonction de découverte et de la nouvelle fonction de vérification sont définis, ces deux fonctions devant encore être écrites.

Commençons par la fonction de découverte, qui a désormais pour tâche de déterminer les éléments à surveiller — celle-ci est également ajoutée à la fonction existante :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def discover_myhostgroups_advanced(section):
    for group in section:
        if group != "check_mk":
            yield Service(item=group)
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Comme précédemment, la fonction de découverte reçoit l’argument « section ». Les différents groupes d’hôtes sont parcourus dans une boucle. Tous les groupes d’hôtes présentent ici un intérêt — à l’exception de « check_mk », car ce groupe d’hôtes particulier a déjà été pris en charge par le plugin de vérification existant « myhostgroups ». Chaque fois qu’un élément est trouvé, il est renvoyé via « yield », ce qui crée un objet de type « Service », qui reçoit à son tour le nom du groupe d’hôtes en tant qu’élément.

Si l'hôte est surveillé ultérieurement, la fonction de vérification est appelée séparément pour chaque service — et donc pour chaque élément. Cela vous amène à la définition de la fonction de vérification pour le nouveau plug-in de vérification myhostgroups_advanced. La fonction de vérification reçoit l'argument item en plus de la section. La première ligne de la fonction se présente alors comme suit :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups_advanced(item, section):
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

L'algorithme de la fonction de vérification est simple : Si le groupe d'hôtes existe, le service est défini sur « OK » et le nombre ainsi que les noms des hôtes du groupe sont répertoriés. Voici la fonction complète :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups_advanced(item, section):
    attr = section.get(item)
    if attr:
        yield Result(state=State.OK, summary=f"{attr['num_hosts']} hosts in this group: {attr['members']}")
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Le résultat de la vérification est fourni en renvoyant un objet de la classe Result via yield. Cela nécessite les paramètres state et summary. Ici, state définit l’état du service (dans l’exemple OK) et summary le texte qui s’affiche dans l’Summary du service. Ceci est purement informatif et n’est pas évalué davantage par Checkmk. Vous trouverez plus d’informations à ce sujet dans la section suivante.

Jusqu’ici, tout va bien. Mais que se passe-t-il si l’élément que vous recherchez n’est pas trouvé ? Cela peut se produire si un service a déjà été créé pour un groupe d’hôtes par le passé, mais que ce groupe d’hôtes a désormais disparu — soit parce que le groupe d’hôtes existe toujours dans Checkmk mais ne contient plus aucun hôte, soit parce qu’il a été complètement supprimé. Dans les deux cas, ce groupe d’hôtes ne sera plus présent dans la sortie de l’agent.

La bonne nouvelle : Checkmk s'en charge ! Si un élément recherché n'est pas trouvé, Checkmk génère automatiquement le résultat « UNKNOWN - Item not found in monitoring data » pour le service. C'est intentionnel et c'est une bonne chose. Si un élément recherché n'est pas trouvé, vous pouvez simplement exécuter Python à partir de cette fonction et laisser Checkmk faire son travail.

Checkmk sait seulement que l'élément qui était présent auparavant a désormais disparu. Checkmk ignore la raison de cette disparition — mais vous, vous la connaissez. Il est donc judicieux de ne pas garder cette information pour vous, mais d'intercepter cette condition dans la fonction de vérification et d'afficher un message utile.

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups_advanced(item, section):
    attr = section.get(item)
    if not attr:
        yield Result(state=State.CRIT, summary="Group is empty or has been deleted")
        return

    yield Result(state=State.OK, summary=f"{attr['num_hosts']} hosts in this group: {attr['members']}")
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Qu'est-ce qui a changé ? La condition d'erreur est désormais traitée en premier. Par conséquent, vérifiez dans la branche « if » si l'élément n'existe vraiment pas, définissez l'état sur « CRIT » et quittez la fonction avec « return ». Dans tous les autres cas, renvoyez « OK » comme auparavant.

Cela signifie que vous avez intégré la situation des groupes d'hôtes disparus dans la fonction de vérification. Au lieu de UNKNOWN, le service associé sera désormais CRIT et contiendra des informations sur la cause de l'état critique.

Cela achève la mise en place du nouveau plug-in de vérification en tant qu'extension de l'ancien. Le plug-in d'agent étendu et le fichier étendu pour les plug-ins de vérification sont à nouveau disponibles sur GitHub. Ce dernier contient le plug-in de vérification simple myhostgroups du chapitre précédent, la fonction d'analyse avancée et les composants du nouveau plug-in de vérification myhostgroups_advanced avec la création du plug-in de vérification, la fonction de découverte et la fonction de vérification. Notez que les fonctions doivent toujours être définies avant la création des plug-ins de vérification ou des sections d'agent afin d'éviter toute erreur due à des noms de fonction non définis.

Comme le nouveau plug-in de vérification myhostgroups_advanced fournit de nouveaux services, vous devez effectuer une découverte de services pour ce plug-in de vérification et activer les modifications afin de voir ces services dans la surveillance :

The two new services created by the advanced check plug-in in the monitoring.
Deux nouveaux services dans la surveillance :

Procédez comme décrit dans le chapitre consacré au plug-in de vérification simple. N'exécutez pas les deux premières commandes pour myhostgroups, mais exécutez-les pour le nouveau plug-in de vérification myhostgroups_advanced.

4.3. Résumé et détails

Dans la surveillance de Checkmk, chaque service possède un état — OK, WARN, etc. — ainsi qu’une ligne de texte. Ce texte se trouve dans la colonne « Summary » — comme le montre la capture d’écran précédente — et a donc pour fonction de fournir un bref résumé de l’état du service. Le principe est que ce texte ne doit pas dépasser 60 caractères. Cela garantit un affichage concis du tableau sans sauts de ligne gênants.

Il existe également le champ « Details », dans lequel s’affichent tous les détails relatifs à l’état du service, y compris l’ensemble des informations du résumé. En cliquant sur le service, vous ouvrez la page du service, sur laquelle les deux champs « Summary » et « Details » apparaissent aux côtés de nombreux autres.

Lorsque vous appelez yield Result(...), vous pouvez déterminer quelles informations sont suffisamment importantes pour être affichées dans le résumé, et pour lesquelles il suffit qu’elles apparaissent dans les détails.

Dans notre exemple, vous avez toujours utilisé un appel du type suivant :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield Result(state=State.OK, summary=f"{attr['num_hosts']} hosts in this group: {attr['members']}")
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Cela signifie que le texte défini comme « summary » apparaît toujours dans l’Summary — ainsi que dans l’Details. Vous ne devriez donc l’utiliser que pour des informations importantes. Si un groupe d’hôtes contient de nombreux hôtes, la liste récapitulative peut devenir très longue — plus longue que les 60 caractères recommandés. Si une information est d’importance secondaire, vous pouvez utiliser « details » pour spécifier que son texte n’apparaisse que dans les détails :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield Result(
        state = State.OK,
        summary = f"{attr['num_hosts']} hosts in this group",
        details = f"{attr['num_hosts']} hosts in this group: {attr['members']}",
    )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans l'exemple ci-dessus, la liste des hôtes n'est donc affichée que dans l'Details. L'Summary n'affiche alors que le nombre d'hôtes dans le groupe :

'Summary' and 'Details' shown in the service details.
Contenu différent pour le résumé et les détails dans la surveillance

Outre summary et details, il existe un troisième paramètre. Avec notice, vous spécifiez qu’un texte correspondant à un service dans l’OK n’est affiché que dans les détails — mais également dans le résumé pour tous les autres états. Cela permet de comprendre immédiatement, à partir du résumé, pourquoi le service n’est pas OK. Le paramètre notice n’est pas particulièrement utile si les textes sont liés de manière permanente aux états, comme dans notre exemple jusqu’à présent.

En résumé, cela signifie :

  • Le texte total du résumé ne doit pas dépasser 60 caractères pour les services qui sont OK.

  • Utilisez toujours soit summary, soit notice — au moins l’un ou l’autre, mais pas les deux.

  • Si nécessaire, ajoutez details si le texte des détails doit constituer une alternative.

4.4. Résultats partiels multiples par service

Afin d’éviter que le nombre de services sur un hôte n’augmente de manière excessive, plusieurs résultats partiels sont souvent regroupés au sein d’un même service. Par exemple, le service Memory sous Linux vérifie non seulement l’utilisation de la RAM et de l’espace d’échange, mais également la mémoire partagée, les tables de pages et toutes sortes d’autres éléments.

L'API Check fournit une interface très pratique à cet effet. Une fonction de vérification peut simplement générer un résultat avec yield aussi souvent que nécessaire. L'état global du service est alors basé sur le pire résultat partiel dans l'ordre suivant : OKWARNUNKNOWNCRIT.

Dans l'exemple, utilisez cette option pour définir deux résultats supplémentaires pour chaque service des groupes d'hôtes, en plus du résultat existant. Ceux-ci évaluent le pourcentage d'hôtes dans l'état « UP » et de services dans l'état « OK ». Vous utilisez les colonnes supplémentaires du tableau des groupes d'hôtes précédemment défini dans la sortie de l'agent et la fonction d'analyse.

Développez maintenant la fonction de vérification par étapes, de haut en bas :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups_advanced(item, section):
    attr = section.get(item)
    if not attr:
        yield Result(state=State.CRIT, summary="Group is empty or has been deleted")
        return

    members = attr["members"]
    num_hosts = int(attr["num_hosts"])
    num_hosts_up = int(attr["num_hosts_up"])
    num_services = int(attr["num_services"])
    num_services_ok = int(attr["num_services_ok"])
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

La branche « if » reste inchangée, c'est-à-dire que les nouveaux résultats partiels ne s'appliquent qu'aux groupes d'hôtes qui existent également. Vous définissez ensuite cinq variables pour les colonnes du tableau des groupes d'hôtes contenu dans la section. D'une part, cela améliore la lisibilité et, d'autre part, vous pouvez convertir les chaînes lues en nombres à l'aide de l'int()e pour les quatre colonnes qui doivent encore être utilisées pour le calcul.

Le seul résultat existant reste (presque) inchangé :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield Result(
        state = State.OK,
        summary = f"{num_hosts} hosts in this group",
        details = f"{num_hosts} hosts in this group: {members}",
    )
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Seul l'accès dans la « F-String » Python à l'expression qui renvoie la valeur est désormais plus simple qu'auparavant, puisque l'attre figure déjà dans les définitions de variables.

Passons maintenant au cœur même de l'extension, à savoir la définition d'un résultat qui met en œuvre l'énoncé suivant : « Le service du groupe d'hôtes est WARN lorsque 90 % des hôtes sont UP, et CRIT lorsque 80 % des hôtes sont UP. » La convention ici est que la vérification passe à WARN ou CRIT dès que le seuil est atteint — et pas seulement lorsqu'il est dépassé. L'API Check fournit la fonction auxiliaire check_levels pour comparer une valeur déterminée avec des valeurs de seuil.

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    hosts_up_perc = 100.0 * num_hosts_up / num_hosts
    yield from check_levels(
        hosts_up_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        label = "UP hosts",
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans la première ligne, le pourcentage est calculé à partir du nombre total et du nombre d'hôtes dans l'état « UP » et stocké dans la variable « hosts_up_perc ». La barre oblique simple (/) exécute une division en virgule flottante, ce qui garantit que le résultat est une valeur de type float. Ceci est utile car certaines des fonctions utilisées par la suite attendent une valeur de type float en entrée.

À la deuxième ligne, le résultat de la fonction check_levels est ensuite renvoyé sous la forme d’un objet de type Result, que vous trouverez dans la documentation de l’API. Cette fonction est alimentée par le pourcentage qui vient d’être calculé en tant que valeur (hosts_up_perc), les deux valeurs de seuil inférieures (levels_lower), une étiquette qui précède la sortie (label) et enfin par notice_only=True.

Le dernier paramètre utilise le paramètre notice déjà présenté dans la section précédente pour l’objet Result(). Avec notice_only=True, vous spécifiez que le texte du service n’est affiché dans l’Summary que si l’état n’est pas OK. Toutefois, les résultats partiels conduisant à un WARN ou à un CRIT seront dans tous les cas toujours visibles dans le résumé, quelle que soit la valeur de notice_only.

Enfin, vous définissez le troisième résultat de la même manière que le deuxième, qui évalue le pourcentage de services dans l'état « OK » :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    services_ok_perc = 100.0 * num_services_ok / num_services
    yield from check_levels(
        services_ok_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        label = "OK services",
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Cela achève la fonction de vérification.

Le service d'un groupe d'hôtes évalue désormais trois résultats et affiche le pire état parmi ceux-ci dans la surveillance, comme dans l'exemple suivant :

The summary shows the text for the critical state.
Le résumé affiche le texte correspondant à l'état critique

4.5. Indicateurs

Pas toujours, mais souvent, les vérifications traitent de chiffres — et ces chiffres sont très souvent des valeurs mesurées ou calculées. Dans notre exemple, le nombre d’hôtes dans le groupe d’hôtes (num_hosts) et le nombre d’hôtes dans l’état « UP » (num_hosts_up) sont les valeurs mesurées. Le pourcentage d’hôtes dans l’état « UP » (hosts_up_perc) est une valeur calculée à partir de ces valeurs. Si une telle valeur peut ensuite être affichée sur une période donnée, on parle également de métrique.

Grâce à son système de graphiques intégré, Checkmk dispose d’un composant permettant de stocker, d’évaluer et d’afficher ces valeurs. Ce composant est totalement indépendant du calcul des états « OK », « WARN » et « CRIT ».

Dans cet exemple, vous allez définir les deux valeurs calculées, « hosts_up_perc » et « services_ok_perc », en tant que métriques. Les métriques seront immédiatement visibles dans l’interface utilisateur graphique de Checkmk sans que vous ayez à intervenir. Un graphique est généré automatiquement pour chaque métrique.

Les métriques sont déterminées par la fonction de vérification et renvoyées en tant que résultat supplémentaire. La méthode la plus simple consiste à ajouter les informations relatives aux métriques à la fonction check_levels() dans l’appel.

Pour rappel, voici les lignes contenant l'appel à la fonction `check_levels()` de la section précédente :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield from check_levels(
        hosts_up_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        label = "UP hosts",
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les deux nouveaux arguments de la métrique sont metric_name et boundaries :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield from check_levels(
        hosts_up_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        metric_name = "hosts_up_perc",
        label = "UP hosts",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Pour que tout reste simple et clair, utilisez comme nom de la métrique le nom de la variable dans laquelle le pourcentage est stocké en tant que valeur.

Vous pouvez utiliser boundaries pour fournir au système de graphiques des informations sur la plage des valeurs possibles. Cela fait référence à la plus petite et à la plus grande valeur possibles. Dans le cas d'un pourcentage, les limites de 0.0 et 100.0 ne sont pas trop difficiles à déterminer. Les nombres à virgule flottante et les entiers (qui sont convertis en interne en nombres à virgule flottante) sont autorisés, mais pas les chaînes de caractères. Si une seule limite de la plage de valeurs est définie, entrez simplement None pour l'autre, par exemple boundaries = (0.0, None).

Grâce à cette extension, la fonction check_levels renvoie désormais également un objet de type Metric via yield, en plus de Result.

Vous pouvez désormais définir la métrique services_ok_perc de la même manière. Les dernières lignes de la fonction de vérification ressembleront alors à ceci :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    hosts_up_perc = 100.0 * num_hosts_up / num_hosts
    yield from check_levels(
        hosts_up_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        metric_name = "hosts_up_perc",
        label = "UP hosts",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
    services_ok_perc = 100.0 * num_services_ok / num_services
    yield from check_levels(
        services_ok_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        metric_name = "services_ok_perc",
        label = "OK services",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Grâce à la fonction de vérification étendue, les deux graphiques sont visibles dans la surveillance. Dans la liste des services, l'icône d'Icon for displaying the graphs for a service.s indique désormais qu'il existe des graphiques pour le service. Si vous passez la souris sur l'icône, les graphiques s'affichent en aperçu.

The service list with 2 graphs as a preview.
Les noms des métriques sont utilisés comme titres pour les graphiques

Vous trouverez un aperçu de tous les graphiques, y compris leurs légendes et bien plus encore, dans les détails du service.

Mais que faire si la valeur de la métrique souhaitée n’a pas été définie à l’aide de la fonction d’check_levels() ? Vous pouvez bien sûr définir une métrique indépendamment d’un appel de fonction. L’objet Metric(), que vous pouvez également créer directement via son constructeur, est utilisé à cette fin. La définition alternative d’une métrique pour la valeur hosts_up_perc se présente comme suit :

    yield Metric(
        name = "hosts_up_perc",
        value = hosts_up_perc,
        levels = (80.0, 90.0),
        boundaries = (0.0, 100.0),
    )
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les arguments de Metric() sont très similaires à ceux de l'appel de fonction présenté ci-dessus : Les deux premiers arguments, correspondant au nom de la métrique et à la valeur, sont obligatoires. De plus, il existe deux arguments facultatifs : levels pour les valeurs seuils WARN et CRIT, et boundaries pour la plage de valeurs.

Tip

La spécification de levels n’est utilisée ici qu’à titre d’information pour l’affichage du graphique. Dans le graphique, les valeurs seuils sont généralement représentées par des lignes jaunes et rouges. La fonction check_levels, avec ses valeurs seuils spécifiées, est chargée de la vérification proprement dite.

Utilisez à présent l’option permettant de définir non seulement les deux valeurs calculées, mais toutes les valeurs mesurées comme métriques à l’aide de Metric() — dans notre exemple, les quatre valeurs mesurées issues du tableau du groupe d’hôtes. Limitez-vous aux deux spécifications obligatoires que sont le nom et la valeur de la métrique. Les quatre nouvelles lignes complètent l’extension de la fonction de vérification pour les métriques :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    hosts_up_perc = 100.0 * num_hosts_up / num_hosts
    yield from check_levels(
        hosts_up_perc,
        levels_lower = (90.0, 80.0),
        metric_name = "hosts_up_perc",
        label = "UP hosts",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
    services_ok_perc = 100.0 * num_services_ok / num_services
    yield from check_levels(
        services_ok_perc,
        levels_lower = (90.0, 80.0),
        metric_name = "services_ok_perc",
        label = "OK services",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )

    yield Metric(name="num_hosts", value=num_hosts)
    yield Metric(name="num_hosts_up", value=num_hosts_up)
    yield Metric(name="num_services", value=num_services)
    yield Metric(name="num_services_ok", value=num_services_ok)
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Cela augmente le nombre de graphiques par service, mais vous offre également la possibilité de combiner plusieurs métriques dans un seul graphique, par exemple. Nous présentons ces options et d’autres dans la section Personnalisation de l’affichage des métriques ci-dessous.

Dans le fichier d'exemple disponible sur GitHub, vous retrouverez l'intégralité de la fonction de vérification.

5. Ensembles de règles pour les paramètres de vérification

Dans le plug-in de vérification étendu « myhostgroups_advanced », vous aurez généré l’état « WARN » si seulement 90 % des hôtes sont UP, et « CRIT » pour 80 %. Dans ce cas, les chiffres 90 et 80 sont définis explicitement dans la fonction de vérification, ou, comme diraient les programmeurs, codés en dur. Dans Checkmk, cependant, les utilisateurs sont habitués à pouvoir configurer ces valeurs seuils et d’autres paramètres de vérification via des règles. Par exemple, si un groupe d’hôtes ne compte que quatre membres, les deux valeurs seuils de 90 % et 80 % ne sont pas vraiment adaptées, car le pourcentage chutera à 75 % dès que le premier hôte tombera en panne et l’état passera directement à « CRIT » — sans passer par l’état intermédiaire « WARN ».

Par conséquent, le plug-in de contrôle doit désormais être modifié afin de pouvoir être configuré via l'interface d'Setup. Pour ce faire, vous aurez besoin d'un ensemble de règles.

Pour créer un ensemble de règles pour un plug-in de vérification, vous devez quitter le développement du plug-in de vérification et changer de répertoire, de fichier et d’API. Depuis l’2.3.0 Checkmk, l’API Rulesets vous aide à créer de tels ensembles de règles pour les plug-ins de vérification. La documentation de l’API pour les ensembles de règles se trouve sur votre site Checkmk, sur la même page que l’API Check, à l’adresse Rulesets > Version 1.

5.1. Définition d’un nouvel ensemble de règles

Pour créer un nouvel ensemble de règles, commencez par créer un nouveau sous-répertoire dans le répertoire de la famille de plug-ins ~/local/lib/python3/cmk_addons/plugins/myhostgroups/. Le nom rulesets est prédéfini pour ce sous-répertoire :

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/myhostgroups/rulesets
OMD[mysite]:~$ cd ~/local/lib/python3/cmk_addons/plugins/myhostgroups/rulesets
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans ce répertoire, vous créez ensuite un fichier pour la définition de l'ensemble de règles. Le nom du fichier doit s'inspirer de celui du plug-in de vérification et, comme tous les fichiers de plug-in, il doit porter l'extension py. Pour notre exemple, le nom de fichier ruleset_myhostgroups.py convient.

Examinons étape par étape la structure de ce fichier. Tout d'abord, il y a quelques commandes d'importation :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/rulesets/ruleset_myhostgroups.py
#!/usr/bin/env python3

from cmk.rulesets.v1 import Label, Title
from cmk.rulesets.v1.form_specs import BooleanChoice, DefaultValue, DictElement, Dictionary, Float, LevelDirection, SimpleLevels
from cmk.rulesets.v1.rule_specs import CheckParameters, HostAndItemCondition, Topic
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Tout d'abord, les classes pour les textes sont importées.

La deuxième ligne effectue une sélection parmi les spécifications de formulaire, c'est-à-dire les éléments de base de l'interface graphique utilisés dans l'ensemble de règles, par exemple la sélection binaire (BooleanChoice), la sélection multiple (Dictionary, DictElement), la définition des valeurs seuils (SimpleLevel, LevelDirection, DefaultValue) et la saisie de nombres à virgule flottante (Float). Vous ne demandez ici que les éléments de formulaire logiques et laissez à Checkmk le soin de concevoir l'interface graphique.

La dernière ligne importe les spécifications de la règle, qui déterminent le domaine d'application de la règle dans Checkmk, c'est-à-dire ici la définition des paramètres de contrôle, l'affectation aux hôtes et aux éléments, ainsi que le stockage sous un sujet. Comme votre plugin de contrôle myhostgroups_advanced génère plusieurs services, importez ici HostAndItemCondition. Si votre contrôle ne génère pas de service, c'est-à-dire s'il ne comporte pas d'élément, importez plutôt HostCondition.

Voici maintenant les définitions proprement dites du formulaire permettant de saisir les paramètres de vérification. L'utilisateur doit pouvoir définir séparément les deux valeurs seuils pour WARN et CRIT, tant pour le nombre d'hôtes dans l'état UP que pour le nombre de services dans l'état OK :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/rulesets/ruleset_myhostgroups.py
def _parameter_form():
    return Dictionary(
        elements = {
            "hosts_up_lower": DictElement(
                parameter_form = SimpleLevels(
                    title = Title("Lower percentage threshold for host in UP status"),
                    form_spec_template = Float(),
                    level_direction = LevelDirection.LOWER,
                    prefill_fixed_levels = DefaultValue(value=(90.0, 80.0)),
                ),
                required = True,
            ),
            "services_ok_lower": DictElement(
                parameter_form = SimpleLevels(
                    title = Title("Lower percentage threshold for services in OK status"),
                    form_spec_template = Float(),
                    level_direction = LevelDirection.LOWER,
                    prefill_fixed_levels = DefaultValue(value=(90.0, 80.0)),
                ),
                required = True,
            ),
        }
    )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Pour ce faire, créez une fonction qui génère le dictionnaire. Vous pouvez choisir librement le nom de la fonction ; il n'est requis que lors de la création de la règle ci-dessous. Le nom doit commencer par un trait de soulignement afin que la fonction ne soit pas visible au-delà des limites du module.

L'return Dictionary() est obligatoire. À l'intérieur de celle-ci, utilisez elements={} pour créer les éléments du dictionnaire, par exemple hosts_up_lower et services_ok_lower. Le formulaire de paramètres SimpleLevels est utilisé pour saisir des valeurs de seuil fixes. Dans ce formulaire, vous définissez d'abord l'titlee et les nombres à virgule flottante pour les valeurs à saisir (form_spec_template). Utilisez LevelDirection.LOWER pour spécifier que le statut changera si les valeurs tombent en dessous de ce niveau.

Enfin, vous pouvez utiliser prefill_fixed_levels pour fournir aux utilisateurs du jeu de règles des valeurs plutôt que de simples champs de saisie vides. Notez que ces valeurs affichées dans l'interface graphique ne sont pas les valeurs par défaut définies plus loin lors de la création du plug-in de vérification via check_default_parameters. Si vous souhaitez afficher dans l'interface graphique les mêmes valeurs par défaut que celles qui s'appliquent à la fonction de vérification, vous devez veiller à ce que les valeurs soient cohérentes aux deux endroits.

Enfin, créez le nouvel ensemble de règles à l'aide des éléments importés et définis par vos soins. Pour ce faire, créez une nouvelle instance de la classe `CheckParameters`. Le nom de cette instance doit commencer par `rule_spec_` :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/rulesets/ruleset_myhostgroups.py
rule_spec_myhostgroups = CheckParameters(
    name = "myhostgroups_advanced",
    title = Title("Host group status"),
    topic = Topic.GENERAL,
    parameter_form = _parameter_form,
    condition = HostAndItemCondition(item_title=Title("Host group name")),
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les explications suivantes s'appliquent :

  • L'name du jeu de règles établit sa connexion avec les plug-ins de vérification. Un plug-in de vérification qui souhaite utiliser ce jeu de règles doit utiliser ce nom comme check_ruleset_name lors de sa création. Afin de garder une trace d'un certain nombre de nouveaux jeux de règles, il est conseillé d'utiliser un préfixe dans le nom.

  • title définit le titre de l'ensemble de règles tel qu'il apparaît dans l'interface graphique de Checkmk.

  • L'topic détermine l'emplacement où l'ensemble de règles doit apparaître dans l'Setup. Avec la valeur sélectionnée dans l'exemple, vous trouverez l'ensemble de règles sous « Setup > Services > Service monitoring rules » dans la section « Various », où il est généralement bien placé.

  • Saisissez le nom de la fonction créée précédemment comme « parameter_form ».

  • Si votre vérification n'utilise pas d'élément, la condition est « HostCondition » et non « HostAndItemCondition », comme dans l'exemple ci-dessus. Avec le titre « "Host group name" » de l'élément, vous définissez l'étiquette dans l'interface graphique qui vous permet de restreindre la règle à certains groupes d'hôtes.

5.2. Test d’un ensemble de règles

Une fois que vous avez créé le fichier pour l'ensemble de règles, vous devez vérifier si tout fonctionne correctement jusqu'à présent — toujours sans connexion au plug-in de vérification. L'exécution de la commande cmk-validate-plugins confirmera alors que l'ensemble de règles lui-même est valide, mais vous avertira qu'il n'a encore aucun effet.

Pour rendre l'ensemble de règles visible, vous devez redémarrer les processus Python qui fournissent l'interface graphique. Pour ce faire, redémarrez le serveur web Apache :

OMD[mysite]:~$ omd restart apache
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Ensuite, le jeu de règles sera accessible dans Setup sur la page mentionnée ci-dessus. Toutefois, vous ne pourrez trouver la valeur par défaut à l'aide de la fonction de recherche dans l'Setup qu'après avoir redémarré Redis :

OMD[mysite]:~$ omd restart redis
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

L'ensemble de règles que vous venez de définir se présentera ainsi dans l'interface graphique :

“The newly created rule set in the setup.”

Dans la zone « Conditions », vous trouverez le champ de saisie « Host group name » défini via l’HostAndItemCondition pour restreindre la règle aux groupes d’hôtes.

Créez une règle et testez différentes valeurs, comme indiqué dans la capture d'écran ci-dessus. Si cela fonctionne sans erreur, vous pouvez désormais utiliser les paramètres de vérification dans la fonction de vérification.

5.3. Connexion de l'ensemble de règles au plug-in de vérification

L'ensemble de règles nouvellement créé est désormais connecté au plug-in de vérification provisoirement achevé au chapitre précédent. Pour que la règle prenne effet, vous devez autoriser le plug-in de vérification à accepter les paramètres de vérification et lui indiquer quelle règle doit être utilisée. Pour ce faire, ajoutez deux nouvelles lignes au fichier du plug-in de vérification lors de la création du plug-in de vérification myhostgroups_advanced :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
check_plugin_myhostgroups_advanced = CheckPlugin(
    name = "myhostgroups_advanced",
    sections = [ "myhostgroups" ],
    service_name = "Host group %s",
    discovery_function = discover_myhostgroups_advanced,
    check_function = check_myhostgroups_advanced,
    check_default_parameters = {},
    check_ruleset_name = "myhostgroups_advanced",
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Avec l'entrée « check_default_parameters », vous pouvez définir les valeurs par défaut qui s'appliquent tant qu'aucune règle n'a encore été créée. Lors de la conversion du plug-in de vérification pour les paramètres de vérification, cette ligne doit être présente. Dans le cas le plus simple, transmettez un dictionnaire vide {}.

Ensuite, entrez check_ruleset_name, c'est-à-dire le nom de l'ensemble de règles. De cette manière, Checkmk sait à partir de quel ensemble de règles les paramètres doivent être déterminés.

Checkmk va maintenant essayer de transmettre des paramètres à la fonction de vérification. Pour que cela fonctionne, vous devez étendre la fonction de vérification de manière à ce qu’elle attende l’argument params, qui est inséré entre item et section :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups_advanced(item, params, section):
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si vous créez une vérification sans élément, l'item est omis et params se trouve au début.

Il est fortement recommandé de faire en sorte que le contenu de la variable params soit affiché avec print en premier lieu :

def check_myhostgroups_advanced(item, params, section):
    print(params)
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Lorsque le plug-in de vérification est exécuté, les lignes affichées (une pour chaque service) avec les valeurs définies par une règle ressembleront alors à ceci :

OMD[mysite]:~$ cmk --detect-plugins=myhostgroups_advanced -v localhost
Parameters({'hosts_up_lower': ('fixed', (75.0, 60.0)), 'services_ok_lower': ('fixed', (75.0, 60.0))})
Parameters({'hosts_up_lower': ('fixed', (75.0, 60.0)), 'services_ok_lower': ('fixed', (75.0, 60.0))})
Parameters({'hosts_up_lower': ('fixed', (75.0, 60.0)), 'services_ok_lower': ('fixed', (75.0, 60.0))})
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !
Important

Lorsque tout est prêt et fonctionne correctement, supprimez les appels à `print`, car ceux-ci peuvent perturber la communication interne au sein de Checkmk. Vous pouvez également limiter l'affichage des informations de débogage à une requête explicite.

Personnalisez maintenant davantage votre fonction de vérification afin que les paramètres transmis puissent prendre effet. Récupérez les deux éléments du dictionnaire définis dans la règle portant le nom sélectionné à partir des paramètres :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
def check_myhostgroups_advanced(item, params, section):
    hosts_up_lower = params["hosts_up_lower"]
    services_ok_lower = params["services_ok_lower"]
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Plus bas dans la fonction de vérification, les valeurs de seuil précédemment codées en dur "fixed", (90.0, 80.0) sont alors remplacées par les variables hosts_up_lower et services_ok_lower :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    hosts_up_perc = 100.0 * num_hosts_up / num_hosts
    yield from check_levels(
        hosts_up_perc,
        levels_lower = (hosts_up_lower),
        metric_name = "hosts_up_perc",
        label = "UP hosts",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
    services_ok_perc = 100.0 * num_services_ok / num_services
    yield from check_levels(
        services_ok_perc,
        levels_lower = (services_ok_lower),
        metric_name = "services_ok_perc",
        label = "OK services",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si une règle a été configurée, vous pouvez désormais surveiller les groupes d'hôtes de l'exemple avec les valeurs de seuil définies via l'interface graphique. Toutefois, si aucune règle n'a été définie, cette fonction de vérification plantera, car les paramètres par défaut du plug-in de vérification n'auront pas été renseignés, et le plug-in générera une erreur « KeyError » en l'absence de règle.

Ce problème peut toutefois être résolu si les valeurs par défaut sont définies lors de la création du plug-in de vérification :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
check_plugin_myhostgroups_advanced = CheckPlugin(
    name = "myhostgroups_advanced",
    sections = [ "myhostgroups" ],
    service_name = "Host group %s",
    discovery_function = discover_myhostgroups_advanced,
    check_function = check_myhostgroups_advanced,
    check_default_parameters = {"hosts_up_lower": ("fixed", (90, 80)), "services_ok_lower": ("fixed", (90, 80))},
    check_ruleset_name = "myhostgroups_advanced",
)
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous devez toujours transmettre les valeurs par défaut de cette manière (et ne pas intercepter le cas de paramètres manquants dans le plug-in de vérification), car ces valeurs par défaut peuvent également s'afficher dans l'interface Setup. Par exemple, dans la découverte de services d'un hôte, sur la page Services of host, dans le menu Display, se trouve le commutateur Show check parameters.

Tip

Sur GitHub, vous trouverez à la fois le fichier contenant le jeu de règles et le plug-in de vérification étendu par ce jeu de règles.

5.4. Test et activation du plug-in de vérification étendu

Les modifications apportées au chapitre précédent affectent à la fois le cœur de surveillance et l’interface utilisateur graphique, ainsi que ses processus associés. Par conséquent, après avoir exécuté la commande « cmk-validate-plugins », vous devez d’abord régénérer la configuration, puis redémarrer le site :

OMD[mysite]:~$ cmk -U
OMD[mysite]:~$ omd restart
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !
Redémarrage plus rapide pour les experts

Si vous maîtrisez parfaitement la structure des processus de Checkmk et savez exactement quels composants seront affectés par les modifications apportées à votre plug-in, vous pouvez limiter le redémarrage à des services spécifiques. Pour un aperçu, consultez l'article Services du site.

6. Personnalisation de l'affichage des métriques

Dans l'exemple ci-dessus, vous avez demandé au plug-in de vérification myhostgroups_advanced de générer des métriques pour toutes les valeurs mesurées et calculées. Nous vous avons présenté deux façons de procéder. Tout d'abord, les métriques des valeurs calculées ont été créées dans le cadre de la fonction check_levels() à l'aide de l'argument metric_name, par exemple comme suit :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield from check_levels(
        services_ok_perc,
        levels_lower = ("fixed", (90.0, 80.0)),
        metric_name = "services_ok_perc",
        label = "OK services",
        boundaries = (0.0, 100.0),
        notice_only = True,
    )
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Vous avez ensuite généré les métriques mesurées directement à l'aide de l'objet `Metric()` — pour le nombre de services dans l'état `OK`, par exemple, comme ceci :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py
    yield Metric(name="num_services_ok", value=num_services_ok)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les métriques seront immédiatement visibles dans l'interface graphique de Checkmk sans que vous ayez à intervenir. Il existe toutefois quelques restrictions :

  • Les métriques correspondantes ne sont pas automatiquement regroupées dans un graphique, mais apparaissent chacune séparément.

  • La métrique n'aura pas de titre approprié ; c'est le nom de variable interne de la métrique qui s'affichera.

  • Aucune unité permettant une représentation significative n'est utilisée (par exemple, Go au lieu d'octets individuels).

  • Une couleur est sélectionnée au hasard.

  • Un « Perf-O-Meter », c'est-à-dire l'aperçu graphique de la métrique sous forme de barre, n'apparaît pas automatiquement dans la liste des services (par exemple dans la vue qui affiche tous les services d'un hôte).

Pour compléter l'affichage de vos métriques avec ces détails, vous aurez besoin de définitions de métriques.

Tout comme pour les ensembles de règles, depuis la version 2.3.0 de Checkmk, il existe également une API distincte pour les métriques, les graphiques et les Perf-O-Meters avec l’API Graphing. La documentation relative à l’API Graphing se trouve sur votre site Checkmk, sur la même page que l’API Check, sous Graphing > Version 1.

6.1. Création de nouvelles définitions de métriques

Les procédures de création des ensembles de règles et des définitions de métriques sont très similaires. Commencez par créer un nouveau sous-répertoire portant le nom par défaut « graphing » dans le répertoire de votre famille de plug-ins « ~/local/lib/python3/cmk_addons/plugins/myhostgroups/ ».

OMD[mysite]:~$ mkdir -p ~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing
OMD[mysite]:~$ cd ~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Créez ensuite un fichier graphique dans ce répertoire, par exemple graphing_myhostgroups.py.

Tout d'abord, voici à nouveau quelques commandes d'importation :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing/graphing_myhostgroups.py
#!/usr/bin/env python3

from cmk.graphing.v1 import Title
from cmk.graphing.v1.graphs import Graph, MinimalRange
from cmk.graphing.v1.metrics import Color, DecimalNotation, Metric, Unit
from cmk.graphing.v1.perfometers import Closed, FocusRange, Open, Perfometer
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Dans notre exemple, vous définissez maintenant votre propre métrique pour le pourcentage de services en état «OK». Pour ce faire, créez une instance de la classe Metric. Le nom de cette instance doit commencer par metric_

~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing/graphing_myhostgroups.py
metric_myhostgroups_services_ok_perc = Metric(
    name = "services_ok_perc",
    title = Title("Percentage of services in OK state"),
    unit = Unit(DecimalNotation("%")),
    color = Color.ORANGE,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Voici l'explication :

  • Le nom de la métrique (ici « services_ok_perc ») doit correspondre à ce que la fonction de vérification renvoie.

  • title est l'intitulé du graphique de la métrique et remplace le nom de variable interne utilisé auparavant.

  • Les unités disponibles (unit) se trouvent dans la documentation de l'API ; elles se terminent toutes par « Notation », par exemple DecimalNotation, EngineeringScientificNotation ou TimeNotation.

  • Les noms de couleurs utilisés dans Checkmk pour la définition de l'color se trouvent sur GitHub.

Cette définition dans le fichier de graphiques garantit désormais que le titre, l'unité et la couleur de la métrique s'affichent correctement.

Tout comme pour la création d'un fichier de règles, le fichier de graphiques doit d'abord être lu avant que la modification ne soit visible dans l'interface graphique. Pour ce faire, redémarrez Apache sur le site :

OMD[mysite]:~$ omd restart apache
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Le graphique de la métrique ressemblera alors à ceci dans l'interface graphique de Checkmk :

“The new metric definition in the service details.”

6.2. Graphiques avec plusieurs métriques

Si vous souhaitez combiner plusieurs métriques dans un seul graphique (ce qui est souvent très utile), vous aurez besoin d'une définition de graphique que vous pourrez ajouter au fichier de graphiques créé dans la section précédente.

Dans notre exemple, les deux métriques num_services et num_services_ok doivent être affichées dans un seul graphique. Les définitions de métriques correspondantes sont créées de la même manière que dans la section précédente pour services_ok_perc et se présentent comme suit :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing/graphing_myhostgroups.py
metric_myhostgroups_services = Metric(
    name = "num_services",
    title = Title("Number of services in group"),
    unit = Unit(DecimalNotation("")),
    color = Color.PINK,
)

metric_myhostgroups_services_ok = Metric(
    name = "num_services_ok",
    title = Title("Number of services in OK state"),
    unit = Unit(DecimalNotation("")),
    color = Color.BLUE,
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Ajoutez maintenant un graphique qui trace ces deux métriques sous forme de lignes. Cela s'effectue via une instance de la classe Graph, le nom de l'instance devant à nouveau commencer par un préfixe prédéfini (graph_) :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing/graphing_myhostgroups.py
graph_myhostgroups_combined = Graph(
    name = "services_ok_comparison",
    title = Title("Services in OK state out of total"),
    simple_lines=[ "num_services", "num_services_ok" ],
    minimal_range=MinimalRange(0, 50),
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Le paramètre « minimal_range » décrit la plage minimale couverte par l'axe vertical du graphique, quelles que soient les valeurs réelles de la métrique. L'axe vertical sera étendu si les valeurs dépassent la plage minimale, mais il ne sera jamais plus petit.

Le résultat est le graphique combiné dans l'interface graphique de Checkmk :

“The graph shows both metrics in the service details.”

6.3. Métriques dans le Perf-O-Meter

Souhaitez-vous afficher un Perf-O-Meter pour une métrique dans la ligne de la liste des services ? Cela pourrait ressembler à ceci, par exemple :

“The Perf-O-Meter shows the percentage of services in ‘OK’ state.”
Le Perf-O-Meter indique le pourcentage de services en état «OK»

Pour créer un tel Perf-O-Meter, vous aurez besoin d'une autre instance, cette fois-ci de la classe Perfometer, dont le nom commence par le préfixe perfometer_ :

~/local/lib/python3/cmk_addons/plugins/myhostgroups/graphing/graphing_myhostgroups.py
perfometer_myhostgroups_advanced = Perfometer(
    name = "myhostgroups_advanced",
    focus_range = FocusRange(Closed(0), Closed(100)),
    segments = [ "services_ok_perc" ],
)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Les Perf-O-Meters sont un peu plus complexes que les graphiques, car ils ne comportent pas de légende. Il est donc difficile d'afficher une plage de valeurs, en particulier lorsque des valeurs absolues sont affichées. Il est plus facile d'afficher un pourcentage. C'est également le cas dans l'exemple ci-dessus :

  • Les noms des métriques sont saisis dans segments ; dans cet exemple, il s'agit du pourcentage de services en état « OK ».

  • Les limites inférieure et supérieure sont saisies dans focus_range. Les limites de l' Closedsont destinées aux métriques qui ne peuvent accepter que des valeurs comprises entre les limites spécifiées (ici 0 et 100).

De plus, des options encore plus sophistiquées pour la mise en œuvre de métriques dans les Perf-O-Meters sont disponibles dans la documentation de l’API Graphing, par exemple avec les classes Bidirectional et Stacked, qui permettent d’afficher plusieurs Perf-O-Meters en un seul.

Le fichier de graphiques correspondant à ce chapitre est disponible sur GitHub. Ce fichier contient notamment les définitions des métriques pour les quatre valeurs mesurées et les deux valeurs calculées.

7. Mise en forme des nombres

Les nombres sont souvent affichés dans l'Summarye et l'Detailse d'un service. Afin de vous faciliter au maximum la mise en forme soignée et correcte, et également pour normaliser l'affichage de tous les plug-ins de vérification, il existe des fonctions d'aide permettant d'afficher les différents types de formats. Toutes ces fonctions sont des sous-fonctions du module render et sont donc appelées avec render.. Par exemple, render.bytes(2000) donne le texte 1.95 KiB.

Ce que toutes ces fonctions ont en commun, c’est que leur valeur est affichée dans une unité dite canonique ou naturelle. Cela signifie que vous n’avez jamais à réfléchir et qu’il n’y a ni difficulté ni erreur lors de la conversion. Par exemple, les durées sont toujours exprimées en secondes, et les tailles des disques durs, des fichiers, etc., sont toujours exprimées en octets et non en kilo-octets, en kibio-octets, en blocs ou en d’autres unités prêtant à confusion.

Utilisez ces fonctions même si vous n'appréciez pas particulièrement leur affichage. Dans tous les cas, cela permettra une standardisation pour l'utilisateur. Les futures versions de Checkmk permettront peut-être de modifier l'affichage, voire de le rendre configurable par l'utilisateur, comme c'est déjà le cas pour l'affichage de la température, par exemple. Votre plug-in de vérification en bénéficiera alors également.

Avant de pouvoir utiliser la fonction « render » dans votre plug-in de contrôle, vous devez également l'importer :

from cmk.agent_based.v2 import render
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

À la suite de cette description détaillée de toutes les fonctions d'affichage (fonctions de rendu), vous trouverez un résumé sous la forme d'un tableau facile à lire.

7.1. Heures, plages horaires, fréquences

Les spécifications de temps absolues (horodatages) sont formatées selon le modèle render.date() ou render.datetime(). Les informations sont toujours fournies en temps Unix, c'est-à-dire en secondes à compter du 1er janvier 1970, 00:00:00 UTC — le début de l'époque Unix. Il s'agit également du format utilisé par la fonction Python time.time().

L'avantage de cette représentation est qu'elle facilite grandement les calculs, par exemple le calcul d'une plage horaire, lorsque les heures de début et de fin sont connues. La formule est alors simplement duration = end - start. Ces calculs fonctionnent indépendamment du fuseau horaire, des changements d'heure d'été ou des années bissextiles.

render.date() ne renvoie que la date ; render.datetime() ajoute l'heure. Le résultat est donné selon le fuseau horaire actuel dans lequel se trouve le serveur Checkmk qui exécute la vérification. Exemples :

Appel Résultat

render.date(0)

1970-01-01

render.datetime(0)

1970-01-01 01:00:00

render.date(1700000000)

2023-11-14

render.datetime(1700000000)

2023-11-14 23:13:20

Ne soyez pas surpris que render.datetime(0) ne renvoie pas 00:00 comme heure, mais 01:00. Cela s’explique par le fait que nous rédigeons ce guide d’utilisation dans le fuseau horaire de l’Allemagne — qui a une heure d’avance sur l’heure UTC standard (du moins pendant l’heure d’hiver, car le 1er janvier n’est pas en heure d’été).

Pour les plages horaires (ou durées), il existe également la fonction render.timespan(). On lui transmet une durée en secondes et elle la renvoie sous une forme lisible par l’utilisateur. Pour les durées plus longues, les secondes ou les minutes sont omises. Si vous disposez d’une durée dans un objet TimeDelta, utilisez la fonction total_seconds() pour lire le nombre de secondes sous forme de nombre à virgule flottante.

Appel Résultat

render.timespan(1)

1 second

render.timespan(123)

2 minutes 3 seconds

render.timespan(12345)

3 hours 25 minutes

render.timespan(1234567)

14 days 6 hours

Une fréquence est en fait l'inverse du temps. L'unité canonique est le Hz, ce qui équivaut à 1 / s (l'inverse d'une seconde). Un exemple d'utilisation est la fréquence d'horloge d'un processeur :

Appel Sortie

render.frequency(111222333444)

111 GHz

7.2. Octets

En ce qui concerne la mémoire vive, les fichiers, les disques durs, les systèmes de fichiers et autres, l'unité canonique est l'octet. Comme les ordinateurs organisent généralement ces éléments par puissances de deux, par exemple en unités de 512, 1 024 ou 65 536 octets, il a été établi dès le début qu'un kilo-octet n'est pas égal à 1 000, et donc mille fois l'unité, mais à 1 024 (2 à la puissance 10) octets. C'est certes illogique, mais très pratique car cela donne généralement des nombres ronds. Le légendaire Commodore C64 disposait de 64 kilo-octets de mémoire et non de 65 536.

Malheureusement, à un moment donné, les fabricants de disques durs ont eu l’idée de spécifier la capacité de leurs disques par multiples de 1 000. Étant donné que la différence entre 1 000 et 1 024 est de 2,4 % pour chaque taille, et que celles-ci sont multipliées, un disque d’une taille de 1 Go (1 024 fois 1 024 fois 1 024) passe soudainement à 1,07 Go. Cela se vend mieux.

Cette confusion agaçante persiste encore aujourd’hui et continue de générer des erreurs. Pour y remédier, la Commission électrotechnique internationale (CEI) a défini de nouveaux préfixes basés sur le système binaire. En conséquence, aujourd’hui, un kilo-octet correspond officiellement à 1 000 octets et un kibi-octet à 1 024 octets (2 à la puissance 10). De plus, il convient de parler de mébi-octet, de gi-octet et de tébi-octet. Les abréviations sont alors KiB, MiB, GiB et TiB.

Checkmk se conforme à cette norme et vous aide, grâce à un certain nombre de fonctions de rendu personnalisées, à garantir que vous produisez toujours le résultat correct. Il existe par exemple la fonction « render.disksize() », spécialement conçue pour les disques durs et les systèmes de fichiers, qui produit son résultat en puissances de 1 000.

Appel Sortie

render.disksize(1000)

1.00 kB

render.disksize(1024)

1.02 kB

render.disksize(2000000)

2.00 MB

En ce qui concerne la taille des fichiers, il est souvent d'usage de préciser la taille exacte en octets sans arrondi. Cela présente l'avantage de vous permettre de voir très rapidement si un fichier a changé, même de façon minime, ou si deux fichiers sont (probablement) identiques. La fonction « render.filesize() » est utilisée à cet effet :

Appel Sortie

render.filesize(1000)

1,000 B

render.filesize(1024)

1,024 B

render.filesize(2000000)

2,000,000 B

Si vous souhaitez afficher une valeur qui n'est pas la taille d'un disque dur ou d'un fichier, utilisez simplement la fonction générique render.bytes(). Vous obtiendrez ainsi le résultat sous la forme « classique » des puissances de 1024, selon la notation officielle :

Appel Sortie

render.bytes(1000)

1000 B

render.bytes(1024)

1.00 KiB

render.bytes(2000000)

1.91 MiB

7.3. Bandes passantes, débits de données

Les professionnels des réseaux ont leurs propres termes et façons d'exprimer les choses. Et comme toujours, Checkmk s'efforce d'adopter la manière conventionnelle de communiquer dans chaque domaine. C'est pourquoi il existe trois fonctions de rendu différentes pour les débits de données et les vitesses. Ce qu'elles ont toutes en commun, c'est que les débits sont exprimés en octets par seconde, même si la sortie réelle est en bits !

render.nicspeed() représente la vitesse maximale d'une carte réseau ou d'un port de commutateur. Comme il ne s'agit pas de valeurs mesurées, il n'est pas nécessaire de les arrondir. Bien qu'aucun port ne puisse envoyer des bits individuels, les données sont exprimées en bits pour des raisons historiques.

Important : vous devez néanmoins également indiquer ici le nombre d'octets par seconde !

Appel Output

render.nicspeed(12500000)

100 MBit/s

render.nicspeed(100000000)

800 MBit/s

render.networkbandwidth() est destiné à une vitesse de transmission réellement mesurée sur le réseau. La valeur d'entrée est à nouveau exprimée en octets par seconde :

Appel Sortie

render.networkbandwidth(123)

984 Bit/s

render.networkbandwidth(123456)

988 kBit/s

render.networkbandwidth(123456789)

988 MBit/s

Lorsqu’aucun réseau n’est impliqué et que des débits de données sont tout de même générés, on utilise à nouveau les octets. Le cas le plus courant concerne les débits d’E/S des disques durs. On utilise pour cela la fonction « render.iobandwidth() », qui fonctionne avec des puissances de 1 000 dans Checkmk :

Appel Sortie

render.iobandwidth(123)

123 B/s

render.iobandwidth(123456)

123 kB/s

render.iobandwidth(123456789)

123 MB/s

7.4. Pourcentages

La fonction render.percent() représente un pourcentage — arrondi à deux décimales. Elle constitue une exception par rapport aux autres fonctions dans la mesure où elle ne transmet pas la valeur réelle — c'est-à-dire le rapport — mais le pourcentage réel. Par exemple, si quelque chose est à moitié plein, vous n'avez pas à transmettre 0.5 mais 50.

Comme il peut parfois être intéressant de savoir si une valeur est presque nulle ou exactement nulle, les valeurs sont marquées en ajoutant le caractère « < » pour les valeurs supérieures à zéro mais inférieures à 0,01 %.

Appel Sortie

render.percent(0.004)

<0.01%

render.percent(18.5)

18.50%

render.percent(123)

123.00%

7.5. Résumé

En conclusion, voici un aperçu de toutes les fonctions de rendu :

Fonction Entrée Description Exemple de sortie

date()

Temps Unix

Date

2023-11-14

datetime()

Temps Unix

Date et heure

2023-11-14 23:13:20

timespan()

Secondes

Durée / âge

3 hours 25 minutes

frequency()

Hz

Fréquence (par exemple, fréquence d'horloge)

111 GHz

disksize()

Octets

Taille d'un disque dur, base 1000

1.234 GB

filesize()

Octets

Taille d'un fichier, précision maximale

1,334,560 B

bytes()

Octets

Taille, base 1024

23.4 KiB

nicspeed()

Octets par seconde

Vitesse de la carte réseau

100 MBit/s

networkbandwidth()

Octets par seconde

Vitesse de transmission

23.50 GBit/s

iobandwidth()

Octets par seconde

Bandes passantes d'E/S

124 MB/s

percent()

Pourcentage

Pourcentage, arrondi de manière significative

99.997%

8. Dépannage

La gestion correcte des erreurs occupe (malheureusement) une grande partie de tout travail de programmation. La bonne nouvelle, c'est que l'API Check vous décharge déjà d'une grande partie de la gestion des erreurs. Pour certains types d'erreurs, il est donc préférable de ne pas les gérer vous-même.

Si Python rencontre une situation inattendue, il réagit par ce qu’on appelle une exception. Voici quelques exemples :

  • Vous convertissez une chaîne de caractères en nombre à l'aide de `int()`, mais la chaîne ne contient pas de nombre, par exemple `int("foo")`.

  • Vous utilisez `bar[4]` pour accéder au cinquième élément de `bar`, mais celui-ci ne comporte que quatre éléments.

  • Vous appelez une fonction qui n'existe pas.

Afin de déterminer comment traiter les erreurs, il est tout d’abord important de connaître l’emplacement exact dans le code où une erreur se produit. Vous pouvez utiliser soit l’interface graphique, soit la ligne de commande pour cela — selon l’endroit où vous travaillez actuellement.

8.1. Exceptions et rapports de plantage dans l'interface graphique

Si une exception se produit lors de la surveillance ou de la découverte de services dans l’Setup, l’Summary contient des références au rapport d’incident qui vient d’être créé. Cela ressemblera par exemple à ceci :

A service whose check plug-in has crashed.

En cliquant sur l'icône de l'Icon for a crashed check plug-in., une page contenant des détails s'affiche, dans laquelle vous :

  • pouvez voir le fichier dans lequel le plantage s'est produit,

  • obtenez toutes les informations relatives au plantage, telles que la liste des erreurs survenues dans le programme (traceback), les valeurs actuelles des variables locales, la sortie de l'agent et bien plus encore, et

  • nous envoyer le rapport (à Checkmk GmbH) sous forme de retour d'information.

La traceback vous aide, en tant que développeur, à déterminer s’il s’agit d’une erreur dans le programme (par exemple, l’appel d’une fonction inexistante) ou de données d’agent qui n’ont pas pu être traitées comme prévu. Dans le premier cas, vous devrez corriger l’erreur ; dans le second cas, il est souvent préférable de ne rien faire.

L'envoi du rapport n'est bien sûr utile que pour les plug-ins de vérification qui font officiellement partie de Checkmk. Si vous mettez vos propres plug-ins à la disposition de tiers, vous pouvez demander à vos utilisateurs de vous envoyer les données.

8.2. Affichage des exceptions en ligne de commande

Si vous exécutez votre plug-in de vérification à partir de la ligne de commande, vous ne recevrez aucune indication concernant l'ID d'un rapport de plantage généré. Vous ne verrez que le message d'erreur résumé :

OMD[mysite]:~$ cmk --detect-plugins=myhostgroups_advanced localhost
Error in agent based plugin myhostgroups: invalid syntax (myhostgroups.py, line 11)
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si vous ajoutez l'option --debug en tant que paramètre d'appel supplémentaire, vous recevrez la trace de l'interpréteur Python :

OMD[mysite]:~$ cmk --debug --detect-plugins=myhostgroups_advanced localhost
Traceback (most recent call last):
  File "/omd/sites/mysite/lib/python3/cmk/discover_plugins/_python_plugins.py", line 195, in add_from_module
    module = importer(mod_name, raise_errors=True)
             ^^^^^^^^^^^^^
  File "/omd/sites/mysite/lib/python3/cmk/discover_plugins/_python_plugins.py", line 156, in _import_optionally
    return importlib.import_module(module_name)
           ^^^^^^^^^^^^
  File "/omd/sites/mysite/lib/python3.12/importlib/init.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1387, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 995, in exec_module
  File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
  File "/omd/sites/mysite/local/lib/python3/cmk_addons/plugins/myhostgroups/agent_based/myhostgroups.py", line 110, in <module>
    agent_section_myhostgroups == AgentSection(
    ^^^^^^^^^^
NameError: name 'agent_section_myhostgroups' is not defined
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si l'erreur ne se reproduit pas lors de votre prochain appel à --debug, par exemple parce qu'une nouvelle sortie d'agent est disponible, vous pouvez également consulter les derniers rapports d'erreur dans le système de fichiers :

OMD[mysite]:~$ ls -lhtr ~/var/check_mk/crashes/check/ | tail -n 5
drwxrwxr-x 2 mysite mysite 4.0K Aug  6 17:56 7b59a49e-540c-11ef-9595-7574c603ce8d/
drwxrwxr-x 2 mysite mysite 4.0K Aug  6 17:56 7c8870c0-540c-11ef-9595-7574c603ce8d/
drwxrwxr-x 2 mysite mysite 4.0K Aug  6 17:56 7cf9626c-540c-11ef-9595-7574c603ce8d/
drwxrwxr-x 2 mysite mysite 4.0K Aug  6 17:56 7d192d68-540c-11ef-9595-7574c603ce8d/
drwxrwxr-x 2 mysite mysite 4.0K Aug  6 17:56 7e2d5ec2-540c-11ef-9595-7574c603ce8d/
Copier la ou les commandes dans le presse-papiers
Commande(s) copiée(s) avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Chacun de ces dossiers contient deux fichiers :

  1. crash.info contient un dictionnaire Python avec la trace d'erreur et de nombreuses autres informations. Un simple coup d'œil au fichier à l'aide du Pager suffit souvent.

  2. agent_output contient la sortie complète de l'agent telle qu'elle était au moment du plantage.

8.3. Sortie de débogage personnalisée

Dans les exemples présentés ci-dessus, nous utilisons la fonction `print()` pour afficher le contenu des variables ou la structure des objets à votre intention, en tant que développeur. Ces fonctions de sortie de débogage doivent être supprimées du plug-in de vérification final.

Au lieu de les supprimer, vous pouvez également faire en sorte que votre sortie de débogage ne s'affiche que lorsque le plug-in de vérification est appelé depuis la console en mode débogage. Pour ce faire, importez l'objet debug depuis la boîte à outils Checkmk et, si nécessaire, l'aide au formatage pprint(). Vous pouvez désormais générer une sortie de débogage en fonction de la valeur de l'objet debug :

Tip

L'objet debug a changé de chemin d'accès entre Checkmk 2.3.0 et 2.4.0. Au lieu de l'emplacement précédent cmk.utils, il se trouve désormais à l'adresse cmk.ccc. Le code portable tente d'abord d'importer à partir du nouveau chemin d'accès, puis se rabat sur l'ancien chemin en cas d'erreur.

try:
    from cmk.ccc import debug
except ImportError:
    from cmk.utils import debug

from pprint import pprint

def check_mystuff(section):
    if debug.enabled():
        pprint(section)
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Veuillez noter que toute sortie de débogage restante doit être utilisée avec parcimonie et se limiter à des indications qui aideront les utilisateurs suivants dans leur débogage. Les erreurs utilisateur évidentes et prévisibles (par exemple, lorsque le contenu de la section agent indique que le plug-in agent a été mal configuré) doivent recevoir la réponse « UNKNOWN » et inclure des notes explicatives dans le résumé.

8.4. Sortie d'agent non valide

La question est de savoir comment vous devez réagir si la sortie de l’agent ne se présente pas sous la forme à laquelle vous vous attendiez réellement — qu’elle provienne de l’agent Checkmk ou qu’elle soit reçue via SNMP. Supposons que vous vous attendiez toujours à trois mots par ligne, que devez-vous faire si vous n’en obtenez que deux ?

Eh bien, s’il s’agit d’un comportement autorisé et connu de l’agent, vous devez bien sûr l’intercepter et traiter les cas de figure. Toutefois, si cela n’est pas réellement autorisé, il est préférable d’agir comme si la ligne se composait toujours de trois mots, par exemple avec la fonction d’analyse suivante :

def parse_foobar(string_table):
    for foo, bar, baz in string_table:
        # ...
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si une ligne ne comporte pas exactement trois mots, une exception est générée et vous recevez le rapport d'erreur très utile que nous venons de mentionner.

Si vous accédez à des clés d’un dictionnaire dont on s’attend à ce qu’elles manquent occasionnellement, il peut bien sûr être judicieux de réagir en conséquence. Pour ce faire, vous pouvez définir le service sur « CRIT » ou « UNKNOWN » et ajouter une note dans le résumé concernant la sortie de l’agent qui ne peut pas être évaluée. Dans tous les cas, il est préférable d’utiliser la fonction « get() » du dictionnaire à cette fin plutôt que d’intercepter l’exception « KeyError ». En effet, get() renvoie un objet de type None ou un remplacement facultatif à passer en tant que deuxième paramètre si la clé n'est pas disponible :

def check_foobar(section):
    foo = section.get("bar")
    if not foo:
        yield Result(state=State.CRIT, summary="Missing key in section: bar")
        return
    # ...
Copier le contenu du fichier dans le presse-papiers
Contenu du fichier copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

8.5. Éléments manquants

Que se passe-t-il si l'agent renvoie des données correctes, mais que l'élément à vérifier est manquant ? Comme ceci, par exemple :

def check_foobar(item, section):
    # Try to access the item as key in the section:
    foo = section.get(item)
    if foo:
        yield Result(state=State.OK, summary="Item found in monitoring data")
    # If foo is None, nothing is yielded here
Copier le contenu du fichier dans le presse-papiers
Le contenu du fichier a été copié avec succès dans le presse-papiers !
L'accès en écriture au presse-papiers a été refusé !

Si l'élément que vous recherchez n'est pas présent, la boucle est exécutée et Python se termine simplement à la fin de la fonction sans renvoyer de résultat via yield. Et c'est exactement la bonne approche ! Car Checkmk reconnaît que l'élément à surveiller est manquant et génère le statut correct ainsi qu'un texte standard approprié avec la mention UNKNOWN.

8.6. Tests avec des fichiers de spool

Si vous souhaitez simuler des sorties d'agent particulières, les fichiers du répertoire spool sont très utiles. Vous pouvez les utiliser pour tester des cas limites qui sont autrement difficiles à reproduire. Ou vous pouvez utiliser directement la sortie d'agent qui a conduit à un rapport de plantage pour tester les modifications apportées à un plug-in de vérification.

Commencez par désactiver votre plug-in d'agent habituel, par exemple en révoquant son autorisation d'exécution. Créez ensuite un fichier dans le répertoire /var/lib/check_mk_agent/spool/ contenant la section d'agent (ou les sections d'agent attendues) que votre plug-in de vérification attend, y compris l'en-tête de section, et se terminant par un retour à la ligne. La prochaine fois que l'agent sera appelé, le contenu du fichier spool sera transféré à la place de la sortie du plug-in d'agent.

8.7. Les anciens plug-ins de vérification deviennent lents pour de nombreux services

Avec certains plug-ins de vérification qui utilisent des éléments, il est tout à fait possible que, sur des serveurs de grande taille, plusieurs centaines de services soient générés. Si aucune fonction d'analyse distincte n'est utilisée, cela signifie que la liste entière de centaines de lignes doit être parcourue pour chacun des centaines d'éléments. Le temps nécessaire à la recherche augmente donc proportionnellement au carré du nombre d'éléments répertoriés, ce qui signifie des dizaines de milliers de comparaisons pour des centaines de services. Si, en revanche, la liste imbriquée est transférée dans un dictionnaire, le temps nécessaire à la recherche d'un élément n'augmente que linéairement avec la taille du dictionnaire.

Dans le wiki Python, vous trouverez un aperçu des coûts de recherche dans différents types de données, y compris une explication et la notation O. L'utilisation de la fonction parse réduit la complexité de la recherche de O(n) à O(1).

Comme les anciennes versions de cet article n'utilisaient pas la fonction parse, vous devriez identifier ces plug-ins de vérification et les réécrire pour qu'ils utilisent la fonction parse.

9. Migration

L'API Check V1, introduite dans la version 2.0.0 de Checkmk, était prise en charge jusqu'à la version 2.3.0, mais ne l'est plus dans la version actuelle 2.4.0. Afin de pouvoir continuer à utiliser vos plugins de vérification, vous devez les migrer vers les nouvelles API tant que vous êtes encore sur 2.3.0.

Les informations suivantes vous aideront à migrer vos plugins de vérification de l'API Check V1 vers la V2 :

  • La nouvelle structure de répertoires et la convention de nommage pour le stockage des fichiers de toutes les API de plug-ins sont disponibles dans la documentation de l'API sur la page principale Checkmk’s Plug-in APIs.

  • Le résumé des modifications apportées à l'API Check V2 est également disponible dans la documentation de l'API à l'adresse Checkmk’s Plug-in APIs > Agent based ('Check API') > Version 2 > New in this version. Vous y trouverez également le lien vers un commit GitHub qui migre le plugin de vérification existant apt vers l'API Check V2.

  • Sur GitHub, vous trouverez dans le répertoire treasures de Checkmk des scripts qui vous aideront à migrer vers les nouvelles API.

Important

Nous mettons ces fichiers à disposition dans le répertoire treasures car ils peuvent être utiles à notre communauté. Toutefois, ils ne font pas partie du produit Checkmk lui-même. Les scripts situés dans treasures ne sont pas couverts par l'assistance. L'utilisation de ces scripts se fait à vos propres risques.

10. Fichiers et répertoires

Chemin d'accès au fichier Description

~/local/lib/python3/cmk_addons/plugins/

Répertoire de base pour le stockage des fichiers de plug-ins.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/agent_based/

Emplacement de stockage des plug-ins de vérification écrits conformément à l'API Check V2.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/rulesets/

Emplacement de stockage des fichiers de jeux de règles créés conformément à l'API Rulesets.

~/local/lib/python3/cmk_addons/plugins/<plug-in_family>/graphing/

Emplacement de stockage des fichiers de graphiques créés conformément à l'API Graphing.

/usr/lib/check_mk_agent/plugins/

Ce répertoire se trouve sur un hôte Linux surveillé. L'agent Checkmk pour Linux attend ici les extensions de l'agent (plug-ins de l'agent).


Last modified: Wed, 01 Apr 2026 14:11:35 GMT via commit e942b8dca
Sur cette page