Primeros pasos con OpenTelemetry en .NET

La telemetría y el monitoreo son dos técnicas importantes en el desarrollo de software para obtener más detalles sobre el flujo de trabajo y los recursos utilizados por la aplicación durante la ejecución.

Utilizando esta información podemos realizar las siguientes acciones:

  • Analizamos los problemas en producción en los que podría ser difícil depurar el código.
  • Obtenemos detalles sobre la interacción entre componentes.
  • Realizamos un seguimiento del tiempo de duración en los procesos para mejorar el rendimiento.
  • Identificamos problemas internos
  • Recopilamos información para analizar el comportamiento del usuario.

Hay muchas maneras de monitorear y guardar registro en aplicaciones .NET. podemos usar los siguientes espacios de nombres:

  • Diagnostics.Trace
  • Diagnostics.Debug
  • Diagnostics.EventSource
  • Diagnóstico.Actividad
  • Diagnostics.EventLog (solo para Windows)

Podemos potencializar y ampliar todas estas características utilizando librerías. En la siguiente lista podemos encontrar muchas opciones:

  • Serilog
  • Log4Net
  • Nlog
  • Elmah.io
  • Gelf4Net

Aunque todas estas herramientas son opciones muy buenas y válidas para muchos escenarios, debemos mencionar algunos desafíos o desventajas:

  • Compatibilidad con otras tecnologías (orientado a .NET)
  • Solo compatibilidad con Windows
  • Afectaciones de rendimiento
  • No hay estándar en los formatos (formato diferente en cada librería)

Aquí es donde OpenTelemetry nos ayuda a resolver estos desafíos.

OpenTelemetry

OpenTelemetry es un conjunto de herramientas para recopilar datos de telemetría para analizar el comportamiento y el rendimiento de nuestras aplicaciones. Admite logs, metrics y trace, lo que significa todas las actividades relacionadas con la observabilidad. OpenTelemetry es completamente de código abierto, gratuito y también un estándar en diferentes tecnologías.

Podemos encontrar más información en la página web oficial: https://opentelemetry.io/

Para empezar a usar OpenTelemetry necesitamos realizar los siguientes pasos:

1. Crear un proyecto de consola

dotnet new console

2. Agreguemos la última versión del paquete Microsoft.Extensions.Logging

dotnet add package Microsoft.Extensions.Logging

3. Agreguemos la librería de exportación OpenTelemetry

dotnet add package OpenTelemetry.Exporter.Console

4. Actualizamos el archivo Program.cs con el siguiente ejemplo con el que agregamos logging a esta app de consola:

using Microsoft.Extensions.Logging;
using OpenTelemetry.Logs;
using
var loggerFactory = LoggerFactory.Create(builder => {
    builder.AddOpenTelemetry(options => {
        options.AddConsoleExporter();
    });
});
var logger = loggerFactory.CreateLogger < Program > ();
logger.LogInformation("Hello from OpenTelemetry");

Para este ejemplo, obtendremos el siguiente resultado:

Ahora podemos ver otro ejemplo relacionado con las métricas. Las métricas se refieren a datos calculados que nos dan más detalles sobre el comportamiento del usuario.

// See https://aka.ms/new-console-template for more information
using Microsoft.Extensions.Logging;
using System.Diagnostics.Metrics;
using OpenTelemetry;
using OpenTelemetry.Metrics;

Meter MyMeter = new("ConsoleDemo.Metrics", "1.0");

Counter<long> RequestCounter = MyMeter.CreateCounter<long>("RequestCounter");

using var meterProvider = Sdk.CreateMeterProviderBuilder()
            .AddMeter("ConsoleDemo.Metrics")
            .AddConsoleExporter()
            .Build();

RequestCounter.Add(1, new KeyValuePair<string, object?>("POST Request", HttpMethod.Post));
RequestCounter.Add(1, new KeyValuePair<string, object?>("GET Request", HttpMethod.Get));
RequestCounter.Add(1, new KeyValuePair<string, object?>("GET Request", HttpMethod.Get));
RequestCounter.Add(1, new KeyValuePair<string, object?>("POST Request", HttpMethod.Post));
RequestCounter.Add(1, new KeyValuePair<string, object?>("PUT Request", HttpMethod.Put));

En el siguiente resultado podemos ver el número de solicitudes POST, GET y PUT

Trace es otra herramienta que podemos utilizar para obtener información sobre cómo interactúan los componentes y el rendimiento en algunos escenarios específicos. Podemos agregar etiquetas para incluir los valores utilizados en el proceso o flujo de trabajo.

using OpenTelemetry;
using OpenTelemetry.Trace;
using System.Diagnostics;
ActivitySource MyActivitySource = new("ConsoleDemo.Trace");
using
var tracerProvider = Sdk.CreateTracerProviderBuilder().AddSource("ConsoleDemo.Trace").AddConsoleExporter().Build();
using(var activity = MyActivitySource.StartActivity("ActivityStarted")) {
    int StartNumber = 10000;
    activity?.SetTag("StartNumber", StartNumber);
    for (int i = 0; i < StartNumber; i++) {
        DoProcess(i);
    }
    activity?.SetStatus(ActivityStatusCode.Ok);
}
void DoProcess(int currentNumber) {
    var doubleValue = currentNumber * 2;
}

Para este ejemplo, obtendremos el siguiente resultado:

Con estos ejemplos, tenemos una idea sobre cómo empezar con OpenTelemetry en .NET. Puedes acceder al repositorio a través del siguiente enlace:

GitHub – Mteheran/OpenTelemetrydotnet: OpenTelemtry with .NET demo microservices

Referencia: Getting Started With OpenTelemetry (c-sharpcorner.com)

Continua aprendiendo sobre esta librerías y otras en .NET en el siguiente curso en Udemy:

https://www.udemy.com/course/librerias-en-net-humanizer-xunit-serilog-y-mas