Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
April 25, 2022 06:43 pm GMT

[Parte 11] ASP.NET Core: Application Insights y Serilog

Introduccin

Al tener aplicaciones en produccin siempre es de suma importancia el poder monitorearlas. Monitorear una Web API tiene sus grandes beneficios y se ha convertido en un MUST al momento de yo manejar aplicaciones en ambientes de produccin.

Saber como se comporta tu aplicacin, que problemas de rendimiento tiene y hasta saber que errores genera es de vital importancia al operar un sistema. Siempre habrn errores y siempre habr que arreglarlos. Hagamos que este proceso de debugging sea ms sencillo para nosotros.

Como siempre, aqu encontrars el cdigo que aplica para este post.

Application Insights

Application Insights es una herramienta que forma parte de la suite de Azure Monitor el cual provee de un Application Performance Management y monitoreo para aplicaciones web que estn en produccin o corriendo en vivo en Azure o en cualquier lado.

Developers o profesionales de DevOps pueden usar Application Insights para:

  • Automticamente detectar anomalas de performance
  • Ayuda a diagnosticar problemas utilizando las herramientas de analytics
  • Ver el comportamiento de los usuarios al usar la aplicacin
  • Ayuda a mejorar continuamente la usabilidad y el performance de la aplicacin

Funcionalidades de Application Insights:

  • Soporta una gran variedad de lenguajes de programacin, como .NET, node.js, java y python
  • Funciona en aplicaciones hospedadas en servidores on-premises, hbrido o en cualquier nube pblica
  • Se puede integrar con procesos de DevOps
  • Se puede conectar con muchas herramientas de desarrollo (Power BI, Alertas, Visual Studio, etc)
  • Puede monitorear y analizar la telemetra de aplicaciones mviles

Cmo funciona?

Para usar Application Insights debemos de instalar un pequeo paquete (el SDK) en la aplicacin, en visual studio se pude hacer incluso automticamente, pero lo haremos manualmente ms adelante.

Podemos monitorear cualquier servicio web o background service, incluso la parte de frontend con Javascript en una aplicacin web. Como mencion antes, las aplicaciones no estn obligadas a estar hosteadas en Azure para que se puedan analizar.

La instrumentacin ocurre en distintos Threads y no bloquea cualquier llamada que se hace a la aplicacin, por lo que el impacto en la aplicacin es pequeo.

El siguiente diagrama muestra un ejemplo de como Application Insights monitorea la aplicacin y manda la telemetra a AI.

Image description

Qu monitorea?

Application insights ayuda a los equipos de desarrollo a entender el uso y el performance de las aplicaciones, por lo que monitorea:

  • Requests recibidos, tiempos de respuesta y fallas
    • Podramos saber cuales son los mtodos ms lentos, ms usados y los que ms fallan
  • Todas las dependencias (bases de datos, servicios externos, storage accounts, redis, etc)
  • Excepciones
    • Todos los errores que ocurren en la aplicacin podemos analizarlos e incluso debuggear el memory dump
  • El frontend: visitas a las pginas, cuanto tardan en cargar y comportamiento de usuarios
    • Tambin llamadas de javascript (requests realizados, tiempo de respuesta y errores)
  • Cantidad de usuarios y sesiones nicas
  • Indicadores de performance, como el CPU, memoria y uso de la red
  • Diagnsticos del host, como docker o azure
  • Trace logs de las apps, podemos hacer tracing de un request y ver como se ejecuto incluso si involucra distintos servicios
  • En general custom events/logs y mtricas que sirven para algn tracking que el negocio requiera

Configurando Application Insights en ASP.NET Core

Realmente como mencion antes, si usamos visual studio, podemos configurar application insights de una forma automtica, pero me gusta hacerlo manualmente para entender bien que se configura.

Nota : Este post sigue siendo una continuacin de la serie de artculos sobre distintos temas de ASP.NET Core. Si no tienes la solucin, no dudes en visitar el repositorio en GitHub por que aqu omitir mucho cdigo.

Comenzamos instalando los siguientes paquetes:

<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.20.0" /><PackageReference Include="Serilog.Sinks.ApplicationInsights" Version="3.1.0" />

Estos dos paquetes son el SDK de Application Insights y un Sink de Serilog. Serilog lo hemos configurado en este post y es bien til combinarlos con Application Insights.

Para comenzar a recolectar telemetra de nuestra aplicacin y empezar a usarla, necesitamos crear un Application Insights en Azure. Es bien sencillo y realmente no pide informacin que se te pueda dificultar.

Lo importante, es tener los connection strings / instrumentation keys de un application insights previamente creado:

Image description
Y la configuracin es extremadamente sencilla, nos vamos a Program.cs y agregamos la siguiente lnea:

// ... cdigo omitidobuilder.Host.UseSerilog();// ... cdigo omitidobuilder.Services.AddApplicationInsightsTelemetry(); // <------ this onevar app = builder.Build();// ... cdigo omitido

Y agregamos la cadena de conexin en la configuracin (appsettings.json o user secrets)

{    // Settings omitidos    "ApplicationInsights": {    "ConnectionString": "InstrumentationKey=<Instrumentation Key>;IngestionEndpoint=https://eastus-6.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/"  }}

As de fcil, ya podemos empezar a monitorear nuestra aplicacin. En este punto se monitorea casi lo ms importante pero hay algo que nos falta, los logs y las excepciones.

Si ejecutamos as la aplicacin y la empezamos a usar, vamos a poder ver tiempos de respuesta, que solicitudes se hacen, si las solicitudes fallan (mostrando nicamente el HTTP Code) y los indicadores del servidor como el CPU, memoria, etc.

Pero si recuerdan, al implementar CQRS y serilog, incluimos ya logs que nos pueden servir para el diagnostico de la aplicacin si algo sale mal (los audit logs, las excepciones y entre otras cosas).

Por lo que, siempre recomendar, es aprovechar el Sink de Serilog para complementar esta herramienta.

Configurarlo, es igual de fcil. En Program.cs actualizamos:

Log.Logger = new LoggerConfiguration()    .MinimumLevel.Override("Microsoft", LogEventLevel.Warning)    .Enrich.FromLogContext()    .WriteTo.Console()    .WriteTo.ApplicationInsights(app.Services.GetRequiredService<TelemetryConfiguration>(), TelemetryConverter.Traces) // <--- this one    .WriteTo.File("log.txt", rollingInterval: RollingInterval.Day)    .CreateLogger();

Anteriormente ya tenamos configurado Serilog, por lo que solamente resta agregar el Sink a Application Insights que incluso ya instalamos al inicio de este post.

Lo que estamos diciendo aqu es, que todos los Logs que son generados por la aplicacin, los guarde en Application Insights como del tipo Traces. Ya sean Information, Warning. Los Error / Exceptions sern del tipo Exception en Application Insights. Esto es bien super til, por que nos permitir ver traces de esta forma:

Image description
Ya que previamente en nuestra aplicacin, hemos configurado que se haga Logs de los errores, esto lo hacemos aqu implementando unos ExceptionFilters.

Si exploramos un request, podemos ver todo bien detallado:

Image description
Esto, es esencial, cranme, necesitan esto en sus aplicaciones en produccin

Siempre va a salir algo mal, necesitamos las herramientas para investigar que sucede en nuestra aplicacin.

En mi Stack, application insights ha venido para quedarse.

Nota : Existen otras herramientas para hacer esto mismo, pero dado a que yo soy Azure Based, esto me funciona al 100%. Open Telemetry y proyectos como Prometheus o Jeager ayudan bastante en esta misma tarea.

En resumen, con application insights en una Web Api podemos monitorear:

Todas las operaciones realizadas
Image description
Cuanto tardan las dependencias
Image description

Indicadores del servidor
Image description

Mtricas en tiempo real
Image description
Este es de los que son ms tiles para mi, al intentar reproducir errores, podemos ver los logs en tiempo real.

Gracias a serilog, nos facilita la vida y manda los logs segn lo configuremos.

Message Templates

En el post de Serilog, mencion la importancia de crear Message Templates en los logs y no "concatenar" strings en los logs. La razn de que es mejor usar message templates es por la generacin de esta telemetra. Un Message Template se puede visualizar de esta forma:

Image description
El Message es lo que nosotros vemos en consola, pero todos esos Custom Properties nos ayudan incluso a buscar mejor segn necesitemos. Aqu podramos buscar por RequestName, User o algn dato en el Request.

Bsqueda por Custom Properties

El beneficio real de usar los Message Templates y que Serilog los mande como Custom Properties, est al hacer bsqueda en los logs.

Application Insights nos deja hacer Queries con un lenguaje especial de Azure. Saber esto es bien til, porque podemos automatizar muchas cosas (como generar alertas).

Si consultamos las operaciones realizadas por un usuario, podemos hacerlo:

Image description
Aqu vemos que todo lo que el Message Template incluye, se agrega en el Trace de Application Insights.

Otro ejemplo, si queremos buscar por operacin:

Image description
Ya con esto, incluso podramos tener un sistema auditable (de eso hable en este post utilizando Audit.NET).

Bsicamente, lo que Serilog agrega como Custom Properties al mandar los logs a Application Insights son:

{  "AspNetCoreEnvironment": "Development",  "RequestId": "0HMH6PLB0IKKE:00000015",  "RequestPath": "/api/products",  "ConnectionId": "0HMH6PLB0IKKE",  "ActionName": "MediatrExample.WebApi.Controllers.ProductsController.CreateProduct (MediatrExample.WebApi)",  "ActionId": "850584fd-aa63-4f96-a2a3-6fe791b279fe",  "MessageTemplate": "{RequetsName}: {@User} with request {@Request}",  "SourceContext": "MediatrExample.ApplicationCore.Common.Behaviours.AuditLogsBehavior",  "User": "cbb809be-e383-44d0-9435-564017db0602",  "Request": "{\"Description\":\"string\",\"Price\":0,\"_typeTag\":\"CreateProductCommand\"}",  "RequetsName": "CreateProductCommand"}

Ms todo lo que incluyamos en el Message Template. En este caso, el message template incluye RequestName, User y Request ( y fjate que Request, es otro objeto JSON)

Conclusin

Aunque Application Insights no es gratis, no tiene un costo elevado para que no se considere en tu stack.

Uses o no Azure, AI puede usarse y obtener resultados muy similares (si no es que iguales).

Su integracin con una aplicacin de .NET es muy fcil, pero tambin lo es con los lenguajes soportados.

Espero te sea de utilidad y le des el uso que yo le doy.

Referencias


Original Link: https://dev.to/isaacojeda/parte-11-aspnet-core-application-insights-y-serilog-3103

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To