Bonjour,
Heureux de vous
revoir à nouveau,
Aujourd’hui, je vais vous montrer comment mettre en place une solution de monitoring à l’aide de Prometheus, Grafana et Alertmanager. Mais tout d’abord,
Qu’est-ce que c’est que Prometheus ?
Prometheus, est
un logiciel libre qui permet de collecter des métriques dans les
infrastructures informatiques afin d’effectuer de la supervision, mais
également de la gestion d’alerte sur seuil. Prometheus permet entre autres, la
surveillance des réseaux, des microservices et des bases de données. À
Prometheus, on peut coupler certains modules complémentaires comme : *Grafana, qui est un outil open-source permettant d’afficher les métriques collectées par Prometheus sous forme de graphes et **Alertmanager, qui quant à lui est un composant qui sert à envoyer des alertes en se basant sur des conditions prédéfinies au sein de Prometheus.
Maintenant que vous en savez un peu plus sur Prometheus, nous allons nous intéresser au scénario suivant ; nous souhaitons monitorer au sein de notre infrastructure réseau trois types de serveur principaux : un serveur de base de données, un serveur sous système d’exploitation Windows et un serveur hébergeant plusieurs services sur système GNU/Linux. La solution à mettre en place doit être capable de remonter les informations qui nous intéressent telles que l’état du système (espace disque utilisé, quantité de RAM disponible,…), l’état des services (applications, services, microservices,…), et autres éléments essentiels, concernant les serveurs à surveiller. De plus, la solution doit être capable d’afficher sous forme de graphes les différents résultats et enfin, des notifications doivent être générées et transférées dans le but d’alerter ou avertir l’administrateur d’un évènement en particulier ou d’un ensemble d’évènements donnés.
scrape_interval: 5s
external_labels:
monitor: 'node'
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['@IP_Serveur:9090'] ## Prometheus
(Ps : ce fichier sera modifié au fur et à mesure que des collecteurs de métriques devront être ajoutés au sein de notre système d’information.)
Pour ce faire, comme nous souhaitons l’installer via la technologie docker, il nous suffit d’entrer la commande : « docker run -d --name=grafana -p 3000:3000 grafana/grafana » et c’est tout ! 😱
Une fois, dans l’interface de configuration de Grafana, nous pouvons pour des soucis de sécurité configurer trois types de comptes différents et ne disposant pas des mêmes droits d’accès (c’est le but évidemment 😅) : le compte administrateur qui a une visibilité totale et peut effectuer toutes les opérations possibles (ou disponibles) sur Grafana, le compte éditeur qui est limité dans le sens où il ne dispose pas des autorisations nécessaires pour créer des nouveaux comptes utilisateurs et le compte observateur qui est totalement restreint et ne peut comme son nom l’indique que se contenter d’observer les dashboards😜. Donc pour configurer nos différents comptes utilisateurs, nous nous rendons au niveau de l’onglet |Server Admin| et nous sélectionnons l’option |Users|
Une fois le compte créé, dans le but de restreindre ses autorisations ou non, il faut le sélectionner pour modifier son type.
Et valider toutes les modifications apportées en cliquant sur |Save|.Une fois Node
Exporter installé sur notre serveur à monitorer, nous allons modifier le
fichier de configuration de Prometheus dans le but de lui indiquer la présence
du collecteur de métrique Node Exporter sur l’un des nœuds de notre
infrastructure possédant l’adresse réseau 192.168.100.144
suivi du numéro de port sur lequel le collecteur tourne :
- job_name: 'node-exporter'
static_configs:
- targets: ['@IP_Serveur:9100'] ## Node_Exporter
[client]
user=utilisateur
password=password
Si nous nous rendons à nouveau au niveau de l’interface web de Prometheus, dans l’onglet |Status| et nous sélectionnons l’option |Targets| ,
Nous cliquons sur le bouton |Add data source| .
Au niveau du menu vertical, on clique sur l’onglet |+| et nous sélectionnons l’option |Import| ,
Une fois qu’on a repéré l’identifiant du Dashboard que l’on souhaite créer, nous le renseignons dans la zone prévue à cet effet et nous cliquons sur le bouton |Load| :
Après avoir valider la création du Dashboard, nous sommes immédiatement redirigés vers celui-ci et nous nous rendons compte que les différentes métriques internes (CPU, quantité de la RAM utilisée, espace du disque dur disponible, trafic du réseau entrant et sortant,...) sont affichées visuellement sous forme de graphe, normal, puisque c’est le collecteur de métrique Node Exporter qui en est la cause, l’identifiant renseigné est propre au collecteur de métrique de type Node Exporter.
N’est-ce pas joli à regarder ? 😄
(Ps: au cas où il y aurait un pare-feu d’installer et que les métriques ne remontent pas au niveau des graphes, faudra penser à allouer le port défini pour l’exportateur de métrique via la commande « ufw allow 9100 ».)
Nous procédons de la même manière pour créer le Dashboard qui va renvoyer les données transférées depuis le collecteur de métrique concernant les différents microservices ou les applications conteneurisées installées au sein de nos postes à monitorer en renseignant cette fois-ci les informations propres à Docker Exporter.
Et comme précédemment avec Node Exporter, après avoir terminé, nous sommes directement redirigés vers le Dashboard relatif au collecteur de métriques de type Docker Exporter qui nous affiche les informations telles que l’état du conteneur : démarré (en couleur verte fréquemment) ou éteint (en rouge la plupart du temps), leur pourcentage de CPU utilisé, le trafic réseau entrant et sortant, leur quantité de RAM ou encore la capacité d’espace disque utilisée.
Pour le moment, nous constatons uniquement la présence de deux services du nom de docker_exporter et node_exporter normal se sont les deux seuls de ce genre installés pour l’instant sur notre serveur prévu à cet effet. Mais si on ajoute quelques applications conteneurisées en plus comme : Python, MySQL, Nginx,
À présent, nous allons passer à l’installation de notre dernier collecteur de métriques (mais pas l’un des moindres 😉) : MySQL Exporter. Pour ce faire, nous allons procéder comme suit : nous nous rendons dans un premier temps sur le serveur de base de données dont on souhaite obtenir les informations ;
Ensuite, nous allons créer un nouvel utilisateur avec pour nom : utilisateur (je sais, on ne fait pas plus difficile comme nom 😏) qui va nous être utile pour la suite de la procédure et on va lui attribuer tous les droits sur les bases de données de notre SGBD MySQL :
Puis, nous installons notre collecteur de métriques MySQL Exporter grâce à la commande « docker run -d --name mysql-exporter -p 9104:9104 -e DATA_SOURCE_NAME="utilisateur:password@(192.168.100.222:3306)/" prom/mysqld-exporter-linux-amd64:v0.13.0 » en lui précisant comme variables le nom d’utilisateur suivi de son mot de passe, ainsi que l’adresse IP et le numéro de port où est localisée la base de données.
Nous accédons à
notre conteneur précédemment créé via la commande « docker
exec -u root -it mysql-exporter /bin/sh » et nous continuons à
l’intérieur même du conteneur MySQL Exporter avec la création du fichier
‘‘caché’’ {.my.cnf} qui va contenir
les lignes suivantes :
Avant de redémarrer entièrement le conteneur grâce à la commande « sudo docker restart mysql-exporter » pour que toutes les modifications soient prises en compte.
Et enfin, comme nous l’avons déjà fait plus haut avec Node Exporter et Docker Exporter, nous ajoutons de nouvelles informations relatives au collecteur de métrique MySQL Exporter au fichier de configuration de Prometheus.
Si nous nous rendons à nouveau sur l’interface web de Prometheus, nous remarquons la présence d’un nouvel Endpoint du nom de mysql_exporter,
Passons à la création du Dashboard qui sera associé à notre tout nouveau collecteur de métriques de type MySQL Exporter ;
Une fois après avoir validé la création du Dashboard en cliquant sur le bouton |Import|, concernant le collecteur de métriques MySQL Exporter, il peut arriver qu’on soit redirigé vers un tableau de bord qui ne dispose d’aucune donnée (No Data),
Ceci peut être dû au fait qu’un pare-feu empêche le rapatriement des données depuis le port sollicité, ou alors que le service MySQL n’autorise pas la diffusion sur certains ports ou adresses IP spécifiques. Une solution consiste à modifier le fichier de configuration de MySQL pour autoriser la diffusion sur toutes les adresses en modifiant les variables bind-address et mysqlx-bind-address dans le fichier de configuration de MySQL.
Et si l’on retourne sur le Dashboard de MySQL Exporter, nous nous rendons compte que les données s’affichent dorénavant sauf celle concernant [Buffer Pool Size of Total RAM], ça peut être due tout simplement au fait que notre base de données n’effectue pas ce genre d’opération en ce moment précis ou alors n’en est pas capable ;
Néanmoins Grafana nous donne la possibilité de pouvoir modifier des tableaux de bord à notre convenance. Donc si nous voulons omettre toutes ou certaines données non-affichables (celles marquées en No Data) ou même existantes, mais qui ne nous intéresses pas tellement, nous pouvons le faire facilement, ainsi, nous pouvons nous retrouver finalement avec ce visuel.
Jusqu’à présent
les serveurs sur lesquels on a eu à effectuer des opérations tournent sous
système d’exploitation GNU/Linux,
supposons qu’au sein des serveurs que nous désirons surveiller se trouve un
serveur avec un O.S Microsoft Windows,
pas d’inquiétude il existe également un collecteur de métriques spécialement dédié
pour ce genre de situation 😎.
Nous commençons par nous rendre sur le poste en question,
Puis, nous allons télécharger et installer le logiciel Windows Exporter depuis cette adresse.
Comme tout logiciel Windows la procédure d’installation est pratiquement la même (suivant > suivant … > terminé 😅) plus sérieusement, nous allons d’abord cliquer sur le bouton |Enregistrer le fichier| ,
Ensuite, tour à tour, nous cliquons sur |Exécuter| suivi de |Oui| pour autoriser l’installation du logiciel sur notre système.
Et comme d’habitude à chaque fois qu’un nouveau collecteur de métriques est ajouté au sein de notre infrastructure réseau, nous devons pour que ce dernier soit pris en compte par Prometheus, renseigner sa présence (ou son existence) au niveau du fichier de configuration {prometheus.yml}, vous vous en souvenez j’espère 😄.
Ainsi que nous l’avons déjà fait auparavant avec Node Exporter, Docker Exporter et MySQL Exporter (vous devez déjà avoir l’habitude à force 😅), nous allons également créer un Dashboard pour visualiser sous forme de graphes les différentes métriques de Windows Exporter, l’identifiant du tableau de bord utilisé sera cette fois-ci 6593 :
Au final, nous obtenons le Dashboard ci-dessous qui nous renvoi les informations des métriques internes (la période d’activité, le pourcentage de CPU sollicité, la quantité de mémoire RAM utilisée, l’espace disque alloué,...) de notre serveur fonctionnant sous un système d’exploitation Windows.
Ce qui est également assez ‘‘cool’’ avec Grafana 😎, c’est qu’il nous donne la possibilité de pouvoir importer et créer plusieurs Dashboards relatifs au même collecteur de métriques, mais avec des identifiants différents, pour pouvoir avoir aussi une variété de présentation de graphes exploitant les mêmes métriques ; donc à la place de l’identifiant 6593 précédemment utilisé, nous pouvons à la place utiliser l’identifiant 12422 ou tout autre identifiant relatif au collecteur de métrique de type Windows Exporter et qui nous semble le plus significatif ou parlant en terme de quantité d’informations retournées.
Jusqu’ici, nous disposons
d’une solution de monitoring qui fonctionne à l’aide de plusieurs
éléments : nous avons dans un premier temps les collecteurs de métriques
(Node Exporter, Docker Exporter, MySQL Exporter et Windows Exporter) qui
collectent les données et les transmettent à Prometheus ; ensuite,
Prometheus stocke les différentes métriques les analyse et les traite avant à
son tour de transférer les informations qui en découlent au niveau de Grafana,
qui va quant à lui interpréter les informations reçues et afficher les
résultats obtenus sous forme de graphes. Bref ce n’est pas mal déjà, on
pourrait même s’arrêter là😇, mais une solution complète de
monitoring digne de ce nom doit pouvoir être capable au moins de notifier via
des alertes de types émail ou SMS au cas où surviendrait un imprévu, dans le
but que l’on prenne les dispositions adéquates et nécessaires pour y remédier
rapidement. Raison pour laquelle à Prometheus et Grafana nous allons coupler en
plus un troisième élément à savoir : AlertManager, qui aura pour rôle
principal de générer des alertes et les transférer sous forme de notification
émail à chaque fois qu’une ou plusieurs conditions précises sont préalablement
remplies.
Pour ce faire,
nous allons commencer par créer un fichier nommé {alertmanager.yml} et y insérer les lignes ci-après :
global:
resolve_timeout: 2m
smtp_require_tls: false
http_config:
tls_config:
insecure_skip_verify: true
route: # regles de declenchement
group_by: ['alertname']
group_wait: 10s # temps d'attente avant notification du group
group_interval: 1m # delai par rapport aux alertes du meme groupe
repeat_interval: 5s # attente avant repetition
receiver: 'email-me'
receivers:
- name: 'email-me'
email_configs:
- to: "jack.grafana@gmail.com"
from: "jack.grafana@gmail.com"
smarthost: "smtp.gmail.com:465"
auth_username: "jack.grafana@gmail.com"
auth_identity: "jack.grafana@gmail.com"
auth_password: "P@$$w0rd12345"
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.100.136:9093
Nous pouvons nous assurer que le fichier {alerts.yml} est correctement édité à l’aide de ces commandes : « docker exec -u root -ti prometheus /bin/sh » et « promtool check rules /etc/prometheus/rules/alerts.yml ».
Nous retrouvons
toutes les alertes définies précédemment plus haut dans le fichier {alerts.yml}, il faut noter également
que les alertes en question peuvent prendre trois états différents :
*Inactive → pour signifier que tout fonctionne
correctement le seuil de la condition n’a pas été atteint ou débordé ;
**Pending → pour signifier que la condition est en
cours de vérification ou dans un état intermédiaire ou alors inconnu pour le
moment ;
***Firing → pour signifier que la condition à examiner est respectée (le seuil défini est soit atteint ou alors largement dépassé), c’est ce genre d’état-là qui va pousser AlertManager à générer des notifications.
Comme par exemple cette règle qui s’occupe de la vérification de l’espace disque de la machine physique (ceci grâce au collecteur de métriques Node Exporter si vous vous souvenez 😉), une fois qu’elle passe à l’état ‘‘Firing’’,
AlertManager la capture dans son interface web avant de générer une notification sous forme d’émail :
Qui nous parvient à l’adresse (ou aux adresses) de messagerie électronique prévue(s) à cet effet avec en précision, l’adresse IP de la machine qui a provoqué l’alerte, le type de collecteur de métriques concerné, la description de l’alerte, ...
Notre solution de monitoring est dorénavant bien installée, paramétrée et fonctionnelle ; elle dispose de trois éléments principaux :
(1) Prometheus qui collecte les données transférées
par les collecteurs de métriques et les stocke dans sa base de données ;
(2)
Grafana
qu’on va combiner à Prometheus, et lui, il va s’occuper d’interpréter les
données envoyées par ce dernier et afficher les résultats sous forme de
graphes ;
et enfin (3) AlertManager quant à lui va se
charger d’examiner des règles définies au niveau de Prometheus, et générer des
notifications sous forme de mails une fois les conditions respectées.
Nous allons à
présent nous intéresser au cas où nous nous retrouverions au sein d’une
infrastructure réseau qui ne dispose pas de technologie Docker, mais que nous
souhaitons néanmoins toujours mettre en place une solution de monitoring qui
respecte la structure précédente, c’est-à-dire un serveur qui va
contenir : Prometheus, Grafana et AlertManager ; un second serveur
qui va contenir : Node Exporter, Docker Exporter ; un serveur de base
de données avec MySQL Exporter et en dernier un serveur sous Microsoft Windows
qui va contenir Windows Exporter, sans toutefois qu’aucun des serveurs en
question ne dispose de technologie Docker. Cela est tout à fait possible, mais
nous n’aurons plus besoin cependant d’installer Docker Exporter sur l’un des
serveurs puisqu’aucune des applications ou services ne sera conteneurisés.
Nous allons procéder comme suit ; déjà pour installer Prometheus, après avoir effectué la mise à jour des paquets du système, nous exécutons la commande « sudo apt-get install prometheus prometheus-node-exporter prometheus-pushgateway -y » :
Passons à présent à l’installation de Grafana ; pour ce faire, nous exécutons tour à tour les commandes « apt-get install -y adduser libfontconfig », suivie de « wget https://dl.grafana.com/oss/release/grafana_5.4.3_amd64.deb » et « dpkg -i grafana_5.4.3_amd64.deb ».
Puis, nous vérifions que Grafana est bien installé et nous entrons les commandes « systemctl enable grafana-server » et « systemctl start grafana-server » respectivement pour activer Grafana et le démarrer, de même, provoquer son exécution directement au lancement du système.
Ensuite, installons AlertManager de cette manière : nous commençons par créer un utilisateur du nom de alertmanager, après, nous créons les répertoires /etc/alertmanager et /var/lib/alertmanager/data et nous lui attribuons les droits adéquats, avant de télécharger l’archive d’AlertManager depuis le dépôt officiel situé sur le site de github :
Nous poursuivons en éditant et en attribuant les droits au fichier {alertmanager.yml},
Ensuite, nous
passons à la création du fichier {alertmanager.service}
et nous lui renseignons les lignes ci-après ce qui va nous permettre de générer
le service AlertManager :
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target
[Service]
User=alertmanager
Group=alertmanager
Type=simple
WorkingDirectory=/etc/alertmanager/
ExecStart=/usr/local/bin/alertmanager --config.file=/etc/alertmanager/alertmanager.yml --web.external-url http://0.0.0.0:9093
[Install]
WantedBy=multi-user.target
Puis, nous effectuons des modifications sur le fichier de configuration de Prometheus, également, nous créons et éditons le fichier {alerts.yml} qui contient les règles que AlertManager doit prendre en compte,
Et enfin, nous redémarrons les services Prometheus et AlertManager pour que toutes les modifications soient prises en considération.
Maintenant, nous
allons nous intéresser à l’installation des collecteurs de métriques à
savoir : Node Exporter et MySQL Exporter uniquement étant donné que pour
Windows Exporter c’est la même procédure que celle décrite plus haut et nous
n’aurons plus besoin de Docker Exporter puisque nous sommes (dans ce scénario 🎥) en environnement dépourvu de technologie Docker (par conséquent pas
d’existence de services conteneurisés).
Donc commençons par l’installation de Node Exporter : nous créons un utilisateur du nom de node_exporter, ensuite, nous récupérons l’archive de Node Exporter grâce à la commande « curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz » nous continuons par décompresser l’archive nouvellement téléchargée, la copie de l’élément node_exporter et l’attribution des droits adéquats ;
Par la suite,
nous créons le service Node Exporter en renseignant les lignes ci-après
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
Ensuite, nous exécutons les commandes « systemctl daemon-reload », « systemctl start node_exporter » et « systemctl enable node_exporter » pour démarrer le service Node Exporter.
Une fois que le service Node Exporter est installé, comme nous avons déjà l’habitude de le faire, il faut apporter des modifications au fichier de configuration du service Prometheus. Nous poursuivons avec l’installation du service MySQL Exporter, c’est pratiquement le même principe que précédemment : nous récupérons l’archive nécessaire à l’installation de MySQL Exporter ;
Après avoir décompressé l’archive, nous allons créer au niveau du répertoire /etc/ le fichier {.exporter.cnf} qui va nous servir de liaison entre le service MySQL Exporter et le serveur de base de données ;
Enfin, nous
créons le service MySQL Exporter et nous le démarrons.
[Unit]
Description=Prometheus MySQL Exporter
After=network.target
[Service]
Type=simple
Restart=always
ExecStart=/bin/sh -c '/usr/local/bin/mysqld_exporter \
--config.my-cnf /etc/.exporter.cnf \
--collect.global_status \
--collect.info_schema.innodb_metrics \
--collect.auto_increment.columns \
--collect.info_schema.processlist \
--collect.binlog_size \
--collect.info_schema.tablestats \
--collect.global_variables \
--collect.info_schema.query_response_time \
--collect.info_schema.userstats \
--collect.info_schema.tables \
--collect.perf_schema.tablelocks \
--collect.perf_schema.file_events \
--collect.perf_schema.eventswaits \
--collect.perf_schema.indexiowaits \
--collect.perf_schema.tableiowaits \
--collect.slave_status \
--web.listen-address=0.0.0.0:9104'
[Install]
WantedBy=multi-user.target
À présent, vous
savez comment installer et configurer une solution de monitoring complète grâce
à Prometheus qui va collecter les métriques
envoyées par les différents collecteurs de métriques (tels que Node Exporter,
Docker Exporter, MySQL Exporter, Windows Exporter), Grafana qui a pour but d’afficher sous forme de graphes les
métriques recueillies et pour finir, AlertManager
dont le rôle est de générer des alertes en se basant sur des conditions
prédéfinies en amont et présenter le tout sous forme de notifications qui
seront transféré par exemple sous forme d’emails. Vous êtes capable de le
réaliser aussi bien dans un environnement disposant de technologie Docker qu’au
sein d’une infrastructure standard dépourvu de Docker. Enfin, en petit bonus
rien que pour vous 😉je laisse ce ‘‘petit’’ fichier (qui résume les commandes utilisées tout au long de la procédure
d’implémentation de la solution sur les deux types d’environnement) à votre
disposition 😎.
Merci d’avoir suivi le tutoriel
jusqu’à la fin.
À très bientôt !!!