Un bon health check teste ce dont le service a besoin pour servir les utilisateurs : une requête rapide à la base de données, au cache, à la file d’attente. Il répond vite, n’a pas d’effets de bord, ne demande pas de connexion ou seulement une clé sans autres droits, et renvoie un petit corps JSON qui indique quel contrôle a échoué.
Il en existe généralement deux types. Un contrôle de liveness indique que le processus tourne et ne doit pas être redémarré ; il reste simple. Un contrôle de readiness indique que l’instance peut recevoir du trafic maintenant, dépendances comprises, pour qu’un load balancer ou Kubernetes puisse la contourner. La surveillance externe a besoin du type readiness.
Méfiez-vous des dépendances que vous ne maîtrisez pas. Si le health check échoue dès qu’une API tierce est lente, toutes les instances peuvent être retirées du service d’un coup. Signalez-les comme dégradées dans le corps de la réponse, et réservez le code de statut aux pannes qui arrêtent vraiment le service.
Exemple
GET /health
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
{"status":"ok","checks":{"database":"ok","cache":"ok"}}
Un moniteur vérifie le code de statut et que $.status vaut ok. Une 503, un délai dépassé ou toute autre valeur fait échouer la vérification.