Dela via


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:

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:
  • Implementerar IHostedLifecycleService gränssnittet med varje metod som anropar CheckHealthAsync metoden.
  • Definierar en ReadyAsync metod som anropar CheckHealthAsync metoden.
  • Definierar en anpassad CheckHealthAsync metod som fångar upp uppringarens namn och annulleringstoken och begär sedan en hälsokontroll från instansen HealthCheckService . 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:

Appen matar ut loggar i följande ordning och rapporterar hälsokontrollstatusen i förhållande till livscykelhändelserna:

  1. StartingAsync:Ohälsosam
  2. StartAsync:Ohälsosam
  3. StartedAsync:Ohälsosam
  4. ReadyAsync:Frisk
  5. StoppingAsync:Ohälsosam
  6. StopAsync:Ohälsosam
  7. StoppedAsync: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.

Se även