0

[Article] Estado de aplicaciones en Asp.Net

En estos tiempos modernos donde construimos aplicaciones, la gran mayoría de los proyectos tienen varios servicios comunicándose entre sí y es verdaderamente difícil ver el estado de los servicios casi instantáneamente. Asp.Net podemos configurar comprobaciones de estado junto a varios tipos de diferentes métricas.

Comencemos

Vamos a estar utilizando la plantilla de Asp.Net MVC, tal vez no estés familiarizado con ella, pero no es la única que podemos usar, es posible usarla en proyectos del tipo API, consola o también, en Blazor.

Vamos a la consola y construyamos nuestra aplicación:

dotnet new mvc -n Monitor
dotnet new sln
dotnet sln add Monitor

El siguiente paso será instalar la dependencia de HealthChecks, para eso nuevamente en la consola ejecutaremos el siguiente comando:

dotnet add package AspNetCore.HealthChecks.UI

Una vez instalado, en el Starup.cs de nuestro proyecto, en el método ConfigureServices agregaremos el servicio:

services.AddHealthChecks();

Ahora debemos configurar el endpoint donde será enviado el JSON con la información para visualizar el estado actual de la aplicación, para esto en el método Configure agregaremos un endpoint :

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");

    endpoints.MapHealthChecks("/health");
});

Ejecutaremos la aplicación y comprobaremos que está funcionando como corresponde en la dirección que hemos configurado el endpoint:

No es nada especial, solamente podemos ver que el servicio está listo. Ahora configuraremos el panel de control. Este panel está bien completo y listo para usar y lo implementaremos en nuestro proyecto actual para convertirla en una aplicación de monitoreo completa. Una vez lista, podremos sondear y verificar el estado de salud de algunas que se estén ejecutando.

Este panel necesitará guardar datos en algún lugar, lo haremos en memoria, pero podemos usar una base de datos. Recuerda que esto es altamente volátil, no se recomienda usarlo en entornos productivos. Necesitaremos instalar el paquete AspNetCore.HealthChecks.UI.InMemory.Storage.

dotnet add package AspNetCore.HealthChecks.UI.InMemory.Storage

Volcamos al código de nuestro StartUp, iremos al método ConfigureServices y agregaremos las siguientes líneas de código:

services.AddHealthChecksUI()
        .AddInMemoryStorage();

Por último, cambiaremos nuestro endpoint para poder ver el panel:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");

    endpoints.MapHealthChecksUI();
});

Tenemos nuestro panel listo, pero no tenemos que monitorear. Vamos agregar dos proyectos api que llamaremos Servicio1 y Servicio2. Estos los utilizaremos para monitorear. ejecutaremos en la línea de comando lo siguiente:

dotnet new webapi -n Servicio1
dotnet new webapi -n Servicio2
dotnet sln add Servicio1 Servicio2

Para que los servicios comiencen a reportar su estado a nuestra aplicación monitor debemos entrar en cada uno de sus Startup.cs y agregar en el método ConfigureServices el HealthCheck:

public void ConfigureServices(IServiceCollection services)
{
    // ...
    services.AddHealthChecks();
}

También deberemos agregar el endpoint de la siguiente manera:

app.UseEndpoints(endpoints =>
{
    // ...
    endpoints.MapHealthChecks("/health", new HealthCheckOptions()
    {
        ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
    });
   // ...
});

Seguramente les marcara un error debido a que no posee los paquete necesarios, simplemente abriremos el archivo .csproj y agregaremos los paquetes necesarios:

<PackageReference Include="AspNetCore.HealthChecks.UI" Version="5.0.1" />
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="5.0.1" />

Por último, deberemos agregar los endpoints de los servicios al proyecto Monitor. Esto se hace de una manera muy sencilla desde nuestro archivo appsettings.json del proyecto Monitor.

"HealthChecksUI": {
  "HealthChecks": [
    {
      "Name": "Servicio 1",
      "Uri": "https://localhost:44392//health"
    },
    {
      "Name": "Servicio 2",
      "Uri": "https://localhost:44360/health"
    }
  ],
  "EvaluationTimeInSeconds": 10
},

No olvide de tomar los puertos que les asigna el VisualStudio para configurar el archivo appsettings.json. En mi caso son 44392 y el 44360.

Corremos los proyectos y nos dirigimos al panel para ver el estado de los mismos

https://localhost:<tu puerto>/healthchecks-ui

Conclusión

En el post vimos cómo es posible mejorar la experiencia de desarrollador aprovechando las comprobaciones de estado de ASP.NET. Tenemos una gran cantidad de proveedores y configuraciones para utilizar. Puede consultar la documentación para obtener más información.  Documentación.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *