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
@cloudgen_verona
#CodeGen2021
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
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
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
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
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")
Abilitare gli Health Check
9
Entity Framework
Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore
Verifica che la connessione utilizzata nel DbContext specificato
sia corretta
• Esegue una "SELECT 1"
Registrare l'HealthCheck nella classe di Startup
• .AddDbContextCheck<PodcastDbContext>();
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
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
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
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");
14
AspNetCore.HealthChecks.Hangfire
Install-Package AspNetCore.HealthChecks.Hangfire
Permette di monitorare i Job di Hangfire
.AddHangfire(
setup =>
{
setup.MaximumJobsFailed = 5;
},
name: "Hangfire")
Configurare gli Health Check
16
Install-Package AspNetCore.HealthChecks.UI
HealthCheck UI
17
HealthCheck UI
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
HealthCheck UI
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
21
Health Check Publisher
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
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
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
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
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" }]
}]
}
27
Integrazione con Teams
Notifica in Teams quando un Health Check fallisce e quando
lo stato viene ripristinato
HealthCheckService + RazorPages
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
Thank you
Any questions?
andreadottor @dottor andreadottor
Andrea Dottor
@dottor
https://github.com/andreadottor
https://www.linkedin.com/in/andreadottor/
ANDREA DOTTOR
www.xedotnet.org | www.dottor.net

Come sta la nostra applicazione? Un viaggio alla scoperta degli Health Check di ASP.NET Core

  • 1.
    1 TOPIC Come sta lanostra applicazione? Un viaggio alla scoperta degli Health Check di ASP.NET Core Andrea Dottor @dottor www.xedotnet.org | www.dottor.net
  • 2.
  • 3.
    3 Errori nelle nostreapplicazioni 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 Ilog 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 gliHealth 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 gliHealthChecks Permettono di avere un endpoint dove viene ritornato lo stato dell'applicazione (al momento della sua invocazione) • Healthy 😀 • Degraded 😐 • Unhealthy 🤬
  • 7.
    7 Implementare un HealthCheck 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")
  • 8.
  • 9.
    9 Entity Framework Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore Verifica chela connessione utilizzata nel DbContext specificato sia corretta • Esegue una "SELECT 1" Registrare l'HealthCheck nella classe di Startup • .AddDbContextCheck<PodcastDbContext>();
  • 10.
    10 AspNetCore.Diagnostics.HealthChecks Troviamo molti HealthCheck 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 liberoin 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 Verificala 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 urlesterni 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");
  • 14.
    14 AspNetCore.HealthChecks.Hangfire Install-Package AspNetCore.HealthChecks.Hangfire Permette dimonitorare i Job di Hangfire .AddHangfire( setup => { setup.MaximumJobsFailed = 5; }, name: "Hangfire")
  • 15.
  • 16.
  • 17.
  • 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
  • 19.
  • 20.
    20 Health Check Publisher Realizzandouna 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
  • 21.
  • 22.
    22 Health Check Publisher Esistonodelle 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 Tramiteil 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" }] }] }
  • 27.
    27 Integrazione con Teams Notificain Teams quando un Health Check fallisce e quando lo stato viene ripristinato
  • 28.
  • 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
  • 30.
  • 31.