Con el lanzamiento de .NET 8, los desarrolladores se encuentran inmersos en un ecosistema tecnológico en constante evolución. Uno de los aspectos cruciales para mantener un sistema robusto y eficiente es la capacidad de monitorear y analizar su rendimiento. Es en este contexto donde OpenTelemetry emerge como una herramienta poderosa para la observabilidad de aplicaciones.

Bajo la anterior premisa, iniciaré una serie de entradas dónde hablaremos sobre el uso de Open Telemetry en .NET, el cual nos permitirá instrumentalizar nuestras aplicaciones para obtener información de diferentes categorías para diferentes objetivos.

¿Qué es Open Telemetry?

OpenTelemetry es un proyecto de código abierto que proporciona una serie de bibliotecas, agentes y especificaciones para la instrumentación y observabilidad de aplicaciones. Su objetivo es permitir a los desarrolladores recopilar datos de telemetría (trazas, métricas y registros) de manera consistente y uniforme, independientemente del lenguaje de programación o del entorno en el que se ejecuta la aplicación.

Este proyecto se originó como la unión de dos proyectos previos, OpenTracing y OpenCensus, para crear una solución unificada y más poderosa. Su adopción ha crecido rápidamente en la comunidad de desarrollo gracias a su flexibilidad y su capacidad para trabajar con diversos sistemas y tecnologías.

OpenTelemetry es un proyecto de la Cloud Native Computing Foundation (CNCF) y se está convirtiendo rápidamente en el estándar para la recopilación de datos de telemetría. En el caso de .NET, OpenTelemetry puede ser utilizado para diversas finalidades, entre las que se incluyen:

  1. Tracing distribuido: OpenTelemetry puede rastrear las solicitudes y respuestas a través de múltiples servicios y componentes de una aplicación distribuida en .NET. Proporciona información detallada sobre el tiempo de ejecución, las dependencias y el rendimiento de cada paso en el flujo de trabajo. Esto facilita el análisis y la resolución de problemas en entornos distribuidos y complejos.
  2. Métricas: OpenTelemetry permite recopilar métricas personalizadas sobre el rendimiento y el comportamiento de una aplicación .NET. Puede medir el uso de recursos, el tiempo de respuesta, las tasas de error y cualquier otra métrica relevante para el monitoreo y la optimización del rendimiento.
  3. Logging: OpenTelemetry puede integrarse con bibliotecas de registro existentes en .NET para capturar registros y eventos relevantes durante la ejecución de una aplicación. Esto proporciona una visibilidad adicional y ayuda a rastrear problemas y depurar errores.
  4. Instrumentación automática: OpenTelemetry facilita la instrumentación automática de aplicaciones .NET. Proporciona bibliotecas y agentes que se pueden utilizar para instrumentar automáticamente el código, lo que elimina la necesidad de agregar manualmente registros y puntos de instrumentación en todo el código.
  5. Observabilidad de microservicios: Si estás construyendo una arquitectura de microservicios en .NET, OpenTelemetry puede ser especialmente útil. Puedes utilizarlo para rastrear y recopilar métricas de cada microservicio, comprender las interacciones entre ellos y tener una visión completa del rendimiento y la salud de todo el sistema.

OpenTelemetry en .NET ofrece grandes ventajas, como:

  • Fácil integración: con su biblioteca, OpenTelemetry para .NET, es sencillo incorporar el seguimiento y la recopilación de métricas en sus aplicaciones .NET existentes.
  • Amplia compatibilidad: OpenTelemetry es compatible con .NET Core 2.1+, .NET Framework 4.6.1+ y .NET 5, lo que lo hace compatible con la mayoría de los proyectos .NET.
  • Independencia del proveedor: permite enviar datos a varios backends, como Jaeger, Zipkin o Prometheus, sin cambiar la implementación en el código.

.NET 8 y OpenTelemetry

.NET 8 presenta una integración más estrecha con OpenTelemetry, simplificando el proceso de instrumentación y facilitando a los desarrolladores la adopción de prácticas de observabilidad en sus aplicaciones.

Instrumentación básica

Con .NET 8, la instrumentación básica se realiza mediante la incorporación de las bibliotecas de OpenTelemetry a través de NuGet. Estas bibliotecas permiten la captura de trazas, métricas y registros sin necesidad de una configuración adicional, brindando una visión inicial del comportamiento de la aplicación.

// Instalación de paquetes NuGet
dotnet add package OpenTelemetry
dotnet add package OpenTelemetry.Api

NOTA: Las librerías OpenTelemetry y OpenTelemetry.Api permiten instrumentalizar un aplicativo pero no aborda características sobre cómo se exporta la telemetría a un backend de telemetría específico, cómo muestrear la telemetría, etc. La API consta de API de seguimiento, API de registro, API de métricas, API de contexto y propagación, y un conjunto de convenciones semánticas.

Integración con proveedores

OpenTelemetry es compatible con varios proveedores de servicios de observabilidad, como Jaeger, Zipkin y Prometheus. .NET 8 facilita la integración con estos proveedores mediante la configuración sencilla de sus respectivos paquetes NuGet.

A continuación, realizaremos una implementación con Jaeger

// Instalación de paquetes NuGet para Jaeger
dotnet add package OpenTelemetry.Exporter.Jaeger

Luego tenemos que inyectar mediante ID el servicio de Jaeger:

// Configuración de Jaeger en la aplicación
services.AddOpenTelemetryTracing(builder => builder
    .AddJaegerExporter()
    .AddAspNetCoreInstrumentation()
    .AddHttpClientInstrumentation()
    // Otras configuraciones
);

Personalización avanzada

Para aquellos desarrolladores que requieren una personalización más avanzada, .NET 8 permite la configuración detallada de OpenTelemetry a través de su API. Esto brinda control total sobre qué datos se recopilan, cómo se almacenan y a dónde se envían. Ejemplo:

// Configuración avanzada de OpenTelemetry
services.AddOpenTelemetryTracing(builder => builder
    .AddSource("MiApp.*")
    .SetSampler(new AlwaysOnSampler())
    .AddProcessorPipeline(pipeline => pipeline
        .AddProcessor(new MyCustomProcessor())
        .AddProcessor(new BatchExportProcessor<MyCustomExporter>())
    )
    // Otras configuraciones avanzadas
);

La integración de OpenTelemetry en .NET 8 proporciona a los desarrolladores una potente herramienta para la observabilidad de sus aplicaciones. Con una instrumentación sencilla, una variedad de proveedores compatibles y opciones avanzadas de personalización, OpenTelemetry se presenta como un aliado esencial para mejorar la calidad y el rendimiento de las aplicaciones en el ecosistema .NET. Con el tiempo, se espera que esta integración siga evolucionando, ofreciendo aún más funcionalidades para facilitar la vida de los desarrolladores y mejorar la experiencia de desarrollo en el mundo .NET.

Este artículo forma parte de una serie de artículos que estaré lanzando sobre .NET 8 y OpenTelemetry, no se los pierdan.

Por favor síguenos y dale me gusta: