Monitoreo de aplicaciones C# (.NET): desde métricas hasta alertas
Las aplicaciones .NET modernas requieren una supervisión constante del rendimiento, la disponibilidad y el estado de los procesos internos. En este artículo, exploraremos las herramientas clave para organizar el monitoreo: Prometheus para la recolección de métricas, OpenTelemetry para el trazado y Serilog para el registro estructurado. Aprenderá cómo implementar la observabilidad en su aplicación C#.
¿Por qué es necesario el monitoreo de aplicaciones .NET?
La falta de monitoreo convierte la depuración en una adivinanza. Sin métricas, no sabrá sobre el aumento del tiempo de respuesta; sin trazas, no encontrará el cuello de botella en la cadena de llamadas; sin registros, no entenderá la causa del error. Un monitoreo correctamente configurado permite:
- Detectar anomalías antes de que afecten a los usuarios.
- Analizar el rendimiento de componentes individuales (bases de datos, API, caché).
- Recolectar métricas de negocio (número de pedidos, sesiones activas).
- Automatizar las notificaciones de incidentes.
Herramientas para el monitoreo de .NET
Usaremos tres componentes principales:
- Prometheus — sistema de recolección y almacenamiento de métricas con un potente lenguaje de consultas PromQL.
- OpenTelemetry — estándar para la recolección de telemetría (trazas, métricas, registros).
- Serilog — biblioteca de registro estructurado para .NET.
Paso 1: Instalación y configuración de Prometheus con .NET
Para integrar Prometheus con C#, use el paquete prometheus-net. Instálelo a través de NuGet:
dotnet add package prometheus-netLuego, agregue el middleware en su Program.cs:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Habilitamos el endpoint /metrics para Prometheusapp.UseHttpMetrics();app.MapMetrics();
app.MapGet("/", () => "Hello World!");app.Run();Después de iniciar la aplicación, navegue a http://localhost:5000/metrics. Verá métricas estándar: http_requests_total, http_request_duration_seconds y otras.
Paso 2: Creación de métricas personalizadas
A menudo es necesario rastrear indicadores de negocio. Por ejemplo, la cantidad de pedidos procesados:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCounter = Metrics .CreateCounter("orders_processed_total", "Total number of processed orders");
public static void RecordOrder() { OrdersCounter.Inc(); }}
// Uso en el controlador[ApiController][Route("api/orders")]public class OrdersController : ControllerBase{ [HttpPost] public IActionResult CreateOrder() { // ... lógica de creación del pedido OrderMetrics.RecordOrder(); return Ok(); }}Ahora en /metrics aparecerá la línea orders_processed_total 1.
Paso 3: Trazado con OpenTelemetry
El trazado ayuda a entender cuánto tiempo toma cada etapa del procesamiento de una solicitud. Instale los paquetes:
dotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.ConsoleConfigure OpenTelemetry en Program.cs:
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddConsoleExporter());
var app = builder.Build();app.Run();Ahora cada solicitud HTTP creará automáticamente una traza con información sobre el tiempo de ejecución. Para export