Implementation de la stack de monitoring (Prometheus, Grafana, Alert Manager) dans des conteneur Docker … Partie 1
Prometheus est un projet open-source cree par SoundCloud afin de monitorer une infrastructure hautement disponible de micro-services. Ils ont décidé de mettre sur pied ce projet car les solution traditionnelles de monitoring ne correspondaient vraiment pas pour cela. Il est devenu au fil du temps l’outil de monitoring le plus populaires actuellements sur des environnements cloud du fait de sa flexibilité, du fait qu’il soit super customizable et ne génère pas de problèmes de performances.
Prometheus dans son architecture permet d’observer de façon permanente les infrastructures et applications cloud native, et s’adapte totalement au fait que les conteneurs soient “remplaçables” ou même extensibles. Elle est donc idéale dans un cadre devops.
Dans cette série d’articles, nous allons vous présenter l’architecture complète de prometheus dans un premier temps et ensuite nous verrons comment vous pouvez déployer toute la stack dans des conteneurs docker pour monitorer vos serveurs, conteneurs et applications.
Architecture
Le schéma ci-dessus représente un high level design du fonctionnement de prometheus. Les composants principaux étant :
- Le Serveur prometheus
Il est responsable de récupérer en http les métriques et les stocker en local sous forme de time series.
Ces métriques sont caractérisés par un nom, un ensemble de clés/valeurs qui sont représentés comme des labels et une valeur correspondant à la valeur de la métrique a cet instant donné.
Ci-dessous un exemple de donnée :
up{job=””, instance=””}: 1
- Up représente le nom de la métrique
- Job et instance sont des labels
- 1 c’est la valeur a cet instant.
Il met a disposition une interface de requetes des données du monitoring en utilisant le langage PromQL – https://prometheus.io/docs/prometheus/latest/querying/basics/
Lors du traitement des métriques, il peut aussi générer des alertes et les pousser au module d’alerting (qui sera vu dans la prochaine partie de ce blog) pour notifier les utilisateurs du problème.
Il fournit aussi une interface de consultation des données scrutées, à partir de laquelle vous pouvez executer des requetes promQL. Cette interface est assez basique et sert uniquement pour une restitution rapide des données. Il est de ce fait recommandé d’installer grafana qui est plus complet de fournir des graphiques et autres tableaux de bords permettant de mieux suivre de façon visuelle l’activité de votre infrastructure.
- Les Job Exporters
Il s’agit ici des services qui exposent en http les données/métriques qui seront collectées par prometheus. Il en existe plusieurs selon la plateforme et l’application à monitorer. Les 2 les plus populaires étant :
- Node exporter
Développé par prometheus, cet exporter permet de recueillir un très grand nombre de données sur la supervision des serveurs(physiques ou virtuelles). Vous pouvez l’utiliser pour suivre et vérifier la plupart des composants relatives a la santé d’un serveur.
- Cadvisor
Cet exportateur est développé par google et permet de fournir des informations sur le fonctionnement de vos conteneurs.
Plusieurs autres métriques sont disponibles, en fait la majorité des logiciels (nginx, mysql, traefik, etc) disposent d’au moins un exportateur pour prometheus.
- Alert Manager
La gestion des alertes dans prometheus se fait a 2 niveau :
- Côte prometheus serveur, sur lequel les règles d’alertes sont configurés et qui génère et envoi les alertes vers un serveur alert manager
- L’alert manager qui permet de traiter les alertes générées par le serveur prometheus. Il peut être configuré pour envoyer des notification vers plusieurs types de destination telles que slack, email, pagerDuty. Il est aussi capable d’envoyer sous forme de webhook les notifications qu’il reçoit vers un service http externe que vous pouvez développer.
Il implémente aussi plusieurs fonctionnalités telles que la déduplication des alertes, le mise en silence des alertes, l’inhibition, le groupage ou l’agrégation qui seront vues en détails dans le prochain article.
Haute disponibilité du serveur prometheus
Comme indique precedemment, le serveur prometheus stocke les informations sous forme de time-series en local sur le serveur. Cela souleve 2 problemes qui sont :
- La perte de données si le serveur prometheus crashe
- L’absence totale du monitoring en cas de soucis sur le serveur prometheus
Afin de palier a cela, certaines solutions sont possibles :
- La plus populaire est l’utilisation de plusieurs serveurs prometheus qui scrutent les même métriques et les stockent en local. Vous pourrez donc requêter un serveur prometheus pour obtenir les time-series et vu que alert manager déduplique les alertes, il y a pas risque de recevoir plusieurs fois les alertes identiques si elles sont poussées par plusieurs serveurs prometheus.
- Il est aussi possible d’utiliser l’outil Thanos pour la federation de clusters prometheus – https://github.com/thanos-io/thanos
Installation du serveur prometheus et configuration d’un node exporter
- Installation du serveur
- Créer le fichier docker-compose.yml avec le contenu ci-dessous
version: ‘3.2’
services:
prometheus:
image: prom/prometheus
ports:
– ‘9090:9090’
volumes:
– ‘./prometheus.yml:/etc/prometheus/prometheus.yml’
- Creer le fichier prometheus.yml avec le contenu ci-dessous
# my global config
global:
scrape_interval: 60s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 60s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# A scrape configuration containing exactly one endpoint to scrape:
# Here it’s Prometheus itself.
scrape_configs:
# The job name is added as a label `job=` to any timeseries scraped from this config.
– job_name: ‘servers’
# metrics_path defaults to ‘/metrics’
# scheme defaults to ‘http’.
static_configs:
– targets: [‘nodeexporterhost:9100’]
- Demarrer le conteneur prometheus
docker-compose up -d
- Installation du node exporter
Sur le serveur “’nodeexporterhost”, exécuter la commande ci-dessous pour démarrer votre conteneur de type node exporter.
docker run -d -p 9100:9100 -v “/proc:/host/proc” -v “/sys:/host/sys” -v “/:/rootfs” –net=”host” prom/node-exporter
- Vérifier que l’ensemble fonctionne correctement en accédant à l’url http://:9090/=