Prometheus



1. Introduction à Prometheus

Prometheus est un système open-source de surveillance et d’alertes principalement conçu pour la collecte, le stockage et l’analyse de séries temporelles de données. Il est couramment utilisé pour surveiller les applications et l'infrastructure, en particulier dans les environnements de microservices, les conteneurs, et les environnements cloud natifs. Prometheus est particulièrement adapté pour surveiller les systèmes distribués grâce à sa capacité à collecter des métriques sur des périodes définies.

Créé initialement par SoundCloud en 2012, Prometheus fait maintenant partie de la Cloud Native Computing Foundation (CNCF), aux côtés de Kubernetes et d’autres technologies. Il est largement utilisé dans les environnements DevOps et pour le monitoring des infrastructures modernes.

1.1. Caractéristiques principales de Prometheus :

  • Collecte de métriques en temps réel : Prometheus collecte des métriques en temps réel via des requêtes HTTP. Les métriques sont exposées par les applications ou les serveurs sous forme de séries temporelles.
  • Base de données en séries temporelles : Prometheus utilise une base de données optimisée pour stocker des séries temporelles, c’est-à-dire des ensembles de valeurs numériques indexées par une horodatation.
  • Langage de requête puissant (PromQL) : Prometheus dispose de son propre langage de requête, PromQL (Prometheus Query Language), permettant de sélectionner, agréger et filtrer les données stockées dans la base.
  • Alertes : Prometheus peut générer des alertes basées sur les métriques collectées, les envoyer à un système d’alertes externe comme Alertmanager, et configurer des notifications via e-mail, Slack, ou autres systèmes de communication.
  • Architecture pull : Contrairement à de nombreux systèmes de monitoring, Prometheus fonctionne principalement en mode "pull", où il interroge activement les cibles pour récupérer les métriques à intervalles réguliers.

2. Architecture de Prometheus

L'architecture de Prometheus repose sur plusieurs composants interconnectés qui lui permettent de collecter, stocker et analyser les données de manière efficace.

2.1. Composants principaux :

  • Prometheus Server : C'est le cœur du système. Il interroge les cibles (celles qui exposent les métriques via HTTP) à intervalles réguliers et stocke les données dans sa base de données en séries temporelles.
  • Targets : Ce sont les applications ou services qui exposent des métriques via une interface HTTP. Ces cibles peuvent être des applications web, des bases de données, des serveurs, des containers Docker, des équipements réseau, etc.
  • Exporters : Des outils qui collectent et exposent les métriques d'une application ou d'un service vers Prometheus. Par exemple, Node Exporter pour les métriques système (CPU, mémoire, disque) ou Blackbox Exporter pour tester la disponibilité de services.
  • Alertmanager : Un composant séparé qui gère les alertes envoyées par Prometheus. Il prend en charge le filtrage, l’agrégation et l’envoi de notifications aux utilisateurs via des canaux comme l’e-mail, Slack, ou des webhooks.
  • Prometheus Web UI : L'interface utilisateur Web fournie par Prometheus pour visualiser les métriques, interroger les séries temporelles, et tester les requêtes avec PromQL.
  • Pushgateway (optionnel) : Bien que Prometheus soit basé sur un modèle pull, le Pushgateway permet aux applications éphémères ou à celles qui ne peuvent pas être scrutées par Prometheus de "pousser" leurs métriques vers Prometheus.

3. Collecte des métriques dans Prometheus

3.1. Le modèle de données : séries temporelles

Les métriques dans Prometheus sont stockées sous forme de séries temporelles. Chaque série temporelle est définie par :

  • Nom de la métrique : Le nom de la métrique (par exemple, http_requests_total, qui représente le nombre total de requêtes HTTP).
  • Labels : Des paires clé-valeur qui permettent de distinguer différentes séries temporelles de la même métrique. Par exemple, un label pourrait être method="GET" ou status="200".
  • Valeur : La valeur associée à une série temporelle à un moment donné, telle qu’un compteur ou un taux.
  • Timestamp : Le moment précis où la valeur a été enregistrée.

3.2. Modèle "pull" et collecte de métriques

Prometheus fonctionne principalement avec un modèle pull. Cela signifie qu'il interroge les cibles à intervalles réguliers pour récupérer leurs métriques. Cela contraste avec le modèle push, où les applications envoient activement des métriques vers un serveur de monitoring.

3.3. Configuration des cibles de scrape

Dans Prometheus, les cibles de scrape sont définies dans un fichier de configuration prometheus.yml. Ce fichier spécifie les différentes cibles que Prometheus doit interroger.

Exemple d'une configuration de scrape :


                        scrape_configs:
                          - job_name: 'node_exporter'
                            static_configs:
                              - targets: ['localhost:9100']
                          

Dans cet exemple, Prometheus interroge le Node Exporter sur le port 9100 pour collecter les métriques système.


4. PromQL - Langage de requête de Prometheus

PromQL est un langage puissant qui permet de créer des requêtes pour extraire, filtrer, et agréger les métriques stockées dans Prometheus.

4.1. Syntaxe de base

Une requête PromQL est composée de :

  • Nom de la métrique : Par exemple, http_requests_total pour le nombre total de requêtes HTTP.
  • Filtres et labels : Les labels permettent de filtrer les séries temporelles. Exemple : http_requests_total{method="GET"} pour sélectionner les requêtes GET.
  • Opérateurs : Pour effectuer des opérations comme l'agrégation, la somme, la moyenne, etc. Exemple : sum(http_requests_total) pour calculer le total des requêtes.

4.2. Exemples de requêtes

  • Total des requêtes HTTP GET :
    sum(http_requests_total{method="GET"})
  • Moyenne de l’utilisation CPU :
    avg(node_cpu_seconds_total{mode="idle"})

4.3. Fonctions d’agrégation

Prometheus prend en charge plusieurs fonctions d’agrégation comme :

  • sum : Somme des séries temporelles.
  • avg : Moyenne des valeurs des séries temporelles.
  • max : Valeur maximale parmi les séries temporelles.
  • min : Valeur minimale parmi les séries temporelles.

5. Alertes avec Prometheus et Alertmanager

5.1. Définir des alertes dans Prometheus

Les alertes dans Prometheus sont définies dans le fichier de configuration prometheus.yml sous la section alerting. Une alerte peut être déclenchée lorsque certaines conditions sur les métriques sont remplies.

Exemple d’une règle d’alerte pour l’utilisation du CPU :


groups:
    - name: example
    rules:
        - alert: HighCPUUsage
        expr: avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) < 0.2
        for: 2m
        labels:
            severity: critical
        annotations:
            summary: "CPU usage is above 80% on {{ $labels.instance }}"
                        

Cette alerte est déclenchée si l’utilisation du CPU dépasse 80 % pendant plus de 2 minutes.

5.2. Alertmanager

Alertmanager est un composant complémentaire à Prometheus qui gère les alertes. Il permet de :

  • Agréger plusieurs alertes en une seule notification.
  • Déclencher des notifications par e-mail, Slack, ou d’autres systèmes de communication.
  • Fournir une interface pour gérer la suppression et la résolution des alertes.

6. Visualisation avec Grafana

Grafana est un outil de visualisation open-source qui se connecte facilement à Prometheus pour afficher des graphiques interactifs et des tableaux de bord. Les utilisateurs peuvent créer des tableaux de bord personnalisés pour suivre l’évolution des métriques en temps réel.

6.1. Créer un tableau de bord

  • Installez Grafana et connectez-le à Prometheus comme source de données.
  • Créez un tableau de bord en utilisant les métriques stockées dans Prometheus.
  • Ajoutez des panels pour afficher des graphiques en temps réel, des alertes, et d’autres visualisations.

7. Conclusion

Prometheus est un outil de surveillance robuste, évolutif et flexible, adapté aux environnements modernes, en particulier ceux basés sur des microservices, des conteneurs et des infrastructures cloud. Avec sa capacité à collecter des métriques en temps réel, sa base de données optimisée pour les séries temporelles, et son langage de requête puissant (PromQL), Prometheus est une solution incontournable pour le monitoring d’infrastructures complexes.