Supervision et observabilité : Prometheus, Alertmanager et Grafana
Quitter

Leçon 1 sur 8 · Fondamentaux

Observabilité : métriques, logs, traces, SLI et SLO

30 min Debian 12

Objectif

Comprendre ce que l'on mesure quand on « supervise » une application, distinguer les trois grands signaux (métriques, journaux, traces) et savoir fixer un objectif de service chiffré, avec son budget d'erreur. C'est la base de toute la formation.

L'essentiel

  • La supervision répond à « est-ce que ça marche ? » ; l'observabilité permet de répondre à « pourquoi ça ne marche pas ? » sans ajouter de code à chaud.
  • Trois signaux se complètent : les métriques (des nombres dans le temps), les journaux (des événements en texte), les traces (le parcours d'une requête à travers plusieurs services).
  • Un SLI (Service Level Indicator) est une mesure de la qualité vue par l'utilisateur : part des requêtes réussies, part des requêtes servies en moins de 300 ms…
  • Un SLO (Service Level Objective) est la cible de ce SLI sur une fenêtre de temps : « 99,9 % des paiements réussis sur 30 jours ».
  • Le budget d'erreur = 100 % − SLO. Tant qu'il en reste, l'équipe peut livrer ; quand il est épuisé, on privilégie la fiabilité.
  • On alerte sur les symptômes que subit l'utilisateur (erreurs, lenteur), pas sur chaque cause possible (CPU à 80 %).

Supervision ou observabilité ?

Prenons une boutique en ligne de Casablanca qui vend des produits d'artisanat. Un vendredi soir, des clients se plaignent : « le paiement tourne dans le vide ».

  • Avec une supervision classique, vous avez un voyant vert ou rouge par serveur : le serveur web répond au ping, la base de données tourne. Tout est vert… et pourtant les clients ne paient pas.
  • Avec de l'observabilité, vous voyez que le taux d'erreurs de l'API /api/paiement est passé de 0,05 % à 4 % à 21 h 12, que les journaux montrent des « timeout » vers la passerelle de paiement, et qu'une trace d'une requête lente montre 9 secondes passées dans l'appel au prestataire bancaire.

L'observabilité ne remplace pas la supervision : elle l'enrichit. Le mot vient de l'automatique : un système est observable si l'on peut déduire son état interne à partir de ce qu'il émet.

Les trois signaux

Signal Forme Exemple Coût Question typique
Métrique nombre + horodatage + étiquettes http_requests_total{route="/api/paiement",status="503"} 17 faible, taille fixe « Combien ? À quelle vitesse ? Depuis quand ? »
Journal (log) ligne de texte ou JSON 2026-10-18T21:12:04 ERROR paiement timeout cmi 9001ms moyen à élevé, croît avec le trafic « Que s'est-il passé exactement ? »
Trace arbre de spans chronométrés requête 7f3a… : web 12 ms → api 40 ms → banque 9 001 ms élevé, souvent échantillonné « Où le temps est-il passé ? »

Le parcours habituel d'un diagnostic : une métrique déclenche l'alerte, un tableau de bord situe le problème dans le temps, les journaux et les traces donnent le détail.

Les métriques

Une métrique est une série temporelle : un nom, des étiquettes (labels) et des valeurs successives. Prometheus, l'outil central de cette formation, distingue quatre types :

# Compteur (counter) : ne fait que monter (ou repart à zéro au redémarrage)
http_requests_total{route="/api/paiement", status="200"}   184532

# Jauge (gauge) : monte et descend
node_memory_MemAvailable_bytes{instance="srv-web-rabat:9100"}   2147483648

# Histogramme (histogram) : des compteurs par tranche de durée (« bucket »)
http_request_duration_seconds_bucket{le="0.3"}   181020
http_request_duration_seconds_bucket{le="+Inf"}  184532

# Résumé (summary) : des quantiles calculés côté application
rpc_duration_seconds{quantile="0.95"}   0.41

Les métriques sont peu coûteuses : qu'il y ait 10 ou 10 000 requêtes par seconde, un compteur occupe la même place. C'est pour cela qu'on les garde longtemps et qu'on alerte dessus.

Attention aux étiquettes : chaque combinaison de valeurs crée une nouvelle série. Une étiquette client_id avec 200 000 clients crée 200 000 séries : c'est l'erreur dite de cardinalité qui fait exploser la mémoire du serveur de métriques.

Les journaux

Les journaux racontent les événements un par un. Ils sont indispensables pour comprendre un cas précis (« pourquoi la commande 88412 a échoué ? »). Bonnes pratiques :

{"ts":"2026-10-18T21:12:04Z","niveau":"error","service":"paiement","commande":88412,"msg":"timeout passerelle","duree_ms":9001}
  • un format structuré (JSON) plutôt que du texte libre : on peut filtrer par champ ;
  • un niveau (debug, info, warn, error) ;
  • jamais de numéro de carte, de mot de passe ni de CIN en clair dans un journal (loi 09-08 sur les données personnelles au Maroc).

Les traces

Une trace suit une requête à travers tous les services. Chaque étape est un span avec un début, une durée et un identifiant de trace partagé. Le standard ouvert actuel est OpenTelemetry (bibliothèques, protocole OTLP), avec des outils comme Jaeger ou Tempo pour stocker et afficher les traces. Prometheus, lui, ne stocke pas de traces : il s'occupe des métriques.

Les méthodes pour choisir quoi mesurer

Deux grilles simples évitent de tout mesurer au hasard :

  • RED pour un service qui reçoit des requêtes : Rate (débit), Errors (erreurs), Duration (durée).
  • USE pour une ressource (CPU, disque, réseau) : Utilization (taux d'occupation), Saturation (file d'attente), Errors.

Les « quatre signaux d'or » popularisés par Google reprennent la même idée : latence, trafic, erreurs, saturation.

Service « paiement » (RED)            Serveur srv-bdd-casa (USE)
  débit   : requêtes/s                 CPU     : % occupé, file d'exécution
  erreurs : % de réponses 5xx          disque  : % plein, temps d'attente E/S
  durée   : 95e centile en ms          réseau  : débit, paquets perdus

SLI, SLO, SLA

Trois sigles qu'on confond souvent :

Sigle Nom Qui le fixe Exemple pour le paiement
SLI indicateur de niveau de service l'équipe technique part des requêtes /api/paiement sans erreur 5xx
SLO objectif de niveau de service l'équipe, avec le métier 99,9 % sur 30 jours glissants
SLA accord de niveau de service le contrat commercial 99,5 %, sinon pénalité de 10 % de l'abonnement

Le SLA est toujours moins exigeant que le SLO : le SLO sert d'alarme interne avant de rompre le contrat.

Un bon SLI se calcule comme un ratio d'événements bons sur événements totaux :

SLI disponibilité = requêtes réussies / requêtes totales
SLI latence       = requêtes servies en moins de 300 ms / requêtes totales

Le budget d'erreur

Si le SLO est de 99,9 % sur 30 jours, vous avez le droit à 0,1 % d'échec :

30 jours × 24 h × 60 min = 43 200 minutes
43 200 × 0,001           = 43,2 minutes d'indisponibilité tolérée par mois

Même calcul en requêtes : sur 2 millions de paiements par mois,
2 000 000 × 0,001 = 2 000 requêtes en échec tolérées.
SLO Indisponibilité tolérée par mois (30 j) par an
99 % 7 h 12 min 3,65 jours
99,5 % 3 h 36 min 1,83 jour
99,9 % 43 min 8 h 46 min
99,99 % 4 min 19 s 52 min

Chaque « 9 » supplémentaire coûte très cher (redondance, astreinte, tests). Une école en ligne de Fès n'a pas besoin du même SLO qu'une banque. Choisissez un objectif que vos utilisateurs remarquent vraiment.

Le budget d'erreur devient un outil de décision : il en reste ? On livre la nouvelle version. Il est épuisé ? On gèle les nouveautés et on corrige la fiabilité.

Écrire ses SLO noir sur blanc

Un SLO qui n'existe que dans la tête d'une personne ne sert à rien. Rangez-les dans le dépôt Git de l'équipe, dans un format simple :

# slo/paiement.yml
service: paiement
sli: requêtes /api/paiement sans réponse 5xx / requêtes totales
objectif: 99.9          # en pourcentage
fenetre: 30d            # 30 jours glissants
responsable: equipe-paiement
revue: trimestrielle    # on rediscute l'objectif tous les trois mois

Calculer un SLI à la main

Avant d'avoir Prometheus, un simple journal d'accès suffit pour mesurer. Avec un journal au format combiné de nginx, le code de statut est le 9e champ :

# Nombre total de requêtes
wc -l < /var/log/nginx/access.log

# Nombre de réponses 5xx (erreurs côté serveur)
awk '$9 ~ /^5/ {n++} END {print n+0}' /var/log/nginx/access.log

# Disponibilité en pourcentage
awk '{t++} $9 !~ /^5/ {ok++} END {printf "%.2f %%\n", ok*100/t}' /var/log/nginx/access.log

Pourquoi seulement les 5xx ? Une erreur 404 ou 401 est en général la faute du client (mauvaise adresse, mauvais mot de passe) : elle ne doit pas consommer le budget d'erreur du service. À l'inverse, une 503 signifie que vous n'avez pas pu répondre.

Dans les leçons suivantes, Prometheus fera ce calcul en continu :

sum(rate(http_requests_total{status!~"5.."}[30d])) / sum(rate(http_requests_total[30d]))

Où se place chaque outil

  Applications et serveurs
  │  métriques (/metrics)      journaux               traces (OTLP)
  ▼                            ▼                      ▼
  Prometheus  ──règles──▶ Alertmanager ──▶ e-mail, chat, astreinte
  │                            Loki / Elasticsearch   Jaeger / Tempo
  └──────────────┬─────────────┴──────────────────────┘
                 ▼
              Grafana (tableaux de bord, exploration)
Besoin Outils courants
Métriques Prometheus, VictoriaMetrics, InfluxDB, Zabbix (approche plus classique)
Alertes Alertmanager, Grafana Alerting
Journaux Loki, ELK (Elasticsearch, Logstash, Kibana), OpenSearch
Traces OpenTelemetry + Jaeger ou Tempo
Tableaux de bord Grafana, Perses

Prometheus convient très bien aux séries purement numériques et reste utilisable pendant une panne, car chaque serveur est autonome. Il ne convient pas quand il faut une exactitude à 100 %, par exemple pour facturer chaque requête : utilisez alors une base de données ou les journaux.

Pièges fréquents

  • Alerter sur tout : 200 alertes par jour, personne ne les lit. Alertez sur les symptômes (erreurs, lenteur ressenties par l'utilisateur) et gardez les causes (CPU, mémoire) pour les tableaux de bord.
  • Un SLO à 100 % : impossible à tenir, il interdit toute mise à jour. Même les grands fournisseurs de cloud visent moins.
  • Compter les 4xx comme des pannes : une vague de mauvais mots de passe ferait croire à une panne du service.
  • Des étiquettes à forte cardinalité (identifiant de client, adresse IP, numéro de commande) dans les métriques : mettez-les dans les journaux, pas dans les étiquettes.

Lab

Vous êtes l'ingénieur d'exploitation d'une boutique en ligne. Le journal /root/obs/acces.log contient 1 000 appels à l'API de paiement. Vous allez :

  1. décrire l'objectif du service dans un petit fichier YAML ;
  2. calculer le budget d'erreur correspondant, en minutes ;
  3. compter les réponses 5xx du journal avec awk ;
  4. décider si l'objectif est respecté sur cet échantillon.

Quiz

  1. Citez les trois signaux de l'observabilité et une question à laquelle chacun répond.
  2. Quelle est la différence entre un SLO et un SLA ? Lequel est le plus exigeant ?
  3. Un service a un SLO de 99,5 % sur 30 jours. Combien de minutes d'indisponibilité sont tolérées ?
  4. Pourquoi ne faut-il pas mettre l'identifiant du client dans une étiquette de métrique ?
  5. Faut-il déclencher une alerte quand le CPU d'un serveur dépasse 80 % ? Justifiez.
Réponses
  1. Métriques : « combien, à quelle vitesse ? » ; journaux : « que s'est-il passé exactement ? » ; traces : « où le temps de cette requête a-t-il été passé ? ».
  2. Le SLO est un objectif interne fixé par l'équipe ; le SLA est un engagement contractuel avec pénalités. Le SLO est plus exigeant, pour être averti avant de rompre le SLA.
  3. 43 200 × 0,005 = 216 minutes, soit 3 h 36 min.
  4. Chaque valeur d'étiquette crée une série temporelle : des centaines de milliers de clients feraient exploser la mémoire et le stockage (cardinalité). Cette information va dans les journaux.
  5. En général non : un CPU élevé n'est pas forcément ressenti par l'utilisateur. On alerte sur les symptômes (erreurs, latence) et on consulte le CPU sur un tableau de bord pendant le diagnostic. Une exception : la saturation durable qui annonce une panne imminente.

Sources de référence : documentation Prometheus (Apache 2.0). Texte original MasterLinux.

Exercices pratiques

À réaliser sur Debian 12

Le terminal en ligne ouvre bientôt. En attendant, réalisez ces tâches sur votre machine Linux, une machine virtuelle ou WSL.

  1. Écrivez /root/obs/slo.yml qui décrit l'objectif du service de paiement : une ligne service: paiement, une ligne objectif: 99.9 (en pourcentage) et une ligne fenetre: 30d
    Afficher un indiceTrois lignes clé: valeur, sans indentation.
    Voir la solution
    printf "service: paiement\nobjectif: 99.9\nfenetre: 30d\n" > /root/obs/slo.yml

    Vérification : f=/root/obs/slo.yml; grep -Eq "^service: *\"?paiement\"? *$" $f && grep -Eq "^objectif: *\"?99[.,]9%?\"? *$" $f && grep -Eq "^fenetre: *\"?30d\"? *$" $f

  2. Calculez le budget d'erreur de cet objectif en minutes sur 30 jours et écrivez seulement le nombre (par exemple 43.2) dans /root/obs/budget.txt
    Afficher un indice30 jours = 43 200 minutes ; le budget est de 0,1 % de ce total.
    Voir la solution
    echo 43.2 > /root/obs/budget.txt

    Vérification : grep -Eqx " *43([.,]2)? *" /root/obs/budget.txt

  3. Le journal /root/obs/acces.log contient 1 000 requêtes. Comptez celles dont le code de statut HTTP (9e champ) commence par 5 et écrivez seulement ce nombre dans /root/obs/erreurs5xx.txt
    Afficher un indiceawk '$9 ~ /^5/' sélectionne les lignes ; wc -l ou un compteur dans awk les compte.
    Voir la solution
    awk "\$9 ~ /^5/ {n++} END {print n+0}" /root/obs/acces.log > /root/obs/erreurs5xx.txt

    Vérification : test "$(tr -d " \n" < /root/obs/erreurs5xx.txt)" = "$(awk "\$9 ~ /^5/ {n++} END {print n+0}" /root/obs/acces.log)"

  4. Sur cet échantillon, le SLO de 99,9 % de requêtes réussies est-il respecté ? Écrivez oui ou non dans /root/obs/verdict.txt
    Afficher un indiceDisponibilité = requêtes sans 5xx / total. Comparez à 99,9 %.
    Voir la solution
    echo non > /root/obs/verdict.txt

    Vérification : grep -Eqix " *non *" /root/obs/verdict.txt

Références officielles consultées : Prometheus — Overview — https://prometheus.io/docs/introduction/overview/ ; Prometheus — Metric types — https://prometheus.io/docs/concepts/metric_types/ ; Prometheus — Alerting (bonnes pratiques) — https://prometheus.io/docs/practices/alerting/ ; Prometheus — Comparison to alternatives — https://prometheus.io/docs/introduction/comparison/. Texte original MasterLinux.