Aller au contenu principal

Patterns

Monitoring de la livraison des webhooks (Datadog / Sentry)

Métriques, alertes et diagnostic des échecs webhook

Un webhook qui échoue silencieusement génère une dette comptable : facture envoyée mais ERP non synchronisé, signature complétée mais workflow bloqué. Trois métriques minimales à instrumenter. (1) `webhook.delivery.attempt` : compteur par tenant, événement, statut HTTP. (2) `webhook.delivery.duration` : histogramme p50/p95/p99 du round-trip. (3) `webhook.delivery.failed_final` : compteur des événements en `failed` après 5 retries. Alertes Datadog : taux d'échec > 5% sur 5 min, p95 > 3s sur 10 min, > 10 events failed_final/heure pour un tenant. Sentry capture les payloads d'erreur avec scrubbing PII (numéro client, email). Côté receveur de webhook, instrumenter aussi : Sentry breadcrumb à chaque réception, captureException sur signature HMAC invalide, transaction APM autour du handler. Dashboard Scell.io expose les delivery logs des 30 derniers jours via `GET /api/v1/webhooks/{id}/logs`.

À retenir

  • Métriques : attempt, duration p50/p95/p99, failed_final
  • Alertes Datadog : >5% échecs/5min, p95>3s, >10 failed_final/h/tenant
  • Sentry : capture payloads erreur avec scrubbing PII
  • Receveur : breadcrumb + APM transaction par handler
  • API logs : GET /api/v1/webhooks/{id}/logs (30 jours)

Exemple de code

{
  "datadog_monitors": [
    {
      "name": "Scell webhook failure rate",
      "type": "metric alert",
      "query": "avg(last_5m):sum:webhook.delivery.attempt{status:5xx}.as_count() / sum:webhook.delivery.attempt{*}.as_count() > 0.05",
      "message": "@pagerduty-on-call Webhook failure rate > 5%"
    },
    {
      "name": "Webhook p95 latency",
      "type": "metric alert",
      "query": "avg(last_10m):p95:webhook.delivery.duration{*} > 3000",
      "message": "@slack-ops p95 webhook latency > 3s"
    },
    {
      "name": "Tenant burning final-failed events",
      "type": "metric alert",
      "query": "sum(last_1h):sum:webhook.delivery.failed_final{*} by {tenant_id}.as_count() > 10",
      "message": "@email-support Tenant {{tenant_id.name}} > 10 failed_final/h"
    }
  ]
}

Voir aussi

Vos préférences cookies

Nous utilisons des cookies pour améliorer votre expérience. Les cookies essentiels sont toujours actifs. Politique cookies.