Testy kondycji aplikacji platformy .NET w języku C#
W systemie rozproszonym kontrole kondycji są okresowymi ocenami stanu, dostępności i wydajności poszczególnych węzłów lub usług. Te testy zapewniają prawidłowe i wydajne działanie systemu. Kontrole kondycji są niezbędne dla niezawodności systemu i są zwykle wykonywane w regularnych odstępach czasu z wynikami analizowanych pod kątem podejmowania decyzji i działań naprawczych.
Możliwe są następujące wyniki sprawdzania stanu heath:
Ponadto kontrole kondycji często zgłaszają różne metryki diagnostyczne. Aby uzyskać więcej informacji, zobacz Metryki diagnostyczne: Microsoft.Extensions.Diagnostics.HealthChecks
.
Testy kondycji wykorzystania zasobów
Aby przeprowadzić kontrole kondycji dotyczące wykorzystania zasobów aplikacji platformy .NET, dodaj odwołanie do pakietu Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUmyślnie. Na wystąpieniu IServiceCollection utwórz łańcuch wywołania z AddHealthChecks do AddResourceUtilizationHealthCheck. W poniższym przykładzie pokazano, jak za pomocą AddResourceUtilizationHealthCheck
metody rozszerzenia dodać kontrolę kondycji wykorzystania zasobów do IServiceCollection
wystąpienia:
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();
Powyższy kod ma następujące działanie:
- Tworzy nowe wystąpienie klasy HostApplicationBuilder.
- Dodaje kontrolę kondycji pod kątem wykorzystania zasobów, łącząc wywołanie z AddHealthChecks wywołania AddResourceUtilizationHealthCheck do metody rozszerzenia.
- IHost Tworzy wystąpienie jako zmienną
app
. - Pobiera wystąpienie HealthCheckService klasy od dostawcy usług.
- Wykonuje kontrolę kondycji i wyświetla wynik.
- Uruchamia aplikację.
Testy kondycji okresu istnienia aplikacji
Aby przeprowadzić kontrole kondycji zdarzeń okresu istnienia aplikacji programu IHostApplicationLifetime, użyj AddApplicationLifecycleHealthCheck metody rozszerzenia dostępnej w pakiecie Microsoft.Extensions.Diagnostics.HealthChecks.Common NuGet.
Ten dostawca będzie wskazywać, że aplikacja jest w dobrej kondycji tylko wtedy, gdy jest w pełni aktywna. Dopóki obiekt okresu istnienia nie wskaże, że aplikacja została uruchomiona, dostawca zgłosi aplikację jako nie w dobrej kondycji. Po rozpoczęciu zamykania aplikacji dostawca zgłosi aplikację jako złą kondycję.
Biblioteka uwidacznia HealthCheckService użytkownikom możliwość żądania kontroli kondycji w dowolnym momencie. Rozważmy następującą ExampleService
implementację:
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);
}
}
Powyższy kod ma następujące działanie:
- Definiuje nową
ExampleLifecycle
klasę, która implementuje IHostedService interfejs. - Definiuje podstawowy konstruktor akceptujący następujące parametry:
- Wystąpienie klasy HealthCheckService.
- Wystąpienie klasy ILogger<TCategoryName>.
- Implementuje IHostedLifecycleService interfejs z każdą metodą wywoływania
CheckHealthAsync
metody. - Definiuje metodę
ReadyAsync
, która wywołuje metodęCheckHealthAsync
. - Definiuje metodę niestandardową
CheckHealthAsync
, która przechwytuje nazwę obiektu wywołującego i token anulowania, a następnie żąda sprawdzenia kondycjiHealthCheckService
z wystąpienia. Następnie jest rejestrowanyresult
.
Jedynym czasem raportowania stanu HealthStatus.Healthy przez usługę kontroli kondycji jest po uruchomieniu aplikacji i przed jej zatrzymaniem. Rozważ następujące 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();
}
}
Powyższy kod ma następujące działanie:
- Tworzy nowe HostApplicationBuilder wystąpienie przypisywane jako zmienna
builder
. - Rejestruje
ExampleService
jako tylko IHostedServiceaplikację . - Dodaje kontrolę kondycji zdarzeń IHostApplicationLifetime okresu istnienia aplikacji przez utworzenie łańcucha wywołań z IHealthChecksBuilder wystąpienia zwróconego przez AddHealthChecks wywołanie AddApplicationLifecycleHealthCheck metody rozszerzenia.
- Wystąpienie może służyć do dodawania
healthChecksBuilder
większej liczby kontroli kondycji.
- Wystąpienie może służyć do dodawania
- IHost Tworzy wystąpienie jako zmienną
app
. - Pobiera element
IHostedService
od dostawcy usług. JestExampleService
to wystąpienie. - Wywołania Task.WhenAll przy użyciu dwóch odwołań do zadań:
- Metoda
DelayAndReportAsync
, która opóźnia 500 milisekund, a następnie wywołujeReadyAsync
metodę w wystąpieniuExampleService
, oceni kontrolę kondycji. - Metoda RunAsync(IHost, CancellationToken) uruchamia metodę
app
.
- Metoda
Aplikacja generuje dzienniki w następującej kolejności, zgłaszając stan kontroli kondycji w odniesieniu do zdarzeń cyklu życia:
StartingAsync
:NiezdrowyStartAsync
:NiezdrowyStartedAsync
:NiezdrowyReadyAsync
:ZdrowyStoppingAsync
:NiezdrowyStopAsync
:NiezdrowyStoppedAsync
:Niezdrowy
Innymi słowy, ten dostawca zapewnia, że wystąpienie aplikacji odbiera ruch tylko wtedy, gdy jest gotowy. Jeśli tworzysz aplikacje internetowe za pomocą platformy ASP.NET Core, dostępne jest oprogramowanie pośredniczące sprawdzania kondycji. Aby uzyskać więcej informacji, kontrola kondycji w usłudze ASP.NET Core.