Quando siamo in produzione, dobbiamo sempre tenere sotto controllo lo stato di funzionamento della nostra applicazione ASP.NET Core: il server potrebbe non essere disponibile, o magari una delle dipendenze di cui essa necessita per funzionare potrebbe essere giù.
Un monitoring costante dello stato di salute del nostro sistema ci consente di reagire proattivamente a malfunzionamenti, invece che farlo a seguito di mail di protesta dei nostri utenti.
ASP.NET Core 2.2 introduce una funzionalità specifica per questa necessità denominata health check. Per sfruttarla dobbiamo eseguire semplicemente due passaggi nella classe Startup.
Il primo consiste nel configurare i servizi che vogliamo includere nella nostra pipeline. La configurazione minima è quella nel codice in basso:
public void ConfigureServices(IServiceCollection services) { // .. altro codice qui .. services.AddHealthChecks(); }
La configurazione dell'esempio ritornerà un successo se il server è vivo e in grado di rispondere alla richiesta. Tipicamente però, questo non è abbastanza: vogliamo verificare anche che siamo in grado di connetterci al database, alla cache distribuita o a un servizio secondario.
Per queste necessità, può essere utile sfruttare una serie di package - non ufficialmente distribuiti da Microsoft - pubblicati in questo repository GitHub: https://github.com/Xabaril/AspNetCore.Diagnostics.HealthChecks .
Per esempio, se tra le nostre dipendenze abbiamo un database SQL Server, non dobbiamo far altro che aggiungere il package
Install-Package AspNetCore.HealthChecks.SqlServer
e modificare il codice precendente in:
public void ConfigureServices(IServiceCollection services) { // .. altro codice qui .. services.AddHealthChecks() .AddSqlServer(myConnectionString); }
In questo modo, il codice di HealthCheck proverà a connettersi al database e a eseguire una semplice query - eventualmente configurabile.
Una volta configrati i servizi, dobbiamo registrare il middleware per invocarli, tramite il metodo UseHealthCheck al quale dobbiamo passare l'URL su cui vogliamo esporre questa funzionalità. Tutto ciò va ovviamente fatto all'interno del metodo Configure della classe Startup:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { // .. altro codice qui .. app.UseHealthChecks("/healthz"); app.UseMvc(); }
A questo punto, provando a invocare l'URL che abbiamo specificato, otterremo uno Status Code 200 nel caso in cui tutto funzioni per il meglio. Diversamente, lo stato sarà un 503 - Service Unavailable.
Possiamo poi impostare un Availability Check su Application Insights, per esempio, per far in modo che Azure invochi regolarmente questo endpoint e ci invii un alert nel caso di troppi errori consecutivi: https://docs.microsoft.com/en-us/azure/azure-monitor/app/monitor-web-app-availability
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Evitare il flickering dei componenti nel prerender di Blazor 8
Load test di ASP.NET Core con k6
Migrare una service connection a workload identity federation in Azure DevOps
Utilizzare domini personalizzati gestiti automaticamente con Azure Container Apps
Utilizzare i primary constructor di C# per inizializzare le proprietà
Inizializzare i container in Azure Container Apps
Hosting di componenti WebAssembly in un'applicazione Blazor static
Usare un KeyedService di default in ASP.NET Core 8
Criptare la comunicazione con mTLS in Azure Container Apps
Effettuare chiamate con versioning da Blazor ad ASP.NET Core
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Ottenere il contenuto di una cartella FTP con la libreria FluentFTP
I più letti di oggi
- Miglioramenti nelle performance di Angular 16
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- HTML5 con CSS e JavaScript
- Ottimizzazione dei block template in Angular 17
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!