Introducción: Por qué el monitoreo es crítico para aplicaciones C#
\n\nEn el desarrollo de software moderno, escribir código es solo la mitad del trabajo. Para que una aplicación funcione de manera estable, rápida y predecible, es necesario un monitoreo constante. Para las aplicaciones C# (.NET), que a menudo se utilizan en sistemas empresariales de alta carga, el sector bancario, el comercio electrónico y los servicios en la nube, el monitoreo se convierte no solo en una opción, sino en un requisito obligatorio.
\n\nSin monitoreo, trabajas a ciegas: las fugas de memoria pasan desapercibidas hasta que el servidor se cae, las solicitudes lentas se acumulan y los usuarios se van a la competencia. En este artículo, analizaremos el ciclo completo de configuración de la observabilidad para aplicaciones C#: desde la recolección de métricas básicas hasta la configuración de alertas inteligentes en tiempo real.
\n\n1. Fundamentos del monitoreo: qué métricas recopilar en .NET
\n\nAntes de configurar las herramientas, es importante entender qué métricas son realmente importantes para las aplicaciones C#. Las dividiremos en tres grupos:
\n\n1.1. Métricas del sistema (nivel de infraestructura)
\n- \n
- CPU y Memoria — carga del procesador y consumo de RAM del proceso dotnet. \n
- GC (Garbage Collection) — frecuencia y duración de las recolecciones de basura, tamaño de los montones (Gen0, Gen1, Gen2, LOH). \n
- Thread Pool — cantidad de hilos activos, libres y en espera. \n
- Disk I/O y Red — lectura/escritura en disco, conexiones de red. \n
1.2. Métricas de negocio (nivel de aplicación)
\n- \n
- Request Rate — cantidad de solicitudes por segundo (RPS). \n
- Latencia — tiempo de respuesta (percentiles p50, p95, p99). \n
- Tasa de Error — porcentaje de errores 4xx y 5xx. \n
- Usuarios Activos — cantidad de usuarios trabajando simultáneamente. \n
1.3. Métricas de .NET Runtime
\n- \n
- Compilación JIT — tiempo de compilación de métodos. \n
- Carga de Ensamblados — cantidad de ensamblados cargados. \n
- Excepciones — cantidad de excepciones lanzadas por segundo. \n
Para recopilar estas métricas en .NET se utiliza una herramienta potente: System.Diagnostics.Metrics (API integrada desde .NET 6+) y la biblioteca OpenTelemetry.
\n\n2. Configuración de la recolección de métricas con OpenTelemetry y Prometheus
\n\nLa mejor manera de organizar el monitoreo de una aplicación C# es usar la combinación OpenTelemetry (recolección de métricas) + Prometheus (almacenamiento) + Grafana (visualización). Veamos la configuración paso a paso.
\n\n2.1. Instalación de paquetes NuGet
\nAgregue los siguientes paquetes al proyecto:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.Runtime\n\n2.2. Configuración en Program.cs
\nConfigure OpenTelemetry para la recolección automática de métricas de ASP.NET Core y .NET Runtime:
\nusing OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation() // métricas de solicitudes HTTP\n .AddRuntimeInstrumentation() // métricas de GC, JIT, ThreadPool\n .AddPrometheusExporter()); // exportación a Prometheus\n\nvar app = builder.Build();\n\napp.UseOpenTelemetryPrometheusScrapingEndpoint(); // endpoint /metrics\n\napp.Run();\n\nAhora, en la dirección http://localhost:5000/metrics estará disponible un endpoint con métricas en formato Prometheus.
2.3. Creación de métricas personalizadas
\nAgreguemos una métrica de negocio: un contador de pedidos procesados:
\npublic class OrderMetrics\