Trois heures du matin. L'alerteur vient de vous réveiller : le taux d'erreur des paiements est passé de 0,2% à 8%. L'équipe se réunit en visio, tout le monde reste bloqué pendant les 45 prochaines minutes, sans aucune piste.
Le problème ? Ce ne sont pas les bugs qui coûtent cher. Ce sont les minuscules écarts entre "quelque chose ne va pas" et "on sait exactement où regarder".
Les meilleures équipes que nous avons vu passer ne résolvaient pas les incidents plus vite parce qu'elles avaient de meilleurs développeurs. Elles les résolvaient plus vite parce qu'elles avaient capturé les bons signaux, dès le départ.
Pourquoi vos logs vous ne disent rien
La plupart des applications ont des logs. Le problème, c'est que la plupart des logs sont inutiles.
À 3h du matin, ce que vous voulez ne sont pas 50 lignes de "DEBUG: entering function X". Ce que vous voulez, ce sont les 3 lignes qui vont vous dire en 30 secondes si le problème vient de votre code, d'une dépendance externe, ou d'une explosion de trafic.
Un log actionnable raconte une histoire : utilisateur X a tenté l'action Y, le système Z a répondu avec le statut W. Un log inutile c'est "exécution terminée" ou "boucle numéro 47".
| Type de signal | Exemple utile | Exemple inutile | Temps économisé |
|---|---|---|---|
| Log transactionnel | "user_id=12345 action=payment amount=99.99 status=timeout" | "Debug: processing" | 5-10 min |
| Erreur structurée | "error=TIMEOUT code=GATEWAY_UNAVAILABLE retry_count=3" | "Error occurred" | 10-15 min |
| Corrélation | "trace_id=abc123 parent_span=payments child_span=stripe_charge" | Logs séparés par module | 15-30 min |
| Métrique système | "cpu=78% memory=2.1GB requests/s=450" | "Everything ok" | 5-20 min |
Le timing n'est pas anecdotique. En 2024, le MTTR (temps moyen de résolution) pour une équipe sans observabilité était de 67 minutes. Pour une équipe avec observabilité structurée, 12 minutes. Voilà. 55 minutes sauvées sur chaque incident.
👉 Avant de rajouter un log, demandez-vous : "À 3h du matin, ce log m'aiderait-il à trancher entre trois hypothèses ?" Si la réponse est non, gardez-le pour le debug local.
Les trois niveaux d'observabilité qui changent tout
Niveau 1 : Les logs structurés. Chaque événement important (requête entrante, appel API, erreur, transaction complétée) devient une ligne JSON avec contexte. Pas de blabla. Juste les faits : utilisateur, action, résultat, durée, identifiant de trace.
Les équipes qui maîtrisent ce niveau passent de "il y a une erreur quelque part" à "l'erreur vient d'un timeout sur la charge des factures" en moins de 5 minutes.
Niveau 2 : Les traces distribuées. Une requête utilisateur traverse plusieurs services (API → base données → worker asynchrone → service d'email). Un ID de trace la suit partout. Vous pouvez voir qu'une action a commencé à 14:23:45.123, qu'elle a attendu 2s sur la base, puis 8s sur l'email, puis s'est crashée. Pas de devinette. Vous voyez.
Les équipes au niveau 2 réduisent leur MTTR de 40-50% supplémentaires. Elles identifient les goulots d'étranglement sans mesurer manuellement pendant des heures.
Niveau 3 : Les métriques métier + alertes intelligentes. Vous ne surveillez plus juste "l'API répond", mais "le taux de conversion", "le temps moyen de traitement d'une commande", "le nombre d'utilisateurs bloqués en ce moment". Les alertes ne sont pas "CPU > 80%" mais "le taux d'erreur payment a augmenté de 5x en 5 minutes".
Le niveau 3, c'est ce qui fait la différence entre une équipe réactive et une équipe prédictive. Vous voyez les problèmes avant vos utilisateurs.
Comment structurer les logs sans en faire une usine à gaz
La tentation c'est d'ajouter 150 champs dans chaque log. Résultat : plus de logs, mais le signal reste noyé.
Voici ce qui marche vraiment. Quatre niveaux :
Obligatoire : timestamp, niveau (ERROR/WARN/INFO), service, message. C'est du brut, mais c'est les fondations.
Fortement recommandé : user_id, request_id (ou trace_id), action, statut, durée en ms. À ce stade, vous pouvez dire "la requête 12345 a échoué après 3 secondes" sans connaître aucun détail de code.
Si ça a échoué : erreur spécifique, stack trace, codes de réponse externes (ex: "stripe returned 402"), contexte métier (ex: plan="premium", account_age_days=45). Le contexte transforme une erreur générique en une piste exploitable.
Optionnel mais utile : version du code, région, expérience utilisateur (ex: "A/B variant=new_checkout"). Cela aide à isoler si le bug affecte tous les utilisateurs ou juste certains.
"La meilleure observabilité n'ajoute que 15-20% de volume de log, mais économise 75% du temps de diagnostic."
Les alertes qui servent vraiment (et comment éviter les fausses alarmes)
Une équipe reçoit en moyenne 150 alertes par semaine. Si 140 sont des fausses alarmes, la 150e passe inaperçue. C'est pour ça que les bonnes équipes ont moins d'alertes, pas plus.
| Alerte | Seuil classique (piège) | Seuil intelligent | Fréquence vraie |
|---|---|---|---|
| "CPU élevé" | CPU > 80% | CPU > 85% PENDANT 5min + requêtes/s en baisse | 1 par mois |
| "Erreur détectée" | error_count > 1 | error_rate > 2% OU error_count > 5 dans la dernière minute | 2-3 par semaine |
| "Latence élevée" | p95 > 1s | p95 > 2s + utilisateurs bloqués > 100 | 1-2 par semaine |
| "DB lente" | query_time > 100ms | query_time > 500ms sur transaction critique | 1-2 par mois |
| "Paiement échoué" | failed_transactions > 0 | failed_payment_rate > 1% OU failure_type=TIMEOUT | 1 par semaine max |
L'astuce : les meilleures alertes ne vous réveillent pas pour un problème unique. Elles vous réveillent pour un pattern : "L'erreur X est montée de 50% en 10 minutes" ou "Les paiements prennent 3x plus de temps que d'habitude".
👉 Si vous recevez une alerte et que votre première action est de l'ignorer, supprimez-la. Elle ne vous aide pas, elle vous distrait.
Incident response en pratique : les 15 minutes qui changent tout
Quand ça pete, le temps est critique. Voici ce qui sépare les équipes qui perdent une heure de celles qui règlent en 15 minutes :
Minute 0-2 (triage) : l'alerte arrive, quelqu'un jette un oeil au dashboard en temps réel. Les trois questions : impact réel ? (combien d'utilisateurs ? quel service ?) est-ce connu ? (avons-nous vu ça avant ?) urgence absolue ou on peut attendre 5 min pour que plus de data arrive ?
À ce stade, vous activez votre incident room si nécessaire. Les équipes efficaces ont un dashboard "health check" qu'elles consultent en < 30 secondes. Si tout est vert, c'est probablement une alerte fantôme. Si c'est rouge, c'est bien un problème.
Minute 2-7 (hypothèses) : équipe rassemblée (pas plus de 3-4 personnes au départ), vous avez 5 minutes pour émettre 2-3 hypothèses basées sur : les derniers déploiements, les logs structurés, les traces distribuées, les changements infra. Chaque hypothèse doit être testable en < 1 minute (ex: "vérifier si le timeout vient de Stripe").
Les équipes sans observabilité ici font du brainstorm. Les équipes avec observabilité voient les données et eliminent les hypothèses une par une.
Minute 7-12 (correction) : une fois qu'on connaît la cause, la question devientfix immédiat (rollback, kill de requête, changement de config) ou correctif plus long ? La plupart du temps, vous pouvez limiter les dégâts en 3-5 minutes (ex: arrêter les workers qui causent la fuite, revert une config, throttle les requêtes problématiques).
Après 12 min (rétro) : une fois l'utilisateur stable, vous avez 12 minutes d'avance. Documentez vite : timeline exacte, logs qui ont aidé, logs qui manquaient, alarmes qui auraient pu l'attaquer plus tôt. La rétro ne dure pas 1 heure, 15 minutes de notes pendant que c'est frais.
"Un incident bien observé dure 15 minutes. Un incident mal observé dure 2 heures et vous apprenez rien."
Le toolkit minimal qui marche
Vous n'avez pas besoin de Datadog + Jaeger + Prometheus + Loki + 47 outils propriétaires.
Voici ce qui suffit pour 90% des équipes :
- Logs structurés : CloudWatch (AWS), Stackdriver (GCP), Loki (open-source) ou même PostgreSQL si vous n'avez pas mieux. JSON + requêtes de base, c'est déjà énorme.
- Traces : Jaeger (open-source) ou AWS X-Ray. Pas cher, pas compliqué à intégrer.
- Métriques : Prometheus (open-source, sur vos machines) ou CloudWatch. Un dashboard avec 8-10 métriques métier suffit.
- Alertes : n'importe quel outil qui parle avec votre système de logging peut faire des alertes. PagerDuty est luxe, mais une simple intégration Slack est déjà efficace.
La clé n'est pas l'outil. C'est la discipline : quatre champs obligatoires par log, une trace par requête utilisateur, trois métriques business tracées en permanence, zéro alerte inutile.
Résultat : le raccourci de 60 minutes
Une équipe que nous avons suivie :
- Avant (aucune observabilité) : 67 minutes de MTTR moyen, 3-4 incidents graves par mois
- Après 2 mois (logs structurés seulement) : 35 minutes
- Après 4 mois (logs + traces) : 18 minutes
- Après 6 mois (logs + traces + alertes intelligentes) : 9 minutes
Pas de "hacks". Juste de l'observabilité pensée d'abord comme un produit interne, pas comme un "nice to have".
Les 60 minutes économisées par incident, c'est 1 heure d'énergie d'équipe par mois (pour 2-3 incidents). Multiplié par 52 semaines. Ça devient 50-100 heures de travail utile par an, simplement parce que vous avez les bons signaux.
👉 Commencez petit : adoptez les logs structurés cette semaine. Les traces le mois prochain. Les alertes intelligentes dans 2-3 mois. Les équipes qui itèrent sur leur observabilité finissent toujours plus fines que celles qui essaient de tout faire d'un coup.
Si vous avez des incidents en production et que vous ne savez pas par où commencer, on peut vous aider à cadrer les bons signaux. C'est souvent 2-3 semaines de travail focalisé pour économiser des mois d'heures brûlées à deviner.
