Comparteix a través de


Comprobaciones de estado de aplicaciones de .NET en C#

En un sistema distribuido, las comprobaciones de estado son evaluaciones periódicas del estado, la disponibilidad y el rendimiento de nodos o servicios individuales. Estas comprobaciones garantizan que el sistema funciona correctamente y de forma eficaz. Las comprobaciones de estado son esenciales para la confiabilidad del sistema y normalmente se realizan a intervalos regulares con los resultados analizados para la toma de decisiones y las acciones correctivas.

Los siguientes resultados de comprobación de estado son posibles:

Además, las comprobaciones de estado suelen notificar varias métricas de diagnóstico. Para más información, consulte Métricas de diagnóstico: Microsoft.Extensions.Diagnostics.HealthChecks.

Comprobaciones de estado del uso de recursos

Para realizar comprobaciones de estado del uso de recursos de las aplicaciones .NET, agregue una referencia de paquete a Microsoft.Extensions.Diagnostics.HealthChecks.ResourceUtilization. En una instancia IServiceCollection, encadene una llamada de AddHealthChecks a AddResourceUtilizationHealthCheck. En el siguiente ejemplo se muestra cómo usar el método de extensión AddResourceUtilizationHealthCheck para agregar una comprobación de estado del uso de recursos a una instancia IServiceCollection:

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

El código anterior:

Comprobaciones de estado de vigencia de la aplicación

Para realizar comprobaciones de estado en los eventos de duración de la aplicación de IHostApplicationLifetime, use el método de extensión AddApplicationLifecycleHealthCheck disponible en el paquete NuGet Microsoft.Extensions.Diagnostics.HealthChecks.Common.

Este proveedor indicará que la aplicación es correcta solo cuando está totalmente activa. Hasta que el objeto de duración indique que la aplicación se ha iniciado, el proveedor notificará la aplicación como no correcta. Cuando se inicia el apagado de la aplicación, el proveedor notificará la aplicación como incorrecta.

La biblioteca expone un HealthCheckService que permite a los consumidores solicitar una comprobación de estado en cualquier momento. Considere la siguiente implementación de ExampleService:

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

El código anterior:

  • Define una nueva clase ExampleLifecycle que implementa la interfaz IHostedService.
  • Define un constructor principal que acepta los siguientes parámetros:
  • Implementa la interfaz IHostedLifecycleService, con cada método invocando el método CheckHealthAsync.
  • Define un método ReadyAsync que invoca el método CheckHealthAsync.
  • Define un método personalizado CheckHealthAsync que captura el nombre del autor de la llamada y el token de cancelación y, a continuación, solicita una comprobación de estado de la instancia HealthCheckService. A continuación, se registra result.

La única vez que el servicio de comprobación de estado notificará un estado HealthStatus.Healthy es después de que se haya iniciado la aplicación y antes de que se llame a la detención. Tenga en cuenta el siguiente 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();
    }
}

El código anterior:

  • Crea una nueva instancia HostApplicationBuilder que se asigna a como variable builder.
  • Registra el ExampleService como único IHostedService de la aplicación.
  • Agrega una comprobación de estado para los eventos de duración de la aplicación IHostApplicationLifetime mediante el encadenamiento de una llamada desde la instancia IHealthChecksBuilder devuelta por la llamada AddHealthChecks al método de extensión AddApplicationLifecycleHealthCheck.
    • La instancia healthChecksBuilder se puede usar para agregar más comprobaciones de estado.
  • Compila la instancia IHost como la variable app.
  • Obtiene un IHostedService del proveedor de servicios, esta es la instancia ExampleService.
  • Llama a Task.WhenAll dadas dos referencias de tareas:
    • El método DelayAndReportAsync, que retrasa 500 milisegundos y, a continuación, invoca el método ReadyAsync en la instancia ExampleService, evaluará la comprobación de estado.
    • El método RunAsync(IHost, CancellationToken) inicia el app.

La aplicación genera registros en el siguiente orden, notificando el estado de la comprobación de estado en relación con los eventos del ciclo de vida:

  1. StartingAsync: Incorrecto
  2. StartAsync: Incorrecto
  3. StartedAsync: Incorrecto
  4. ReadyAsync: Correcto
  5. StoppingAsync: Incorrecto
  6. StopAsync: Incorrecto
  7. StoppedAsync: Incorrecto

En otras palabras, este proveedor garantiza que la instancia de la aplicación solo recibe tráfico cuando está lista. Si va a desarrollar aplicaciones web con ASP.NET Core, hay middleware de comprobaciones de estado disponibles. Para obtener más información, consulte Comprobaciones de estado en ASP.NET Core.

Consulte también