Groen is niet gezond: een healthcheck die 200 zegt bij Degraded
Op een ochtend kwam er een melding van de externe monitoring: het /health-endpoint van een productieapplicatie wisselde de hele ochtend tussen Healthy en Degraded. Onze eigen monitoring stond op groen.
Waarom wij het niet zagen
De blackbox-probe controleerde alleen of /health een 2xx teruggaf. En dat deed hij, ook bij Degraded. ASP.NET Core healthchecks geven bij Degraded standaard HTTP 200; alleen Unhealthy wordt een 503. De externe monitor keek naar de tekst in het antwoord, wij naar de statuscode.
De oorzaak
De applicatie exporteert per check een metric met de status (2/1/0) en de duur. Daaruit bleek:
- Eén check, naar een externe webservice van een ketenpartner, werd vanaf half zes 's ochtends 44 keer 2–3 minuten Degraded, op alle vier de servers tegelijk.
- Bij Healthy duurde die check ~7 ms, bij Degraded steeds ~300 ms.
Dat ruikt naar een drempel van 300 ms in de code van de check. Het platform was gezond. De afhankelijkheid reageerde af en toe net te traag.
Wat ik veranderde
- Een probe op de inhoud. Een extra blackbox-module die in de body naar
Healthyzoekt, naast de bestaande statuscode-probe. - Een flapping-alert.
ApplicationHealthCheckFlappinggaat af als een check in een uur meer dan zes minuten niet Healthy is op ten minste twee hosts. Eén korte hik geeft geen melding; een patroon wel. - Een dashboard per check, met status én duur, zodat je ziet welke afhankelijkheid tegen de drempel aan zit.
Het SLA-gesprek
Volgens de externe monitor was de applicatie die ochtend 164 minuten "down". Werkelijk was het ongeveer 2 minuten (echte 503's), op 3,76 miljoen requests met 0,02 % fouten. Met de metrics erbij werd het gesprek feitelijk: de definitie van "gezond" ligt bij het ontwikkelteam, en daar is de vraag nu of een trage externe dienst de hele applicatie Degraded moet maken.
Wat dit wel en niet bewijst
Dat die ene check de status bepaalde, was hard aangetoond. Wáár de vertraging naar de externe dienst ontstond (bij de dienst zelf of op het uitgaande pad), niet. Dat heb ik er in het rapport ook expliciet bij gezet. Een RCA die zijn eigen grenzen benoemt, is geloofwaardiger dan een die alles verklaart.