Sdílet prostřednictvím


Kontroly stavu aplikace .NET v jazyce C#

V distribuovaném systému jsou kontroly stavu pravidelné hodnocení stavu, dostupnosti a výkonu jednotlivých uzlů nebo služeb. Tyto kontroly zajišťují, aby systém fungoval správně a efektivně. Kontroly stavu jsou nezbytné pro spolehlivost systému a obvykle se provádějí v pravidelných intervalech s výsledky analyzovanými pro rozhodování a nápravné akce.

Výsledky stavu kontroly heath jsou možné:

Kromě toho kontroly stavu často hlásí různé diagnostické metriky. Další informace najdete v tématu Diagnostické metriky: Microsoft.Extensions.Diagnostics.HealthChecks.

Kontroly stavu využití prostředků

Pokud chcete provádět kontroly stavu využití prostředků aplikací .NET, přidejte odkaz na balíček Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. IServiceCollection V instanci zřetězte volání z AddHealthChecks do AddResourceUtilizationHealthCheck. Následující příklad ukazuje použití AddResourceUtilizationHealthCheck metody rozšíření k přidání kontroly stavu využití prostředků do IServiceCollection instance:

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();

Předchozí kód:

Kontroly stavu životnosti aplikace

Chcete-li provést kontroly stavu událostí IHostApplicationLifetimeživotnosti aplikace , použijte AddApplicationLifecycleHealthCheck metodu rozšíření dostupnou v balíčku Microsoft.Extensions.Diagnostics.HealthChecks.Common NuGet.

Tento poskytovatel bude indikovat, že aplikace je v pořádku pouze v případě, že je plně aktivní. Dokud objekt životnosti indikuje, že aplikace byla spuštěna, poskytovatel hlásí aplikaci jako v pořádku. Když se aplikace spustí, poskytovatel hlásí aplikaci jako poškozenou.

Knihovna zveřejňuje HealthCheckService uživatele, kteří chtějí kdykoli požádat o kontrolu stavu. Zvažte následující ExampleService implementaci:

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);
    }
}

Předchozí kód:

  • Definuje novou ExampleLifecycle třídu, která implementuje IHostedService rozhraní.
  • Definuje primární konstruktor, který přijímá následující parametry:
  • Implementuje IHostedLifecycleService rozhraní, přičemž každá metoda vyvolá metodu CheckHealthAsync .
  • Definuje metodu ReadyAsync , která vyvolá metodu CheckHealthAsync .
  • Definuje vlastní CheckHealthAsync metodu, která zachycuje název volajícího a token zrušení, a potom požádá o kontrolu stavu z HealthCheckService instance. Potom se result zaprotokoluje.

Jediný čas, kdy služba kontroly stavu hlásí stav HealthStatus.Healthy , je po spuštění aplikace a před zavolání zastavením. Zvažte následující 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();
    }
}

Předchozí kód:

Aplikace vypíše protokoly v následujícím pořadí a hlásí stav kontroly stavu, protože souvisí s událostmi životního cyklu:

  1. StartingAsync:Nezdravý
  2. StartAsync:Nezdravý
  3. StartedAsync:Nezdravý
  4. ReadyAsync:Zdravý
  5. StoppingAsync:Nezdravý
  6. StopAsync:Nezdravý
  7. StoppedAsync:Nezdravý

Jinými slovy, tento poskytovatel zajišťuje, aby instance aplikace přijímala provoz jenom tehdy, když je připravená. Pokud vyvíjíte webové aplikace s ASP.NET Core, je k dispozici middleware kontrol stavu. Další informace najdete v ASP.NET Core v kontrolách stavu.

Viz také