Monitoreo de aplicaciones C# (.NET): Guía completa de OpenTelemetry y Prometheus
Las aplicaciones .NET modernas requieren una supervisión constante del rendimiento, errores y estado. Sin monitoreo, corres el riesgo de perder el control sobre la producción. En este artículo, analizaremos cómo configurar un monitoreo eficaz de aplicaciones C# (.NET) utilizando la combinación de OpenTelemetry (recolección de telemetría) y Prometheus + Grafana (visualización y alertas).
¿Por qué OpenTelemetry?
OpenTelemetry (OTel) es el estándar de la industria para la recolección de métricas, trazas (trazabilidad) y logs. Para .NET, proporciona SDK oficiales e instrumentación automática de bibliotecas populares (ASP.NET Core, gRPC, Entity Framework).
Instalación y configuración de OpenTelemetry en un proyecto C#
Agregue los paquetes NuGet a su proyecto:
dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoreConfiguración básica en Program.cs
Configure la recolección de métricas y la exportación a Prometheus:
using OpenTelemetry.Metrics;using OpenTelemetry.Resources;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddService("MyApp", serviceVersion: "1.0.0")) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddPrometheusExporter());
var app = builder.Build();
// Endpoint para Prometheus (por defecto /metrics)app.MapPrometheusScrapingEndpoint();
app.Run();Creación de métricas personalizadas
Puede agregar sus propios contadores, histogramas y medidores:
using System.Diagnostics.Metrics;
public class OrderMetrics{ private readonly Counter<int> _ordersCreated; private readonly Histogram<double> _orderProcessingTime;
public OrderMetrics(IMeterFactory meterFactory) { var meter = meterFactory.Create("MyApp.Orders"); _ordersCreated = meter.CreateCounter<int>("orders.created", description: "Cantidad de pedidos creados"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }
public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}Trazado de solicitudes (Distributed Tracing)
Para rastrear cadenas de llamadas, agregue trazabilidad:
using OpenTelemetry.Trace;
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // Para depuración, en producción — Jaeger o ZipkinRegistro de logs a través de OpenTelemetry
Conecte el registrador a OTel:
using OpenTelemetry.Logs;
builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));Configuración de Prometheus para la recolección de métricas
En el archivo prometheus.yml, especifique su endpoint:
scrape_configs: - job_name: 'dotnet-app' scrape_interval: 5s static_configs: - targets: ['localhost:5000'] # Puerto de su aplicaciónVisualización en Grafana
Después de conectar Prometheus a Grafana, cree un panel con las métricas clave:
- http_server_duration_ms — tiempo de respuesta del servidor
- http_server_request_count — número de solicitudes
- orders_created_total — total de pedidos creados
Con esta configuración, obtendrá visibilidad completa de su aplicación .NET. OpenTelemetry unifica la recolección de datos, Prometheus almacena las métricas y Grafana las visualiza. ¡Comience a monitorear hoy mismo!