Consumer-Reported Dependency Health
Posté le 8 décembre 2025 • 5 min de lecture • 932 motsUne étude approfondie de la pratique CRDH, où les usagers deviennent des sondes distribuées pour mesurer la santé réelle des dépendances. Une approche moderne et fiable pour le monitoring, l'observabilité et la détection d'incidents.

Dans les architectures distribuées modernes, la santé d’un système dépend autant — voire davantage — de l’état de ses dépendances que de son état interne. Pourtant, la plupart des stratégies de monitoring reposent encore sur des healthchecks synthétiques ou dédiés : endpoints /health, sondes liveness/readiness, scripts externes, etc.
Ces techniques fonctionnent, mais elles ne capturent pas l’essentiel :
l’expérience réelle des consumers.
Une approche alternative existe, simple, robuste et naturellement distribuée :
Consumer-Reported Dependency Health (CRDH).
Consumer-Reported Dependency Health (CRDH) que ce sont les consumers eux-mêmes qui indiquent si une dépendance fonctionne, en se basant directement sur ce qu’ils observent lors de leurs appels réels.
Le principe :
En pratique, cela crée une matrice distribuée permettant de comprendre instantanément si un problème est :
Un endpoint /health dit souvent “SELECT 1”, “PING Redis”, “GET /status”.
Mais le trafic métier réel est plus complexe (permissions, payloads, batchs…).
Un service peut donc être “healthy” en healthcheck, mais inutilisable en réalité.
Un consumer peut échouer à cause :
Le healthcheck de la dépendance restera pourtant “OK”.
Chaque nouveau service doit :
CRDH élimine ce besoin.
Grâce aux métriques CRDH, une vision globale apparaît :
| Dépendance | Consumer A | Consumer B | Consumer C | Statut Global |
|---|---|---|---|---|
| Redis | FAIL | FAIL | FAIL | ❌ Outage global |
| Payment API | OK | FAIL | OK | ⚠️ Problème local (B) |
| S3 | OK | OK | OK | ✓ Healthy |
C’est un outil extrêmement puissant pour :
crdh_dependency_success_total{
consumer="order-service",
dependency="payment-api",
method="POST",
status="200"
}crdh_dependency_error_total{
consumer="order-service",
dependency="payment-api",
error="timeout",
status="504"
}crdh_dependency_latency_ms_bucket{
consumer="web",
dependency="db",
le="100"
}(toujours calculé par PromQL)
100 * sum(rate(crdh_dependency_success_total[5m]))
/
sum(rate(crdh_dependency_success_total[5m]) + rate(crdh_dependency_error_total[5m]))func CallPaymentAPI(ctx context.Context) error {
start := time.Now()
err := doRealPaymentCall(ctx)
duration := time.Since(start)
labels := prometheus.Labels{
"consumer": "order-service",
"dependency": "payment-api",
}
if err != nil {
CRDHErrors.With(labels).Inc()
} else {
CRDHSuccess.With(labels).Inc()
CRDHLatency.With(labels).Observe(duration.Seconds())
}
return err
}Et c’est tout.
Aucun healthcheck spécifique n’est nécessaire.
| Pratique | Avantages | Limites |
|---|---|---|
| Healthchecks dédiés | Simples à mettre en place | Ne reflètent pas le trafic réel |
| Synthetic checks | Très utiles pour le monitoring externe | Peu de contexte métier |
| Distributed tracing | Excellente granularité | Complexe, nécessite une instrumentation forte |
| CRDH | Réaliste, scalable, simple, auto-maintenu | Basé sur le trafic (nécessite un volume minimal) |
CRDH n’est pas une alternative mais un complément naturel :
il ajoute le contexte métier manquant dans les sondes classiques.
sum(rate(crdh_dependency_error_total{consumer="serviceA", dependency="redis"}[5m])) > 5count by (dependency) (
sum(rate(crdh_dependency_error_total[5m])) by (consumer, dependency) > 5
) > 2histogram_quantile(0.95, sum by (le, consumer, dependency) (rate(crdh_dependency_latency_ms_bucket[5m]))) > 200CRDH est particulièrement efficace si :
| Limite | Solution |
|---|---|
| Faible trafic → peu de métriques | Ajouter un léger trafic synthétique |
| Ne voit pas les dépendances “non utilisées” | Ajouter des “probes faibles” (appels légers) |
| Cardinalité élevée si trop de labels | Standardiser consumer & dependency |
CRDH suppose que les développeurs comprennent très bien le fonctionnement réel de leurs appels vers une dépendance : retries, timeouts, fallbacks, erreurs logiques, et ce qui constitue réellement un succès métier. Si ce n’est pas le cas, les métriques CRDH risquent d’être incorrectes ou trompeuses.
Pour éviter cela, il est recommandé d’utiliser un middleware ou un SDK commun qui standardise l’émission des métriques, et de documenter clairement la définition de “succès” et “échec” pour chaque dépendance.
Parce qu’elle repose sur un principe simple :
La meilleure mesure de la santé d’un système, c’est l’expérience réelle des services qui l’utilisent.
CRDH transforme l’ensemble des consumers en une sonde distribuée, gratuite, réaliste et auto-entretenue.
C’est exactement l’équivalent du user-reported health côté produit —
mais appliqué aux services backend.
CRDH apporte un changement de perspective puissant :
ce ne sont plus les services qui doivent prouver qu’ils sont vivants —
ce sont leurs consumers qui rapportent ce qu’ils observent réellement.
C’est simple.
C’est robuste.
C’est fidèle à la réalité.
Et cela améliore radicalement la manière dont on détecte, diagnostique et corrige les incidents dans des architectures distribuées.