Udostępnij za pośrednictwem


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:

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:
  • 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 kondycji HealthCheckService z wystąpienia. Następnie jest rejestrowany result .

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.
  • IHost Tworzy wystąpienie jako zmiennąapp.
  • Pobiera element IHostedService od dostawcy usług. Jest ExampleService 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łuje ReadyAsync metodę w wystąpieniu ExampleService , oceni kontrolę kondycji.
    • Metoda RunAsync(IHost, CancellationToken) uruchamia metodę app.

Aplikacja generuje dzienniki w następującej kolejności, zgłaszając stan kontroli kondycji w odniesieniu do zdarzeń cyklu życia:

  1. StartingAsync:Niezdrowy
  2. StartAsync:Niezdrowy
  3. StartedAsync:Niezdrowy
  4. ReadyAsync:Zdrowy
  5. StoppingAsync:Niezdrowy
  6. StopAsync:Niezdrowy
  7. StoppedAsync: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.

Zobacz też