Read in English · Leer en español · Auf Deutsch lesen
Section 9.6 sur 9.8 · Intermédiaire · 26 min de lecture
Observabilité : journaux, métriques et traces
Leçon vidéo
5 min · narré en anglais, avec sous-titresÉcouter seulement (audio)
Lire la transcription
Bienvenue dans la section neuf point six. Quand un système se comporte mal en production, vous devez trouver pourquoi, et vite. Cette leçon porte sur la construction de systèmes qui vous permettent de le faire.
Le tableau de bord d’une voiture affiche quelques cadrans et voyants : vitesse, carburant, température du moteur. C’est la supervision. Elle vous informe des problèmes que quelqu’un a prévus. Mais quand la voiture fait un bruit étrange qu’aucun voyant n’explique, le tableau de bord ne peut rien pour vous. Un mécanicien branche un ordinateur de diagnostic et lit des enregistrements détaillés de ce que faisait chaque pièce, pour trouver une panne que personne n’avait anticipée. L’observabilité consiste à construire le logiciel de façon que ce type d’investigation soit toujours possible : chaque partie tient des enregistrements clairs, et un même parcours peut être suivi d’une partie à l’autre.
La supervision répond à des questions que vous saviez devoir poser à l’avance : le disque est-il plein à quatre-vingt-dix pour cent ? L’observabilité est une propriété du système : pouvez-vous expliquer un comportement que personne n’avait prévu ? Une commande peut être lente parce qu’une nouvelle fonctionnalité de la carte rend une requête lente, mais seulement pour les restaurants qui ont plus de cinq cents articles. Personne n’a créé de tableau de bord pour cela. L’observabilité vous permet de découper la télémétrie selon n’importe quel attribut jusqu’à ce que le motif apparaisse. Elle doit donc être intégrée dès la conception, grâce à une instrumentation cohérente et à des identifiants partagés. On ne peut pas l’ajouter après coup pendant un incident.
Les métriques sont des nombres agrégés dans le temps, comme les requêtes par seconde. Elles sont peu coûteuses et idéales pour les tableaux de bord et les alertes, mais elles ne peuvent rien vous dire sur une requête en particulier. Les journaux enregistrent des événements individuels. Écrivez-les sous forme de champs structurés, avec des noms convenus, plutôt qu’en texte libre. Et ne journalisez jamais de secrets ni de données personnelles inutiles. Les traces montrent le chemin d’une requête à travers de nombreux services, et où son temps est passé. Et les profils montrent où le code lui-même consomme du temps processeur ou de la mémoire.
Une erreur courante avec les métriques consiste à faire la moyenne de percentiles. Le service de la carte tourne sur deux instances. L’instance A est saine, avec un quatre-vingt-dix-neuvième percentile de cent quatre-vingts millisecondes. L’instance B a un voisin bruyant. Trois mille de ses dix mille requêtes sont lentes, et son quatre-vingt-dix-neuvième percentile est de mille quatre-vingts millisecondes. Faites la moyenne des deux, et le tableau de bord affiche six cent trente millisecondes. Mais les deux cents requêtes les plus lentes sur les vingt mille sont toutes sur l’instance B. Le vrai chiffre est de mille soixante millisecondes. Le tableau de bord sous-estime la queue de quatre cent trente millisecondes. Les percentiles ne se moyennent pas. Additionnez plutôt les compartiments des histogrammes entre serveurs, et lisez le percentile sur le résultat fusionné.
Deux courtes listes de contrôle couvrent l’essentiel de ce qu’il faut mesurer. Pour tout ce qui sert des requêtes, mesurez le débit, les erreurs et la durée. C’est la méthode RED, de Tom Wilkie. Pour chaque ressource, comme un processeur, un disque ou un pool de connexions, mesurez le taux d’utilisation, la saturation et les erreurs. C’est la méthode USE, de Brendan Gregg. Les quatre signaux d’or de Google, latence, trafic, erreurs et saturation, sont en pratique RED plus la saturation. En pratique, RED décrit ce que vivent les utilisateurs, et USE explique pourquoi. Une hausse de la latence des paiements peut s’expliquer par un pool de connexions plein, avec quarante requêtes en attente.
Entre services, il n’y a pas de pile d’appels unique : le traçage distribué en reconstruit donc une. Chaque requête reçoit un identifiant de trace à la périphérie, et chaque unité de travail devient un span. Cette trace montre une requête Commander, qui a pris neuf cent quarante millisecondes. La tarification n’a pris que soixante-quinze millisecondes. Le service de paiement en a pris sept cent soixante, et à l’intérieur, le prestataire de cartes externe en a pris sept cent vingt. C’est là que le temps est passé : pas dans les propres services de la plateforme. Le traçage suppose que chaque service transmette le contexte de trace, au moyen de l’en-tête standard traceparent. Un seul service qui le perd casse toutes les traces qui passent par lui. OpenTelemetry est désormais le standard neutre vis-à-vis des fournisseurs pour produire traces, métriques et journaux.
La télémétrie peut coûter plus cher que le système qu’elle observe. Chaque combinaison distincte d’étiquettes de métrique est une série temporelle distincte. Un seul histogramme de durée des requêtes sur le service de commandes produit déjà cent vingt-six mille séries. Ajoutez une étiquette pour chacun des quarante mille restaurants, et cela devient environ cinq milliards. Les questions par restaurant ont leur place dans les traces et les journaux. Enfin, alertez l’astreinte sur les symptômes que ressentent les utilisateurs, comme une consommation rapide d’un SLO, et non sur des causes comme un CPU élevé. Chaque alerte d’astreinte doit être urgente, actionnable et réelle.
La section complète présente le Collector d’OpenTelemetry, l’échantillonnage des traces et les tableaux de bord qui répondent à des questions. Ensuite, dans la section neuf point sept, nous verrons la planification de la capacité et les tests de performances. À très vite.
Ce qu’il faut savoir
- La supervision vérifie des conditions prédéfinies ; l’observabilité est la capacité d’expliquer un comportement nouveau et imprévu à partir de la télémétrie existante, et elle doit être intégrée dès la conception grâce à une instrumentation cohérente et à des identifiants partagés.
- Les métriques sont des agrégats peu coûteux pour les tendances et les alertes, les journaux structurés enregistrent des événements individuels, les traces montrent le chemin d’une requête à travers les services, et les profils montrent où le code consomme des ressources.
- Les compteurs, les jauges et les histogrammes sont les types de métriques de base ; les percentiles ne peuvent pas être moyennés entre serveurs ni dans le temps, mais les compartiments (buckets) des histogrammes peuvent être additionnés, et le percentile lu sur le résultat fusionné.
- RED (rate, errors, duration : débit, erreurs, durée) décrit les services, USE (utilisation, saturation, errors : taux d’utilisation, saturation, erreurs) décrit les ressources, et les quatre signaux d’or sont la latence, le trafic, les erreurs et la saturation.
- Le traçage distribué (Dapper, 2010) relie les spans grâce à la propagation du contexte, normalisée par l’en-tête W3C traceparent ; OpenTelemetry, projet de la CNCF parvenu au stade « graduated » en 2026, est le standard neutre vis-à-vis des fournisseurs pour produire traces, métriques et journaux.
- Des valeurs d’étiquettes non bornées font exploser la cardinalité des métriques et leur coût : le détail par utilisateur ou par commande a donc sa place dans les traces et les journaux, et l’échantillonnage en queue (tail-based sampling) conserve les traces qui comptent.
- Alertez l’astreinte sur les symptômes que ressentent les utilisateurs, comme les taux de consommation des SLO, et non sur des causes comme le CPU, et concevez chaque tableau de bord pour répondre à une seule question pour un seul public.
Supervision et observabilité
La supervision (monitoring) consiste à collecter des mesures et des vérifications prédéfinies et à déclencher une alarme quand elles franchissent un seuil : disque plein à 90 %, taux d’erreur supérieur à 1 %, contrôle de santé en échec. Elle répond à des questions que vous saviez devoir poser à l’avance. L’observabilité est une propriété du système : la mesure dans laquelle vous pouvez comprendre son état interne, y compris des états que personne n’avait prévus, à partir de la télémétrie qu’il émet déjà, sans déployer de nouveau code pour le découvrir. Le mot vient de la théorie de la commande, où Rudolf Kálmán l’a défini en 1960 comme la capacité de déduire l’état interne d’un système à partir de ses sorties.
La distinction compte, car les systèmes distribués tombent surtout en panne de façons nouvelles. Une commande de livraison de repas peut être lente parce que l’app tablette d’un restaurant multiplie les nouvelles tentatives de façon agressive, parce que l’endpoint d’un prestataire de paiement est dégradé dans une région, ou parce qu’une nouvelle fonctionnalité de la carte rend une requête de base de données lente, uniquement pour les restaurants qui ont plus de 500 articles. Personne n’a créé de tableau de bord pour aucun de ces cas. La supervision vous dit que le paiement est lent ; l’observabilité vous permet de demander pour qui, où et pourquoi, en découpant la télémétrie selon n’importe quel attribut jusqu’à ce que le motif apparaisse.
Les praticiens ne s’accordent pas sur la portée de cette distinction. Une vision, répandue chez les éditeurs d’outils, présente l’observabilité comme un parapluie couvrant trois piliers : journaux, métriques et traces. Charity Majors, Liz Fong-Jones et George Miranda (Observability Engineering, O’Reilly, 2022) soutiennent que ce cadrage en piliers passe à côté de l’essentiel, et que l’observabilité exige des événements riches, structurés et à forte cardinalité, que l’on peut interroger selon des combinaisons arbitraires. Les deux camps s’accordent sur la conséquence architecturale : l’observabilité est un attribut de qualité qui doit être intégré dès la conception, grâce à une instrumentation cohérente, à des identifiants partagés et à la propagation du contexte, car on ne peut pas l’ajouter après coup pendant un incident.
Les types de télémétrie
| Signal | Ce que c’est | Idéal pour | Principal coût ou limite |
|---|---|---|---|
| Métriques | Séries temporelles numériques, agrégées par intervalle et étiquetées selon quelques dimensions | Tendances à long terme peu coûteuses, tableaux de bord, alertes sur les SLI | Pré-agrégées : ne peuvent pas répondre à des questions sur des requêtes individuelles ; les étiquettes doivent être à faible cardinalité |
| Journaux | Enregistrements horodatés d’événements discrets, idéalement structurés | Le détail d’un événement : une erreur, une décision, une entrée d’audit | Le volume et le coût croissent avec le trafic ; le texte libre est difficile à interroger |
| Traces | Arbres de spans chronométrés montrant le chemin d’une requête à travers les services | Trouver où passe le temps et quel saut a échoué dans un appel distribué | Doivent être échantillonnées à grande échelle ; inutiles si un saut perd le contexte |
| Profils | Échantillons montrant où le code consomme du temps CPU ou alloue de la mémoire | Expliquer pourquoi un service est lent ou coûteux au niveau du code | Outillage plus récent ; le profilage continu ajoute un léger surcoût |
| Événements larges (wide events) | Un enregistrement richement doté d’attributs par requête et par service | Découpage ad hoc selon n’importe quel attribut (client, version, région) | Nécessitent un stockage conçu pour les requêtes à forte cardinalité |
Journalisation structurée (structured logging)
Une ligne de journal comme Payment failed for order 81F3 after 3001ms est facile à écrire et difficile à exploiter : chaque recherche nécessite une expression régulière fragile, et chaque développeur formule les choses différemment. La journalisation structurée (structured logging) écrit chaque entrée sous forme de champs clé-valeur, généralement en JSON, avec des noms convenus : horodatage, niveau, service, nom de l’événement, identifiants métier (commande, restaurant, livreur), résultat, durée, ainsi que les identifiants de trace et de span qui relient la ligne à sa trace. Les recherches deviennent précises (tous les événements card_authorisation_failed pour le prestataire cardco au cours de la dernière heure, regroupés par http_status
), et les journaux de différents services peuvent être joints.
Quelques règles gardent les journaux utiles et abordables. Journalisez des événements, pas de la prose ; utilisez un nom d’événement fixe pour chaque type d’événement. Utilisez les niveaux de façon cohérente, et ne journalisez pas au niveau erreur des situations qui ne demandent aucune action. Ne journalisez jamais de secrets, de jetons, de numéros de carte complets ni de données personnelles inutiles ; les pipelines de télémétrie sont copiés, envoyés à des tiers et conservés pendant des mois : ils sont donc une source courante de fuites de données, et les données personnelles présentes dans les journaux relèvent du RGPD comme toute autre copie (section 8.7). La journalisation et la détection de sécurité, un objectif voisin mais différent, avec ses propres besoins de conservation et d’intégrité, sont traitées à la section 8.8.
traceparent: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01
version-trace id (16 bytes)-parent span id (8 bytes)-flags (01 = sampled)
{"ts": "2026-10-22T12:31:07.412Z", "level": "error",
"service": "payment-service", "event": "card_authorisation_failed",
"order_id": "ord_81F3", "provider": "cardco", "http_status": 504,
"duration_ms": 3001, "attempt": 2,
"trace_id": "4bf92f3577b34da6a3ce929d0e0e4736", "span_id": "00f067aa0ba902b7"}Les métriques, et pourquoi les percentiles ne se moyennent pas
La plupart des systèmes de métriques, comme Prometheus (projet « graduated » de la CNCF) et le modèle de métriques d’OpenTelemetry, proposent les mêmes quelques types. Un compteur (counter) ne fait qu’augmenter, comme le nombre total de requêtes servies ; vous le lisez sous forme de taux (requêtes par seconde sur les cinq dernières minutes), ce qui résiste aussi aux redémarrages. Une gauge (jauge) est une valeur courante qui monte et descend : longueur d’une file d’attente, connexions utilisées, mémoire. Un histogramme répartit les observations dans des compartiments, ou buckets (par exemple requêtes de moins de 50 ms, de moins de 100 ms, de moins de 250 ms, etc.), avec en plus un nombre total et une somme, à partir desquels on estime les percentiles. Prometheus a aussi un type summary, qui calcule des quantiles à l’intérieur de chaque processus.
La distinction entre histogrammes et summaries n’est pas un détail. Comme l’a noté la section 2.4, un percentile est une propriété d’une distribution entière, et le percentile d’une distribution combinée ne peut pas être calculé à partir des percentiles de ses parties. Faire la moyenne de valeurs de p99 entre serveurs, ou entre minutes, produit un nombre qui n’est le percentile de rien. Les nombres par compartiment, en revanche, peuvent simplement être additionnés : additionnez chaque compartiment sur tous les serveurs, puis estimez le percentile à partir de l’histogramme fusionné. C’est pourquoi les SLI de latence à l’échelle d’un parc doivent reposer sur des histogrammes (ou sur des nombres de requêtes sous un seuil, comme dans la section 9.5), jamais sur des summaries par instance.
Exemple commenté
Exemple commenté : faire la moyenne de deux p99
Le service de la carte tourne sur deux instances, qui traitent chacune 10 000 requêtes sur un intervalle de cinq minutes. L’instance A est saine : toutes ses requêtes prennent entre 20 et 300 ms, et son p99 est de 180 ms. L’instance B a un voisin bruyant : 7000 requêtes prennent entre 20 et 300 ms, mais 3000 sont réparties uniformément entre 500 et 1100 ms.
| p99 de B (ses 100 plus lentes sur 10 000) | 1100 - 600 × (100 / 3000) = 1080 ms |
|---|---|
| Moyenne des deux p99 | (180 + 1080) / 2 = 630 ms |
| Vrai p99 des 20 000 requêtes | Les 200 plus lentes sont toutes sur B : 1100 - 600 × (200 / 3000) = 1060 ms |
| Erreur due à la moyenne | 630 ms affichées contre 1060 ms vécues : le tableau de bord sous-estime la queue de 430 ms |
| Avec des histogrammes | Additionnez les nombres par compartiment de A et de B, puis lisez le 99e percentile sur les compartiments fusionnés : environ 1060 ms, avec une précision limitée seulement par la largeur des compartiments |
Les percentiles moyennés peuvent être faux dans les deux sens, et l’erreur augmente quand les instances reçoivent des trafics différents.
Il en va de même dans le temps : le p99 sur une heure n’est pas la moyenne de douze p99 sur cinq minutes.
Que mesurer : RED, USE et les signaux d’or
Trois courtes listes de contrôle couvrent l’essentiel de ce qu’un service doit exposer. La méthode RED, proposée par Tom Wilkie en 2015, s’applique à tout ce qui sert des requêtes : Rate (le débit, en requêtes par seconde), Errors (les requêtes en échec par seconde) et Duration (la distribution des temps de réponse). La méthode USE, de Brendan Gregg, s’applique aux ressources : pour chaque CPU, disque, lien réseau, pool de connexions et file d’attente, vérifiez l’Utilisation (son degré d’occupation), la Saturation (la quantité de travail en attente) et les Errors (erreurs). Les quatre signaux d’or (four golden signals) du chapitre du livre SRE de Google consacré à la supervision des systèmes distribués sont la latence, le trafic, les erreurs et la saturation : en pratique, RED plus la saturation.
En pratique, RED décrit ce que vivent les utilisateurs et USE explique pourquoi. Si la durée du service de paiement augmente (RED), USE appliqué à ses ressources peut révéler un pool de connexions utilisé à 100 % avec 40 requêtes en attente (saturation), ce qui désigne à son tour le prestataire de cartes lent qui garde des connexions ouvertes. Mesurez la latence séparément pour les réussites et pour les échecs : une erreur rapide n’est pas une bonne latence, et un délai d’expiration (timeout) est à la fois une erreur et une réponse lente.
Trois listes de contrôle comparées
| Liste de contrôle | S’applique à | Signaux | Question typique à laquelle elle répond |
|---|---|---|---|
| RED (Wilkie) | Services pilotés par les requêtes | Débit, erreurs, durée | Le service de commandes sert-il bien les utilisateurs en ce moment ? |
| USE (Gregg) | Ressources : CPU, mémoire, disques, pools, files d’attente | Taux d’utilisation, saturation, erreurs | Quelle ressource est le goulot d’étranglement ? |
| Quatre signaux d’or (livre SRE) | Systèmes en contact avec les utilisateurs | Latence, trafic, erreurs, saturation | Le système est-il en bonne santé, et à quelle distance est-il de ses limites ? |
Traçage distribué (distributed tracing)
Dans un monolithe, une pile d’appels (stack trace) montre où une requête lente a passé son temps. Entre services, il n’y a pas de pile unique. Le traçage distribué (distributed tracing) en reconstruit une : chaque requête reçoit un identifiant de trace à la périphérie, chaque unité de travail devient un span (avec un nom, une heure de début, une durée, un statut, des attributs et l’identifiant de son span parent), et un backend de traçage assemble les spans en arbre. L’article de Google sur Dapper (Sigelman et ses collègues, 2010) a décrit l’approche à grande échelle : un faible surcoût, une instrumentation dans des bibliothèques partagées plutôt que dans le code applicatif, et un échantillonnage pour que seule une fraction des requêtes soit enregistrée.
Le traçage dépend entièrement de la propagation du contexte : chaque service doit transmettre le contexte de trace au suivant. La spécification W3C Trace Context (recommandation du W3C depuis 2020) la normalise pour HTTP avec un en-tête traceparent qui contient une version, un ID de trace de 16 octets, l’ID de 8 octets du span appelant et des indicateurs, par exemple si la trace est échantillonnée, ainsi qu’un en-tête tracestate facultatif pour les données propres aux fournisseurs. Pour la messagerie, les mêmes valeurs circulent dans les en-têtes des messages, et le span du consommateur fait référence à celui du producteur. Un seul service qui perd l’en-tête (une vieille bibliothèque, un client HTTP écrit à la main, un traitement par lots) casse toutes les traces qui passent par lui : c’est pourquoi la propagation a sa place dans les bibliothèques partagées de la plateforme, et non dans le code de chaque équipe.
Enregistrer chaque span de chaque requête coûte cher à grande échelle, si bien que les traces sont échantillonnées. L’échantillonnage en tête (head-based sampling) décide au début de la requête (en garder 1 sur 100) et coûte peu, mais il écarte la plupart des requêtes lentes ou en échec, rares, qui vous intéressent. L’échantillonnage en queue (tail-based sampling) met les spans en mémoire tampon jusqu’à la fin de la requête, puis conserve toutes les erreurs, toutes les requêtes plus lentes qu’un seuil et une petite fraction du reste ; il demande plus de mémoire dans le collecteur, mais garde les traces intéressantes.
Une trace à travers les services de livraison de repas
OpenTelemetry : un standard unique pour l’instrumentation
Jusque vers 2019, chaque fournisseur de traçage et de supervision avait ses propres agents et bibliothèques, si bien que changer de fournisseur obligeait à réinstrumenter chaque service. OpenTelemetry (OTel) est né en 2019 de la fusion de deux projets open source antérieurs, OpenTracing et OpenCensus, sous l’égide de la Cloud Native Computing Foundation (CNCF), et a atteint le stade de projet « graduated » de la CNCF en mai 2026. Il fournit des API et des SDK pour chaque langage, une instrumentation automatique pour les frameworks et clients courants, le protocole de transport OTLP, le Collector, et des conventions sémantiques qui fixent les noms d’attributs comme http.request.method et http.response.status_code, afin que la télémétrie de différentes équipes et de différents langages concorde. Les traces, les métriques et les journaux sont stables ; les profils ont été ajoutés comme quatrième signal et sont entrés en alpha publique en 2026.
L’intérêt architectural tient à la séparation entre l’instrumentation et le backend. Les services émettent de l’OTLP vers un Collector, qui tourne généralement à côté de chaque nœud ou comme passerelle centrale ; le Collector regroupe les données par lots, les échantillonne, supprime les attributs sensibles, ajoute des métadonnées comme la version déployée, et les exporte vers les stockages qu’utilise l’organisation, quels qu’ils soient. Changer de fournisseur, ou envoyer les mêmes données à deux backends pendant une migration, devient une modification de configuration du Collector au lieu d’une modification de code dans deux cents services. Une équipe plateforme fournit généralement la configuration du SDK, la propagation et le Collector sous forme de chemin balisé (paved road), si bien que les équipes produit n’ont qu’à ajouter des attributs métier.
Le pipeline de télémétrie
from opentelemetry import trace
import structlog
tracer = trace.get_tracer("order-service")
log = structlog.get_logger()
def place_order(order):
with tracer.start_as_current_span("place_order") as span:
span.set_attribute("restaurant.id", order.restaurant_id)
span.set_attribute("order.item_count", len(order.items))
quote = pricing.quote(order) # instrumented HTTP client adds
payment.authorise(order, quote) # the traceparent header itself
log.info("order_placed", order_id=order.id,
total_pence=quote.total_pence)
return order.idCardinalité et coût
La télémétrie peut facilement coûter plus cher que le système qu’elle observe. Pour les métriques, le principal facteur de coût est la cardinalité : chaque combinaison distincte de valeurs d’étiquettes est une série temporelle distincte qu’il faut stocker et indexer. Les étiquettes qui ont peu de valeurs (méthode HTTP, classe de statut, région) ne posent pas de problème. Les étiquettes aux valeurs non bornées (ID d’utilisateur, ID de commande, URL complète contenant des identifiants, texte d’un message d’erreur) multiplient les séries sans limite et peuvent faire tomber un système de métriques.
Exemple commenté
Exemple commenté : compter les séries temporelles
Le service de commandes exporte un histogramme de durée des requêtes avec 12 compartiments. Prometheus stocke chaque compartiment comme une série, plus une somme et un compte, soit 14 séries par combinaison d’étiquettes.
| Paires route et méthode | 60 |
|---|---|
| Classes de statut (1xx à 5xx) | 5 |
| Instances | 30 |
| Séries pour cette seule métrique | 60 × 5 × 30 × 14 = 126,000 |
| Ajout d’une étiquette de région (5 régions) | 126 000 × 5 = 630 000 séries |
| Ajout de restaurant_id (40 000 restaurants) | 126 000 × 40 000 = environ 5 milliards de séries potentielles : ingérable |
Les questions par restaurant ou par client ont leur place dans les traces, les journaux ou les événements larges, où une forte cardinalité est attendue, et non dans les étiquettes des métriques.
Les exemplars, qui associent un ID de trace à titre d’échantillon à un compartiment d’histogramme, relient un pic de latence sur une métrique peu coûteuse à une trace détaillée et coûteuse.
Les autres leviers de coût sont l’échantillonnage des traces (l’échantillonnage en queue conserve les traces utiles), une conservation plus courte pour les données détaillées et plus longue pour les agrégats, la suppression par défaut des journaux de débogage en production, et la refacturation de la télémétrie aux équipes qui la produisent, pour que son coût soit visible. Traitez le volume de télémétrie comme un paramètre de conception doté d’un budget, comme n’importe quelle autre ressource.
Alerter sur les symptômes, pas sur les causes
Selon le livre SRE, les alertes d’astreinte doivent porter sur les symptômes que ressentent les utilisateurs, et non sur les nombreuses causes possibles. Un CPU élevé, un disque plein sur une réplique ou un conteneur redémarré sont des causes : souvent sans conséquence, parfois déjà traitées par l’automatisation, et jamais une liste complète de ce qui peut mal tourner. Un SLO dont le budget fond, des paiements en échec ou un pipeline de positions des livreurs bloqué sont des symptômes : ils comptent quelle qu’en soit la cause. Les alertes fondées sur les symptômes sont moins nombreuses, rarement fausses, et couvrent des défaillances que personne n’avait prévues ; les signaux fondés sur les causes ont leur place sur des tableaux de bord qui aident à diagnostiquer un symptôme une fois l’alerte déclenchée.
Chaque alerte d’astreinte doit être urgente, actionnable et réelle. La lassitude face aux alertes (alert fatigue) est en soi un risque pour la fiabilité : les ingénieurs d’astreinte réveillés par des alertes sans intérêt apprennent à les ignorer et manquent celle qui compte. Une règle pratique consiste à alerter l’astreinte sur les taux de consommation des SLO (section 9.5), à envoyer les consommations plus lentes et les avertissements sur les ressources vers une file de tickets, et à relier chaque alerte d’astreinte à un runbook (procédure d’exploitation) et à un tableau de bord.
Guide de décision
Guide de décision : cette alerte doit-elle mobiliser une personne d’astreinte ?
Appliquez ces questions à chaque règle d’alerte avant de l’autoriser à réveiller quelqu’un, puis à nouveau chaque fois qu’elle se déclenche sans que personne ait besoin d’agir.
- La condition signifie-t-elle que des utilisateurs sont lésés maintenant, ou le seront bientôt (un SLO dont le budget fond vite, un parcours en échec) ?OuiPassez à la question suivante.NonN’alertez pas l’astreinte. Placez la condition sur un tableau de bord pour le diagnostic, ou ouvrez un ticket si quelqu’un doit s’en occuper pendant les heures ouvrées.
- Faut-il qu’un humain agisse, plutôt qu’une réponse automatique comme un redémarrage ou un ajout d’instances (scale-out) ?OuiPassez à la question suivante.NonAutomatisez la réponse et n’alertez que si l’automatisation échoue.
- L’action doit-elle avoir lieu avant le prochain jour ouvré ?OuiAlertez l’astreinte, et reliez l’alerte à un runbook et au tableau de bord pertinent.NonEnvoyez-la dans la file de tickets de l’équipe plutôt que de déclencher l’astreinte.
- Cette alerte a-t-elle déclenché l’astreinte au cours du dernier mois sans que personne ait eu besoin de faire quoi que ce soit ?OuiCorrigez le seuil ou le signal, ou supprimez l’alerte : une alerte d’astreinte sur laquelle personne n’agit apprend aux gens à ignorer les alertes.NonConservez-la, et réexaminez-la lors de la prochaine passation d’astreinte.
Des tableaux de bord qui répondent à des questions
Un mur de cinquante graphiques ne répond vite à aucune question. Les bons tableaux de bord se conçoivent comme n’importe quelle interface utilisateur : pour un public identifié et une question précise. Une vue d’ensemble du service répond à ce service est-il en bonne santé ?
avec ses SLO, le budget d’erreur restant et les métriques RED en haut, et les métriques USE de ses ressources clés en dessous. Un tableau de bord de parcours pour l’ouverture des ventes répond à les fans obtiennent-ils des billets ?
avec les admissions, les blocages de places, les paiements et les échecs par minute, de bout en bout. Les tableaux de bord de diagnostic s’atteignent en descendant dans le détail ; ils ne s’affichent pas en premier.
Gérez les tableaux de bord en tant que code sous contrôle de version, donnez à chacun un propriétaire, affichez les déploiements et les changements de feature flags sous forme d’annotations sur les graphiques (la plupart des incidents suivent un changement), et supprimez les tableaux de bord que personne n’a ouverts depuis des mois. Pendant un incident, la première vue utile est généralement le parcours vu par l’utilisateur, la deuxième la trace d’une requête en échec, et seulement ensuite les métriques des ressources.
Vérifiez votre compréhension
Pourquoi le p99 de tout un parc doit-il être calculé à partir d’histogrammes fusionnés plutôt qu’à partir du p99 de chaque instance ?
Parce qu’un percentile de données combinées n’est pas une fonction des percentiles des parties ; les nombres par compartiment s’additionnent exactement, si bien que l’histogramme fusionné donne une estimation juste (limitée par la largeur des compartiments), alors que des p99 moyennés peuvent être très faux.
Qu’est-ce qui casse si un service d’une chaîne d’appels ne transmet pas l’en-tête traceparent ?
Chaque trace qui passe par lui est coupée en deux : les spans situés après ce saut démarrent une nouvelle trace, si bien que la vue de bout en bout et le lien entre cause et symptôme sont perdus.
Pourquoi order_id est-il une mauvaise étiquette de métrique, mais un bon attribut de span ?
Comme étiquette, il crée une nouvelle série temporelle par commande, ce qui fait exploser la cardinalité et le coût ; comme attribut de span ou de journal, il est stocké une fois par événement, là où une forte cardinalité est attendue et utile pour les requêtes.
Lequel de ces signaux devrait alerter quelqu’un : un CPU à 95 % sur une instance, ou le SLO du paiement qui se consomme à un taux de 20 ?
La consommation du SLO, car c’est un symptôme que ressentent les utilisateurs ; la mesure du CPU est une cause possible, qui a sa place sur un tableau de bord de diagnostic.
Sources et lectures complémentaires
Une question sur cette section ? ArchitectBot, l’assistant d’étude IA du cours, répond d’abord à partir du cours.
Demander : « Nous avons les journaux de vingt services, mais nous ne savons pas dire pourquoi certaines commandes sont lentes. Que devrions-nous ajouter en premier : le traçage, de meilleurs journaux ou davantage de métriques ? »