Statuscontroles van .NET-apps in C#
In een gedistribueerd systeem zijn statuscontroles periodieke evaluaties van de status, beschikbaarheid en prestaties van afzonderlijke knooppunten of services. Deze controles zorgen ervoor dat het systeem correct en efficiënt functioneert. Statuscontroles zijn essentieel voor de betrouwbaarheid van het systeem en worden doorgaans regelmatig uitgevoerd met de resultaten die worden geanalyseerd op besluitvorming en corrigerende acties.
De volgende statusresultaten voor statuscontrole zijn mogelijk:
Daarnaast rapporteren statuscontroles vaak verschillende diagnostische metrische gegevens. Zie Diagnostische metrische gegevens voor meer informatie: Microsoft.Extensions.Diagnostics.HealthChecks
.
Statuscontroles voor resourcegebruik
Als u statuscontroles wilt uitvoeren voor het resourcegebruik van uw .NET-apps, voegt u een pakketverwijzing toe aan Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. In een IServiceCollection instantie koppelt u een aanroep van AddHealthChecks naar AddResourceUtilizationHealthCheck. In het volgende voorbeeld ziet u hoe u de AddResourceUtilizationHealthCheck
extensiemethode gebruikt om een statuscontrole voor resourcegebruik toe te voegen aan een IServiceCollection
exemplaar:
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();
Met de voorgaande code wordt:
- Hiermee maakt u een nieuw HostApplicationBuilder exemplaar.
- Hiermee voegt u een statuscontrole voor resourcegebruik toe door een aanroep van de AddHealthChecks aanroep naar de AddResourceUtilizationHealthCheck extensiemethode te koppelen.
- Hiermee wordt het IHost exemplaar gebouwd als de
app
variabele. - Hiermee haalt u een exemplaar van de HealthCheckService klasse op van de serviceprovider.
- Voert een statuscontrole uit en geeft het resultaat weer.
- Hiermee wordt de toepassing uitgevoerd.
Statuscontroles voor de levensduur van toepassingen
Als u statuscontroles wilt uitvoeren op de levensduurgebeurtenissen van IHostApplicationLifetimede toepassing, gebruikt u de AddApplicationLifecycleHealthCheck extensiemethode die beschikbaar is in het NuGet-pakket Microsoft.Extensions.Diagnostics.HealthChecks.Common .
Deze provider geeft aan dat de toepassing alleen in orde is wanneer deze volledig actief is. Totdat het levensduurobject aangeeft dat de toepassing is gestart, rapporteert de provider de toepassing als niet in orde. Wanneer de toepassing wordt afgesloten, rapporteert de provider de toepassing als beschadigd.
De bibliotheek stelt een HealthCheckService gebruiker in staat om op elk gewenst moment een statuscontrole aan te vragen. Houd rekening met de volgende ExampleService
implementatie:
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);
}
}
Met de voorgaande code wordt:
- Hiermee definieert u een nieuwe
ExampleLifecycle
klasse waarmee de IHostedService interface wordt geïmplementeerd. - Definieert een primaire constructor die de volgende parameters accepteert:
- Een exemplaar van de HealthCheckService klasse.
- Een exemplaar van de ILogger<TCategoryName> klasse.
- Implementeert de IHostedLifecycleService interface, waarbij elke methode de
CheckHealthAsync
methode aanroept. - Definieert een
ReadyAsync
methode die deCheckHealthAsync
methode aanroept. - Definieert een aangepaste
CheckHealthAsync
methode waarmee de naam van de aanroeper en het annuleringstoken worden vastgelegd en vervolgens een statuscontrole van hetHealthCheckService
exemplaar wordt aangevraagd. Deresult
gegevens worden vervolgens geregistreerd.
De enige keer dat de statuscontroleservice een status HealthStatus.Healthy rapporteert, is nadat de app is gestart en voordat de app wordt gestopt, aangeroepen. Houd rekening met de volgende 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();
}
}
Met de voorgaande code wordt:
- Hiermee maakt u een nieuw HostApplicationBuilder exemplaar dat als variabele
builder
wordt toegewezen. - Registreert de
ExampleService
app alleen IHostedServiceals de app. - Voegt een statuscontrole toe voor de levensduurgebeurtenissen van IHostApplicationLifetime de toepassing door een aanroep van het IHealthChecksBuilder exemplaar te koppelen dat door de AddHealthChecks aanroep naar de AddApplicationLifecycleHealthCheck extensiemethode wordt geretourneerd.
- Het
healthChecksBuilder
exemplaar kan worden gebruikt om meer statuscontroles toe te voegen.
- Het
- Hiermee wordt het IHost exemplaar gebouwd als de
app
variabele. - Hiermee haalt u een
IHostedService
van de serviceprovider op. Dit is hetExampleService
exemplaar. - Aanroepen Task.WhenAll met twee taakverwijzingen:
- De
DelayAndReportAsync
methode, die 500 milliseconden vertraagt en vervolgens deReadyAsync
methode op hetExampleService
exemplaar aanroept, evalueert de statuscontrole. - De RunAsync(IHost, CancellationToken) methode start de
app
.
- De
De app voert logboeken uit in de volgende volgorde, waarbij de status van de statuscontrole wordt gerapporteerd, omdat deze betrekking heeft op de levenscyclus-gebeurtenissen:
StartingAsync
:OngezondStartAsync
:OngezondStartedAsync
:OngezondReadyAsync
:GezondStoppingAsync
:OngezondStopAsync
:OngezondStoppedAsync
:Ongezond
Met andere woorden, deze provider zorgt ervoor dat het toepassingsexemplaren alleen verkeer ontvangen wanneer deze gereed is. Als u web-apps ontwikkelt met ASP.NET Core, zijn er statuscontroles beschikbaar voor middleware. Statuscontroles in ASP.NET Core voor meer informatie.