
OpenTelemetry y Azure Monitor en aplicaciones .NET
Implementar observabilidad en nuestras aplicaciones ya no es una opción en el desarrollo moderno; los equipos necesitan poder tener trazabilidad de los llamados entre servicios y/o microservicios para que esta trazabilidad pueda ser usada para la recuperación ante escenarios de fallo o caídas.
Desde hace mucho han existido plataformas especializadas para el monitoreo y observabilidad de aplicaciones, los comúnmente llamados APM o Application Performance Monitoring por sus siglas en inglés. Plataformas que prometen un conjunto de herramientas de caja para facilitar este monitoreo de aplicaciones. Cada APM brindaba su SDK para poder integrarse con los diferentes lenguajes de programación.
En la misma línea, Azure Monitor como APM implementaba esta integración con su bien conocido Application Insights, el cual permitía a las aplicaciones capturar trazas, métricas y logs. Combinado con los Azure Workspace Log Analytics, se puede tener una plataforma completa para análisis de trazabilidad y monitoreo de aplicaciones.
¿Qué es OpenTelemetry - OTel?
OpenTelemetry es un marco y conjunto de herramientas de la CNCF (Cloud Native Computing Foundation) que buscan estandarizar la generación de datos de telemetría como trazas, métricas y logs. Uno de los objetivos eje es facilitar la “instrumentación” de las aplicaciones, independientemente del lenguaje de programación e infraestructura; por ello, brinda un conjunto de SDKs para cada lenguaje, así como una arquitectura de referencia. OTel, intencionalmente, deja de lado el tema del almacenamiento (Backend) y la visualización de los datos (Frontend), lo cual ya debe ser tomado por otras herramientas; es aquí donde los clásicos APMs se adaptaron al estándar y ahora funcionan como un backend dentro de la propuesta de OTel. Esto se puede expresar mejor con el siguiente diagrama:

Como se puede ver, las aplicaciones y servicios enviarían la telemetría a un componente que OTel denomina el “Collector”; este componente es agnóstico de cualquier plataforma y permite recibir telemetría para servicios HTTP y gRPC. Este collector es un binario que puede implementarse en una máquina virtual o incluso en contenedores; a este componente se le pueden configurar “exporters”, que son los encargados de enviar la telemetría a un backend en específico.
.NET y OpenTelemetry
OpenTelemetry ofrece un SDK para .NET, básicamente un conjunto de librerías o paquetes para poder orquestar la telemetría necesaria y exportar al collector de OTel.
OpenTelemetry.Instrumentation.AspNetCore: Paquete que permite la captura de telemetría de las peticiones entrantes a una aplicación .NET.
OpenTelemetry.Instrumentation.Http: Paquete que permite capturar telemetría de las llamadas HTTP a otros servicios, es decir, instrumenta todo lo relacionado al uso de HttpClient para invocar otras APIs.
OpenTelemetry.Instrumentation.Runtime: A diferencia de los paquetes anteriores, este paquete permite instrumentar data del entorno de ejecución: uso de memoria, procesamiento, hilos, entre otros.
OpenTelemetry.Exporter.OpenTelemetryProtocol: Este paquete permite implementar el exportador de telemetría hacia el collector de OpenTelemetry.
OpenTelemetry.Extensions.Hosting: Este paquete permite instalar un servicio hosteado que vivirá junto con la aplicación; su función es asegurar que la telemetría se envíe desde el arranque y también cuando la aplicación se finaliza.
OpenTelemetry.Exporter.Console: Paquete para ver el log de OpenTelemetry en la consola, ideal para desarrollo local.
Azure y OpenTelemetry
Como mencioné en la introducción, Azure Monitor como APM ya cumplía su rol mucho antes de OTel, pero con el nacimiento y auge del estándar, Azure Monitor hizo todos los ajustes necesarios para poder ejercer el rol de backend en la figura de OTel. El punto de entrada sigue siendo Application Insights, pero este ahora puede entender lo que envía la instrumentación de OTel y adaptarlo al modelo/esquema de Azure Monitor, para luego persistirlo en el almacenamiento final en Workspace Log Analytics.
Ejemplo de implementación OTel con .NET y Azure Monitor
Dejo un repositorio de ejemplo para implementar OTel con .NET y Azure Monitor. Este ejemplo no usa la figura del OTel Collector, sino que implementa un envío directo mediante un exporter dentro de la aplicación que envía directamente al backend OTel, en este caso Azure Monitor. Para implementar este envío directo se hace uso del paquete de Azure para .NET, Azure.Monitor.OpenTelemetry.Exporter.
En diagrama se puede explicar de la siguiente manera:

Este ejemplo cuenta con dos proyectos: dos APIs .NET. Una API hace la figura de API primaria, que luego invoca a la segunda API, esto con el objetivo de visualizar la trazabilidad en la invocación entre servicios. Cada API envía su telemetría a un Application Insights por aplicación; esto permite tener una separación de telemetría por aplicación, facilitando la observabilidad. Sin embargo, para centralizar la persistencia de la trazabilidad, ambos Application Insights apuntan a un mismo Log Analytics Workspace. Para fortalecer la seguridad y evitar que cualquier aplicación pueda hacer ingesta en el Log Analytics, se puede configurar un “Network Security Perimeter”.
Con todo esto se puede ver la telemetría y hacer seguimiento en Azure Monitor:

Repositorio ejemplo OTel - Dotnet - Azure Monitor
Sígueme en Linkedin para estar al tanto de mis publicaciones y novedades