Comprobaciones de estado de gRPC en ASP.NET Core

Por James Newton-King

El protocolo de comprobación de estado gRPC es un estándar para notificar el estado de las aplicaciones de servidor gRPC.

Una aplicación expone las comprobaciones de estado como un servicio gRPC. Normalmente se usan con un servicio de supervisión externa para comprobar el estado de una aplicación. El servicio se puede configurar para diversos escenarios de supervisión en tiempo real:

  • Los orquestadores de contenedores y los equilibradores de carga pueden utilizar los sondeos de estado para comprobar el estado de una aplicación. Por ejemplo, Kubernetes admite sondeos de inicio, preparación y ejecución de gRPC. Kubernetes se puede configurar para redirigir el tráfico o reiniciar contenedores incorrectos en función de los resultados de la comprobación de estado de gRPC.
  • El uso de la memoria, el disco y otros recursos del servidor físico puede supervisarse para determinar si el estado es correcto.
  • Las comprobaciones de estado pueden probar las dependencias de una aplicación, como las bases de datos y los puntos de conexión de servicio externo, para confirmar la disponibilidad y el funcionamiento normal.

Configuración de comprobaciones de estado de gRPC

gRPC de ASP.NET Core tiene compatibilidad integrada con las comprobaciones de estado de gRPC con el paquete Grpc.AspNetCore.HealthChecks. Los resultados de las comprobaciones de estado de .NET se notifican a los autores de la llamada.

Para configurar comprobaciones de estado de gRPC en una aplicación:

  • Agregue una referencia de paquete Grpc.AspNetCore.HealthChecks.
  • Registre el servicio de comprobaciones de estado de gRPC:
    • AddGrpcHealthChecks para registrar los servicios que habilitan las comprobaciones de estado.
    • MapGrpcHealthChecksService para agregar un punto de conexión de servicio de comprobaciones de estado.
  • Agregue comprobaciones de estado mediante la implementación de IHealthCheck o con el método AddCheck.
using GrpcServiceHC.Services;
using Microsoft.Extensions.Diagnostics.HealthChecks;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks()
                .AddCheck("Sample", () => HealthCheckResult.Healthy());

var app = builder.Build();

app.MapGrpcService<GreeterService>();
app.MapGrpcHealthChecksService();

// Code removed for brevity.

Cuando se configuran las comprobaciones de estado:

  • El servicio de comprobaciones de estado se agrega a la aplicación de servidor.
  • Las comprobaciones de estado de .NET registradas con la aplicación se ejecutan periódicamente para los resultados de mantenimiento. De forma predeterminada, hay un retraso de 5 segundos después del inicio de la aplicación y, a continuación, se ejecutan comprobaciones de estado cada 30 segundos. El intervalo de ejecución de comprobación de estado se puede personalizar con HealthCheckPublisherOptions.
  • Los resultados de mantenimiento determinan lo que el servicio gRPC notifica:
    • Unknown se notifica cuando no hay ningún resultado de mantenimiento.
    • NotServing e notifica cuando hay algún resultado de mantenimiento de HealthStatus.Unhealthy.
    • De lo contrario, se notifica Serving.

Configuración de Grpc.AspNetCore.HealthChecks

De forma predeterminada, el servicio de comprobaciones de estado de gRPC usa todas las comprobaciones de estado registradas para determinar el estado de mantenimiento. Las comprobaciones de estado de gRPC se pueden personalizar cuando se registran para usar un subconjunto de comprobaciones de estado. El método MapService se usa para asignar los resultados de mantenimiento a nombres de servicio, junto con un predicado para filtrar los resultados de mantenimiento:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("", r => r.Tags.Contains("public"));
});

var app = builder.Build();

El código anterior invalida el servicio predeterminado ("") para usar solo los resultados de mantenimiento con la etiqueta "public".

Las comprobaciones de estado de gRPC admiten que el cliente especifique un argumento de nombre de servicio al comprobar el estado. Se admiten varios servicios si se proporciona un nombre de servicio a MapService:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddGrpc();
builder.Services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
    o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});

var app = builder.Build();

El nombre de servicio especificado por el cliente suele ser el predeterminado (""), o bien un nombre completo de paquete de un servicio en la aplicación. Pero nada impide que el cliente use valores arbitrarios para comprobar el estado de la aplicación.

Configuración del intervalo de ejecución de comprobaciones de estado

Las comprobaciones de estado se ejecutan inmediatamente cuando se llama a Check. Watch es un método de flujo continuo y tiene un comportamiento diferente al de Check: El flujo de larga duración informa de los resultados de las comprobaciones de estado a lo largo del tiempo mediante la ejecución periódica de IHealthCheckPublisher para recopilar los resultados de estado. De manera predeterminada, el editor

  • Espera 5 segundos después del inicio de la aplicación antes de ejecutar las comprobaciones de estado.
  • Ejecuta comprobaciones de estado cada 30 segundos.

Los intervalos de publicador se pueden configurar mediante HealthCheckPublisherOptions en el inicio:

builder.Services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.Zero;
    options.Period = TimeSpan.FromSeconds(10);
});

Llamada al servicio de comprobaciones de estado de gRPC

El paquete Grpc.HealthCheck incluye un cliente para las comprobaciones de estado de gRPC:

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);

var response = await client.CheckAsync(new HealthCheckRequest());
var status = response.Status;

Hay dos métodos en el servicio Health:

  • Check es un método unario para obtener el estado de mantenimiento actual. Las comprobaciones de estado se ejecutan inmediatamente cuando se llama a Check. El servidor devuelve una respuesta de error NOT_FOUND si el cliente solicita un nombre de servicio desconocido. Esto puede ocurrir en el inicio de la aplicación si aún no se han publicado los resultados de estado.
  • Watch es un método de streaming que informa de los cambios en el estado de mantenimiento a lo largo del tiempo. IHealthCheckPublisher se ejecuta periódicamente para recopilar resultados de estado. El servidor devuelve un estado Unknown si el cliente solicita un nombre de servicio desconocido.

Recursos adicionales

Por James Newton-King

El protocolo de comprobación de estado gRPC es un estándar para notificar el estado de las aplicaciones de servidor gRPC.

Una aplicación expone las comprobaciones de estado como un servicio gRPC. Normalmente se usan con un servicio de supervisión externa para comprobar el estado de una aplicación. El servicio se puede configurar para diversos escenarios de supervisión en tiempo real:

  • Los orquestadores de contenedores y los equilibradores de carga pueden utilizar los sondeos de estado para comprobar el estado de una aplicación. Por ejemplo, Kubernetes admite sondeos de inicio, preparación y ejecución de gRPC. Kubernetes se puede configurar para redirigir el tráfico o reiniciar contenedores incorrectos en función de los resultados de la comprobación de estado de gRPC.
  • El uso de la memoria, el disco y otros recursos del servidor físico puede supervisarse para determinar si el estado es correcto.
  • Las comprobaciones de estado pueden probar las dependencias de una aplicación, como las bases de datos y los puntos de conexión de servicio externo, para confirmar la disponibilidad y el funcionamiento normal.

Configuración de comprobaciones de estado de gRPC

gRPC de ASP.NET Core tiene compatibilidad integrada con las comprobaciones de estado de gRPC con el paquete Grpc.AspNetCore.HealthChecks. Los resultados de las comprobaciones de estado de .NET se notifican a los autores de la llamada.

Para configurar comprobaciones de estado de gRPC en una aplicación:

  • Agregue una referencia de paquete Grpc.AspNetCore.HealthChecks.
  • Registre el servicio de comprobaciones de estado de gRPC en Startup.cs:
    • AddGrpcHealthChecks para registrar los servicios que habilitan las comprobaciones de estado.
    • MapGrpcHealthChecksService para agregar un punto de conexión de servicio de comprobaciones de estado.
  • Agregue comprobaciones de estado mediante la implementación de IHealthCheck o con el método AddCheck.
public void ConfigureServices(IServiceCollection services)
{
    services.AddGrpc();
    services
        .AddGrpcHealthChecks()
        .AddCheck("Sample", () => HealthCheckResult.Healthy());
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<GreeterService>();
        endpoints.MapGrpcHealthChecksService();
    });
}

Cuando se configuran las comprobaciones de estado:

  • El servicio de comprobaciones de estado se agrega a la aplicación de servidor.
  • Las comprobaciones de estado de .NET registradas con la aplicación se ejecutan periódicamente para los resultados de mantenimiento. De forma predeterminada, hay un retraso de 5 segundos después del inicio de la aplicación y, a continuación, se ejecutan comprobaciones de estado cada 30 segundos. El intervalo de ejecución de comprobación de estado se puede personalizar con HealthCheckPublisherOptions.
  • Los resultados de mantenimiento determinan lo que el servicio gRPC notifica:
    • Unknown se notifica cuando no hay ningún resultado de mantenimiento.
    • NotServing e notifica cuando hay algún resultado de mantenimiento de HealthStatus.Unhealthy.
    • De lo contrario, se notifica Serving.

Configuración de Grpc.AspNetCore.HealthChecks

De forma predeterminada, el servicio de comprobaciones de estado de gRPC usa todas las comprobaciones de estado registradas para determinar el estado de mantenimiento. Las comprobaciones de estado de gRPC se pueden personalizar cuando se registran para usar un subconjunto de comprobaciones de estado. El método MapService se usa para asignar los resultados de mantenimiento a nombres de servicio, junto con un predicado para filtrar los resultados de mantenimiento:

services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("", r => r.Tags.Contains("public"));
});

El código anterior invalida el servicio predeterminado ("") para usar solo los resultados de mantenimiento con la etiqueta "public".

Las comprobaciones de estado de gRPC admiten que el cliente especifique un argumento de nombre de servicio al comprobar el estado. Se admiten varios servicios si se proporciona un nombre de servicio a MapService:

services.AddGrpcHealthChecks(o =>
{
    o.Services.MapService("greet.Greeter", r => r.Tags.Contains("greeter"));
    o.Services.MapService("count.Counter", r => r.Tags.Contains("counter"));
});

El nombre de servicio especificado por el cliente suele ser el predeterminado (""), o bien un nombre completo de paquete de un servicio en la aplicación. Pero nada impide que el cliente use valores arbitrarios para comprobar el estado de la aplicación.

Configuración del intervalo de ejecución de comprobaciones de estado

Las comprobaciones de estado se ejecutan inmediatamente cuando se llama a Check. Watch es un método de flujo continuo y tiene un comportamiento diferente al de Check: El flujo de larga duración informa de los resultados de las comprobaciones de estado a lo largo del tiempo mediante la ejecución periódica de IHealthCheckPublisher para recopilar los resultados de estado. De manera predeterminada, el editor

  • Espera 5 segundos después del inicio de la aplicación antes de ejecutar las comprobaciones de estado.
  • Ejecuta comprobaciones de estado cada 30 segundos.

Los intervalos de publicador se pueden configurar mediante HealthCheckPublisherOptions en el inicio:

services.Configure<HealthCheckPublisherOptions>(options =>
{
    options.Delay = TimeSpan.Zero;
    options.Period = TimeSpan.FromSeconds(10);
});

Llamada al servicio de comprobaciones de estado de gRPC

El paquete Grpc.HealthCheck incluye un cliente para las comprobaciones de estado de gRPC:

var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Health.HealthClient(channel);

var response = client.CheckAsync(new HealthCheckRequest());
var status = response.Status;

Hay dos métodos en el servicio Health:

  • Check es un método unario para obtener el estado de mantenimiento actual. Las comprobaciones de estado se ejecutan inmediatamente cuando se llama a Check. El servidor devuelve una respuesta de error NOT_FOUND si el cliente solicita un nombre de servicio desconocido. Esto puede ocurrir en el inicio de la aplicación si aún no se han publicado los resultados de estado.
  • Watch es un método de streaming que informa de los cambios en el estado de mantenimiento a lo largo del tiempo. IHealthCheckPublisher se ejecuta periódicamente para recopilar resultados de estado. El servidor devuelve un estado Unknown si el cliente solicita un nombre de servicio desconocido.

Recursos adicionales