Développement

Comment configurer un observability minimal (sentry, prometheus, traces distribuées) pour réduire le MTTR d'une app node.js

Comment configurer un observability minimal (sentry, prometheus, traces distribuées) pour réduire le MTTR d'une app node.js

Lorsque j’ai dû réduire le MTTR (Mean Time To Repair) d’une application Node.js en production, j’ai rapidement compris qu’un observability minimal bien pensé vaut mieux qu’un tableau de bord fourre-tout. L’objectif : détecter, comprendre et réparer plus vite. Dans cet article je partage la configuration pragmatique que j’ai retenue — Sentry pour les erreurs et la performance applicative, Prometheus pour les métriques d’infrastructure et d’application, et des traces distribuées (OpenTelemetry + Jaeger/Tempo) pour suivre le parcours d’une requête. Ce trio couvre les trois piliers de l’observabilité : logs/erreurs, métriques et traces.

Pourquoi ces trois outils et pas un tout-en-un ?

J’aime les solutions intégrées, mais en pratique j’ai trouvé qu’un mix ciblé apporte plus de flexibilité :

  • Sentry : gestion des erreurs, regroupement automatique, alerting sur erreurs critiques et mesures de performance côté application (APM).
  • Prometheus : système de métriques pull, idéal pour suivre la santé (CPU, mémoire), les compteurs d’erreurs, latences agrégées et construire des alertes basées sur des règles.
  • Traces distribuées (OpenTelemetry + Jaeger/Tempo) : comprendre le chemin exact d’une requête entre services, détecter le goulot d’étranglement et corréler avec les erreurs/métriques.
  • Chaque outil fait une chose et la fait bien. Ensemble, ils réduisent significativement le temps nécessaire pour localiser la source d’un incident.

    Étapes pratiques pour une observability minimale

    Voici le plan que j’ai mis en place sur une app Node.js Express, applicable à la plupart des stacks :

  • 1. Instrumenter les erreurs avec Sentry
  • 2. Exposer des métriques Prometheus
  • 3. Instrumenter les traces avec OpenTelemetry
  • 4. Configurer alerting et dashboards essentiels
  • 5. Ajuster sampling et retention
  • 1 — Instrumentation des erreurs : Sentry

    Pour moi, Sentry est le point de départ. Il regroupe les exceptions, donne le stacktrace, capture le contexte (en-têtes, utilisateur) et permet d’alerter via Slack/Email/PagerDuty.

    Dans Node.js j’utilise @sentry/node. La configuration minimale :

    Exemple de bootstrap Sentry :

    Installation : npm install @sentry/node

    Initialisation : Dans index.js — Sentry.init({ dsn: process.env.SENTRY_DSN, tracesSampleRate: 0.2, environment: process.env.NODE_ENV });

    Points d’attention :

  • Mettre un tracesSampleRate raisonnable (0.1–0.5) pour capture APM sans exploser le volume.
  • Ajouter des contextes personnalisés (IDs de requête, tenant, feature flags) via Sentry.setContext() ou Sentry.setUser() pour accélérer le tri des incidents.
  • Utiliser la middleware Sentry pour Express afin de capturer automatiquement les erreurs et traces.
  • 2 — Exposer des métriques Prometheus

    Prometheus excelle pour l’alerting basé sur des seuils et tendances. En Node, j’utilise le package prom-client.

    Installation : npm install prom-client

    Exemples de métriques à exposer :

  • Histogramme des latences HTTP (route-level)
  • Compteurs d’erreurs 5xx / 4xx
  • Gauge de la longueur de la file d’attente, du nombre de connexions actives
  • Métriques système via node_exporter ou cAdvisor (si docker)
  • Endpoint /metrics à exposer et à protéger (auth ou IP whitelist). Prometheus fera le pull toutes les X secondes.

    3 — Traces distribuées : OpenTelemetry + backend de traces

    Les traces sont ce qui m’a permis le plus souvent de trouver le coupable (un appel externe lent, un middleware bloquant, une requête DB mal indexée). J’utilise OpenTelemetry JS pour instrumenter automatiquement Express, HTTP et les clients DB.

    Principe :

  • Installer le SDK OpenTelemetry, les instruments (instrumentations), et un exporter (Jaeger/Tempo/OTLP vers Grafana Cloud).
  • Exemple succinct de setup :

  • npm install @opentelemetry/sdk-node @opentelemetry/instrumentation-http @opentelemetry/exporter-jaeger
  • Je veille à propager le traceparent (context propagation). Sentry et OpenTelemetry peuvent être corrélés en ajoutant l’ID de trace aux événements Sentry, ce qui permet de passer d’une erreur agrégée à la trace exacte.

    4 — Alerting et dashboards essentiels

    Un tableau de bord n’est utile que s’il contient les KPIs qui signalent un incident rapidement. Voici ce que j’affiche en priorité :

  • Disponibilité / Rate d’erreurs (5xx) sur 5m et 1h
  • Latence p95/p99 des endpoints critiques
  • Alertes Prometheus :
  • AlertRèglePourquoi
    HighErrorRaterate(http_requests_total{status=~"5.."}[5m]) > 0.01Montée soudaine d’erreurs
    HighLatencyhistogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, route)) > 2sDégradation perçue
    HighMemorynode_memory_Active_bytes / node_memory_MemTotal_bytes > 0.9Risque d’out-of-memory

    Je fais remonter les incidents critiques sur Slack ou PagerDuty et j’ajoute un playbook basique dans la description de l’alerte (check logs, vérifier la trace, rollback possible?).

    5 — Sampling, retention et coût

    Le vrai défi en production, c’est le volume. Quelques recommandations :

  • Définir un sampling pour traces et événements Sentry (0.1–0.5 en phase stable).
  • Prioriser la capture à 100% pour les erreurs 5xx, user-impacting ou endpoints critiques.
  • Mettre en place une retention différenciée : métriques longues (sous-échantillonnage pour 90j), traces courte (7–14j), erreurs Sentry selon gravité.
  • Ces choix équilibrent visibilité et coût. J’ajuste régulièrement après incidents — le but est d’avoir juste assez de données pour diagnostiquer rapidement.

    Bonnes pratiques opérationnelles

    Quelques règles que j’applique systématiquement :

  • Corréler : toujours ajouter request_id / trace_id aux logs, événements Sentry et métriques pour faciliter le pivot entre outils.
  • Automatiser les runbooks : quand une alerte se déclenche, la première notification doit contenir les liens vers le dashboard, la trace pertinente et le ticket de post-mortem.
  • Tests d’intégration observability : simuler erreurs et latences dans un environnement staging pour vérifier que les alertes et la corrélation fonctionnent.
  • Gardez les endpoints d’export protégés et surveillez la latence d’export pour éviter les effets secondaires.
  • En pratique, après avoir déployé ce triptyque (Sentry + Prometheus + Traces), j’ai vu le temps moyen pour localiser la cause d’un incident tomber de plusieurs dizaines de minutes à souvent moins de 10 minutes pour des soucis courants. Ce n’est pas magique : il faut investir dans la mise en place et la maintenance, mais le retour sur temps gagné lors d’incidents est immédiat.

    Vous devriez également consulter les actualités suivante :