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"
}
]
}