HealthCheck
Overzicht
AutoMate.API heeft twee lagen van health endpoints:
Aggregerende endpoints (
/health/basic,/health/hangfire,/health/graph) — gebruikenMicrosoft.Extensions.Diagnostics.HealthChecksen zijn bedoeld voor Azure App Service health probes en de support-afdeling.Per-module endpoints (
/health/{module}) — lichtgewicht minimale endpoints buiten FastEndpoints, bedoeld voor de publieke statuspagina. Elk endpoint sondeert één functionele module afzonderlijk.
Aggregerende healthchecks
We gebruiken het standaard Microsoft.Extensions.Diagnostics.Healthchecks package. Een andere source die van pas kwam is een blog van Rob Bowman met een simpel voorbeeld.
Registreren van een healthcheck is relatief simpel:
Voor EF Core is een apart package beschikbaar: Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore. Dit roept intern CanConnectAsync() aan op de DbContext.
Voor Graph is een eigen implementatie geschreven:
Response
Wat dit endpoint uiteindelijk genereert is een HealthReport response. Let hierbij op dat voor het opvangen van deze response je niet dezelfde class kan gebruiken omdat daarbinnen een HealthCheckEntry struct wordt gebruikt en bij het serialiseren zal deze altijd de "default" geven, en die heeft een status van Unhealthy.
Per-module healthchecks
Ticket #3974 introduceerde een dynamisch GET /health/{module} endpoint zodat de publieke statuspagina elke functionele module afzonderlijk kan pollen — in plaats van alles via /ping.
Architectuur
Het endpoint is een minimaal ASP.NET Core endpoint (geen FastEndpoints, geen TenantGuard pre-processor). Het is anoniem toegankelijk: de statuspagina-poller stuurt geen Authorization - of X-Tenant-Id-header. Bestaande letterlijke routes /health/basic, /health/hangfire en /health/graph hebben voorrang boven het dynamische template.
Elke module implementeert de interface IModuleHealthCheck (Features/Common/Health/Modules/IModuleHealthCheck.cs):
Alle implementaties worden als IEnumerable<IModuleHealthCheck> geïnjecteerd. Het route-template kiest op RouteSegment met case-insensitive vergelijking; een onbekende module geeft 404.
Geregistreerde modules
Registratie vindt plaats in ModuleHealthComposer.AddModuleHealthChecks():
Route | Weergavenaam | Probe | Verbinding |
|---|---|---|---|
| Branding |
|
|
| Identity |
|
|
| Persona |
|
|
| Role Based Access |
|
|
| Microsoft Graph | Graph organization call via | — |
Status mapping
Resultaat | HTTP-statuscode |
|---|---|
|
|
|
|
|
|
Onbekende module |
|
JSON response
De response heeft een vaste shape die de statuspagina-poller verwacht. Het veld status op het hoogste niveau is leidend:
In tegenstelling tot de aggregerende endpoints gebruikt dit endpoint geen HealthReport-serialisatie; de response is een plain anonymous object zodat er geen serialisatieprobleem met HealthCheckEntry kan optreden.
Een nieuwe module toevoegen
Maak een klasse die
IModuleHealthCheckimplementeert inFeatures/Common/Health/Modules/.Registreer de klasse in
ModuleHealthComposer.AddModuleHealthChecks():
De route /health/{jouw-route-segment} verschijnt automatisch — er is geen extra route-registratie nodig.
SQL-gebaseerde modules kunnen ISqlHealthProbe injecteren en SqlHealthProbe.ExecuteAsync(connectionStringName, sql, cancellationToken) aanroepen. De SqlHealthProbe begrenst de volledige probe (verbinding openen + query) op 5 seconden via een linked CancellationTokenSource; een onbereikbare server kan de statuspagina dus niet langer dan 5 seconden laten wachten.
Koppeling Azure
De App Service health probe wordt via Bicep geconfigureerd met de healthCheckPath-parameter van Infrastructure/Src/Modules/Portal/WebApp.bicep (toegepast op zowel het production- als het staging-slot). Het pad verschilt per app — de API exposeert geen kale /health:
App |
| Slot-swap warm-up gate ( |
|---|---|---|
Web API |
|
|
Portal |
|
|
De per-module endpoints (/health/{module}) worden niet door Azure geprobed; die zijn er uitsluitend voor de publieke statuspagina.
