In questa sessione scopriremo come utilizzare al meglio di Health Check, funzionalità che è stata introdotta in ASP.NET ancora dalla versione 2.2, ma che poche applicazioni sfruttano.
Uno strumento davvero utile anche per un primo debug, o per una semplice verifica dello stato delle nostre applicazioni...e non solo per chi utilizza container e orchestratori.
Cosa ci permettono di sapere gli Health Check?
Come possiamo essere notificati se qualcosa non va nel verso giusto?
A queste e ad altre domande daremo risposta nel corso della sessione
Search and Society: Reimagining Information Access for Radical Futures
Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check di ASP.NET Core
1. 1
TOPIC
Come sta la nostra
applicazione?
Un viaggio alla scoperta degli Health Check di
ASP.NET Core
Andrea Dottor
@dottor
www.xedotnet.org | www.dottor.net
3. 3
Errori nelle nostre applicazioni
Possiamo sapere se la
nostra applicazione ha
qualcosa che non funziona?
(e magari saperlo prima che capiti ad
un nostro utente?)
4. 4
Utilizzo dei log
I log sono indispensabili ma non bastano
I log ci raccontano il passato, riportano errori/eccezioni
dopo che sono accaduti
• Informazioni dettagliate dell'errore
• Stack trace
5. 5
Cosa sono gli Health Check?
Introdotti per la prima volta in ASP.NET Core 2.2.0-preview1
Middleware e librerie che permettono di
monitorare lo stato di servizi e dipendenze utilizzati
• Utili per esporre ad un Container Orchestrator (es Kubernetes) lo
stato dell'applicazione eseguita in un container
• Monitoraggio di servizi utilizzati: SQL Server, Azure Storage,
MongoDB, …
• Monitoraggio di informazioni di sistema: memoria, cpu, …
6. 6
Come funzionano gli HealthChecks
Permettono di avere un endpoint dove viene ritornato
lo stato dell'applicazione
(al momento della sua invocazione)
• Healthy 😀
• Degraded 😐
• Unhealthy 🤬
7. 7
Implementare un Health Check
Creare una classe che implementa IHealthCheck
Task<HealthCheckResult> CheckHealthAsync(
HealthCheckContext context,
CancellationToken cancellationToken)
Ritornare:
HealthCheckResult.Healthy("A healthy result.")
HealthCheckResult.Degraded("A degraded result.")
HealthCheckResult.Unhealthy("An unhealthy result.")
Registrare l'HealthCheck nella classe di Startup
.AddCheck<ExampleHealthCheck>("example_health_check")
10. 10
AspNetCore.Diagnostics.HealthChecks
Troviamo molti Health Check già implementati nel
repository GitHub AspNetCore.Diagnostics.HealthChecks
Nota: non sono mantenuti da Microsoft
Sql Server
MySql
Oracle
Sqlite
RavenDB
Postgres
EventStore
RabbitMQ
IbmMQ
Elasticsearch
CosmosDb
Solr
Redis
SendGrid
System: Disk Storage,
Private Memory,
Virtual Memory,
Process, Windows
Service
Azure Service Bus:
EventHub, Queue and
Topics
Azure Storage: Blob,
Queue and Table
Azure Key Vault
Azure DocumentDb
Azure IoT Hub
Amazon DynamoDb
Amazon S3
Google Cloud
Firestore
Network: Ftp, SFtp,
Dns, Tcp port, Smtp,
Imap
MongoDB
Kafka
Identity Server
Uri: single uri and uri
groups
Consul
Hangfire
SignalR
Kubernetes
ArangoDB
Gremlin
11. 11
AspNetCore.HealthChecks.System
Install-Package AspNetCore.HealthChecks.System
Spazio libero in una particolare unità
.AddDiskStorageHealthCheck(s => s.AddDrive("C:", 1024))
Memoria massima allocata
.AddProcessAllocatedMemoryHealthCheck(512)
Processo è in esecuzione
.AddProcessHealthCheck("ProcessName", p => p.Length > 0)
Servizio è in esecuzione
.AddWindowsServiceHealthCheck("someservice",
s => s.Status == ServiceControllerStatus.Running)
12. 12
SQL Server
Install-Package AspNetCore.HealthChecks.SqlServer
Verifica la connessione a un database SQL Server
.AddSqlServer(Configuration["Data:ConnectionStrings:Sql"])
.AddSqlServer(
connectionString: Configuration["Data:ConnectionStrings:Sql"],
healthQuery: "SELECT 1;",
name: "sql",
failureStatus: HealthStatus.Degraded,
tags: new string[] { "db", "sql", "sqlserver" });
13. 13
Servizi e/o url esterni
Install-Package AspNetCore.HealthChecks.Uris
Verifica che l'url specificato non ritorni uno status code di errore
.AddUrlGroup(new Uri("https://localhost:44318/weatherforecast"), "Weather API");
18. 18
HealthCheck UI - personalizzazione stili
La UI di HealthCheck UI può essere personalizzata solo
tramite CSS ed un minimo di settings
• Fa uso di CSS Variables
20. 20
Health Check Publisher
Realizzando una classe che implementi IHealthCheckPublisher
è possibile far si che periodicamente vengano verificati gli
Health Check per poter inviare (in modalità push) i dati in un
servizio esterno
• Delay: default 5 secondi dopo l'avvio dell'app
• Period: default ogni 30 secondi
• Predicate: funzione che permette di fitrare gli health check da
valutare
• Timeout: default 30 secondi
22. 22
Health Check Publisher
Esistono delle implementazioni per i servizi più utilizzati
install-package AspNetcore.HealthChecks.Publisher.ApplicationInsights
install-package AspNetcore.HealthChecks.Publisher.Datadog
install-package AspNetcore.HealthChecks.Publisher.Prometheus
install-package AspNetcore.HealthChecks.Publisher.Seq
23. 23
HealthCheck UI - Webhook
HealthCheck UI permette di invocare servizi esterni tramite
Webhook per notificare eventuali problematiche.
Configurabili tramite appsettings e/o codice
Molti applicativi permettono di ricevere messaggi tramite Webhhok
• Microsoft Teams
• Slack
• SendGrid
• Zapier
• IFTTT
• …
24. 24
Integrazione con Teams
Tramite il connector
Incoming Webhhok è
possibile abilitare la
ricezione di messaggi
(generati da HealthCheck.UI)
I messaggi possono
venir indirizzati in un
preciso Channel
25. 25
HealthCheck.UI configurazione Webhook
{
"Name": "Teams",
"Uri": "https://zzzzzz.webhook.office.com/zzz/zzz....",
"Payload": "{rn "@context":
"http://schema.org/extensions",rn "@type":
"MessageCard",rn "themeColor": "0072C6",rn
"title": "[[LIVENESS]] has failed!",rn "text":
"[[FAILURE]] Click **Learn More** to go to Status
Monitoring Portal",rn "potentialAction": [rn
{rn "@type": "OpenUri",rn "name":
"Lear More",rn "targets": [rn { "os":
"default", "uri": "http://status.dottor.net" }rn
]rn }rn ]rn}",
"RestoredPayload": "{"text":"The HealthCheck
[[LIVENESS]] is recovered. All is up and running"}"
}
26. 26
Teams Webhook payload
{
"@context": "http://schema.org/extensions",
"@type": "MessageCard",
"themeColor": "0072C6",
"title": "[[LIVENESS]] has failed!",
"text": "[[FAILURE]] Click **Learn More** to go to Status Monitoring Portal",
"potentialAction": [
{
"@type": "OpenUri",
"name": "Lear More",
"targets": [{ "os": "default", "uri": "http://status.dottor.net" }]
}]
}
29. 29
Conclusioni
Di facili utilizzo, e con molti HealthCheck già pronti
Integrazione con strumenti esterni tramite Webhook
• Teams, Slack, SendGrid, Zapier, IFTTT, …
HealthCheck.UI fornisce un'applicazione di monitoraggio a
costo zero
Utili anche in ambito DevOps: possono essere utilizzati per
verificare il corretto deploy di un'applicazione