Hälsokontroller för .NET-appar i C#
I ett distribuerat system är hälsokontroller regelbundna utvärderingar av status, tillgänglighet och prestanda för enskilda noder eller tjänster. Dessa kontroller säkerställer att systemet fungerar korrekt och effektivt. Hälsokontroller är viktiga för systemets tillförlitlighet, och de utförs vanligtvis med jämna mellanrum med de resultat som analyseras för beslutsfattande och korrigerande åtgärder.
Följande hälsokontrollstatusresultat är möjliga:
Dessutom rapporterar hälsokontroller ofta olika diagnostikmått. Mer information finns i Diagnostikmått: Microsoft.Extensions.Diagnostics.HealthChecks
.
Hälsokontroller för resursanvändning
Om du vill utföra hälsokontroller av resursanvändningen för dina .NET-appar lägger du till en paketreferens till Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. På en IServiceCollection instans kedjar du ett anrop från AddHealthChecks till AddResourceUtilizationHealthCheck. I följande exempel visas hur du använder AddResourceUtilizationHealthCheck
tilläggsmetoden för att lägga till en hälsokontroll för resursanvändning i en IServiceCollection
instans:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHealthChecks()
.AddResourceUtilizationHealthCheck();
var app = builder.Build();
var healthCheckService = app.Services.GetRequiredService<HealthCheckService>();
var result = await healthCheckService.CheckHealthAsync();
Console.WriteLine($"{result.Status} {result.TotalDuration}");
app.Run();
Koden ovan:
- Skapar en ny HostApplicationBuilder instans.
- Lägger till en hälsokontroll för resursanvändning genom att länka ett anrop från anropet AddHealthChecks till AddResourceUtilizationHealthCheck tilläggsmetoden.
- Skapar instansen IHost som variabel.
app
- Hämtar en instans av HealthCheckService klassen från tjänstleverantören.
- Utför en hälsokontroll och visar resultatet.
- Kör programmet.
Hälsokontroller för programlivslängd
Om du vill utföra hälsokontroller av programmets livslängdshändelser IHostApplicationLifetimeanvänder du tilläggsmetoden AddApplicationLifecycleHealthCheck som är tillgänglig i Microsoft.Extensions.Diagnostics.HealthChecks.Common NuGet-paketet.
Den här providern anger att programmet bara är felfritt när det är helt aktivt. Tills livslängdsobjektet anger att programmet har startat rapporterar providern att programmet inte är felfritt. När programmet börjar stängas av rapporterar providern programmet som felfritt.
Biblioteket gör det HealthCheckService möjligt för konsumenter att när som helst begära en hälsokontroll. Överväg följande ExampleService
implementering:
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
internal class ExampleLifecycle(
HealthCheckService healthCheckService,
ILogger<ExampleLifecycle> logger) : IHostedLifecycleService
{
Task IHostedService.StartAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StartingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedService.StopAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppedAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
Task IHostedLifecycleService.StoppingAsync(
CancellationToken cancellationToken) =>
CheckHealthAsync(cancellationToken: cancellationToken);
public Task ReadyAsync() => CheckHealthAsync();
private async Task CheckHealthAsync(
[CallerMemberName] string eventName = "",
CancellationToken cancellationToken = default)
{
HealthReport result =
await healthCheckService.CheckHealthAsync(cancellationToken);
logger.LogInformation(
"{EventName}: {Status}", eventName, result.Status);
}
}
Koden ovan:
- Definierar en ny
ExampleLifecycle
klass som implementerar IHostedService gränssnittet. - Definierar en primär konstruktor som accepterar följande parametrar:
- En instans av HealthCheckService klassen.
- En instans av ILogger<TCategoryName> klassen.
- Implementerar IHostedLifecycleService gränssnittet med varje metod som anropar
CheckHealthAsync
metoden. - Definierar en
ReadyAsync
metod som anroparCheckHealthAsync
metoden. - Definierar en anpassad
CheckHealthAsync
metod som fångar upp uppringarens namn och annulleringstoken och begär sedan en hälsokontroll från instansenHealthCheckService
.result
Loggas sedan.
Den enda gången som hälsokontrolltjänsten rapporterar statusen HealthStatus.Healthy är när appen har startats och innan den stoppas anropas. Tänk på följande Program.cs:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Hosting;
var builder = Host.CreateApplicationBuilder(args);
var healthChecksBuilder = builder.Services
.AddHostedService<ExampleLifecycle>()
.AddHealthChecks()
.AddApplicationLifecycleHealthCheck();
// You could use the healthChecksBuilder instance to add more checks...
var app = builder.Build();
var services = app.Services.GetRequiredService<IEnumerable<IHostedService>>();
await Task.WhenAll(DelayAndReportAsync(services), app.RunAsync());
static async Task DelayAndReportAsync(IEnumerable<IHostedService> services)
{
// Ensure app started...
await Task.Delay(500);
var service = services.FirstOrDefault(static s => s is ExampleLifecycle);
if (service is ExampleLifecycle example)
{
await example.ReadyAsync();
}
}
Koden ovan:
- Skapar en ny HostApplicationBuilder instans som tilldelar till
builder
som variabel. ExampleService
Registrerar som appens enda IHostedService.- Lägger till en hälsokontroll för programmets livslängdshändelser IHostApplicationLifetime genom att länka ett anrop från instansen IHealthChecksBuilder som returneras av anropet AddHealthChecks till AddApplicationLifecycleHealthCheck tilläggsmetoden.
- Instansen
healthChecksBuilder
kan användas för att lägga till fler hälsokontroller.
- Instansen
- Skapar instansen IHost som variabel.
app
- Hämtar en
IHostedService
från tjänstleverantören, det här är instansenExampleService
. - Anrop Task.WhenAll med två uppgiftsreferenser:
- Metoden
DelayAndReportAsync
, som fördröjer 500 millisekunder och sedan anropar metoden på instansenExampleService
, utvärderarReadyAsync
hälsokontrollen. - Metoden RunAsync(IHost, CancellationToken) startar
app
.
- Metoden
Appen matar ut loggar i följande ordning och rapporterar hälsokontrollstatusen i förhållande till livscykelhändelserna:
StartingAsync
:OhälsosamStartAsync
:OhälsosamStartedAsync
:OhälsosamReadyAsync
:FriskStoppingAsync
:OhälsosamStopAsync
:OhälsosamStoppedAsync
:Ohälsosam
Med andra ord ser den här providern till att programinstansen endast tar emot trafik när den är klar. Om du utvecklar webbappar med ASP.NET Core finns det tillgängliga hälsokontroller av mellanprogram. Mer information finns i Hälsokontroller i ASP.NET Core.