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:
- Crea una nueva instancia de HostApplicationBuilder.
- Agrega una comprobación de estado para el uso de recursos mediante el encadenamiento de una llamada desde la llamada AddHealthChecks al método de extensión AddResourceUtilizationHealthCheck.
- Compila la instancia IHost como la variable
app
. - Obtiene una instancia de la clase HealthCheckService del proveedor de servicios.
- Realiza una comprobación de estado y muestra el resultado.
- Ejecuta la aplicación.
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:
- Una instancia de la clase HealthCheckService.
- Una instancia de la clase ILogger<TCategoryName>.
- Implementa la interfaz IHostedLifecycleService, con cada método invocando el método
CheckHealthAsync
. - Define un método
ReadyAsync
que invoca el métodoCheckHealthAsync
. - 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 instanciaHealthCheckService
. A continuación, se registraresult
.
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.
- La instancia
- Compila la instancia IHost como la variable
app
. - Obtiene un
IHostedService
del proveedor de servicios, esta es la instanciaExampleService
. - Llama a Task.WhenAll dadas dos referencias de tareas:
- El método
DelayAndReportAsync
, que retrasa 500 milisegundos y, a continuación, invoca el métodoReadyAsync
en la instanciaExampleService
, evaluará la comprobación de estado. - El método RunAsync(IHost, CancellationToken) inicia el
app
.
- El método
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:
StartingAsync
: IncorrectoStartAsync
: IncorrectoStartedAsync
: IncorrectoReadyAsync
: CorrectoStoppingAsync
: IncorrectoStopAsync
: IncorrectoStoppedAsync
: 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.