Monitoreo de aplicaciones C#: métricas y alertas a nivel avanzado
\n\nEn el desarrollo moderno con C# (.NET), una aplicación simplemente "funcional" ha dejado de ser un criterio de calidad suficiente. Los sistemas de producción requieren una supervisión constante: es necesario saber cuánta memoria consume el servicio, qué tan rápido se procesan las solicitudes, si la cola en el broker de mensajes está creciendo. Sin un sistema de monitoreo y alertas, corres el riesgo de enterarte de un problema solo por los usuarios. En este artículo, analizaremos técnicas avanzadas de recopilación de métricas, su visualización y configuración de alertas para aplicaciones C#, utilizando herramientas modernas como Prometheus, Grafana y OpenTelemetry.
\n\n¿Por qué es necesario el monitoreo avanzado?
\nEl monitoreo básico (CPU, RAM, disco) no ofrece una imagen completa. Para las aplicaciones C#, las métricas específicas son críticas: cantidad de recolecciones de basura (GC), tiempo de bloqueo de subprocesos, tamaño del pool de conexiones a la base de datos. Las alertas sobre estas métricas permiten reaccionar antes de que ocurra una falla. El enfoque avanzado implica tres niveles:
\n- \n
- Infrastructure level — métricas estándar del servidor. \n
- Application level — métricas de la lógica de negocio (latencia, errores, frecuencia de llamadas). \n
- Business level — métricas relacionadas con el dominio (cantidad de pedidos, conversión). \n
Nos centraremos en el nivel de aplicación, que ofrece el mayor beneficio para los desarrolladores de C#.
\n\nRecopilación de métricas con OpenTelemetry y Prometheus
\nOpenTelemetry (OTel) es el estándar de facto para instrumentar aplicaciones .NET. Permite recopilar métricas, trazas y registros con una API unificada. Veamos un ejemplo de integración con Prometheus.
\n\nInstale los paquetes NuGet:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\n\nConfiguración en Program.cs:
using OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation()\n .AddRuntimeInstrumentation()\n .AddPrometheusExporter());\n\nvar app = builder.Build();\n\napp.MapPrometheusScrapingEndpoint(); // endpoint para Prometheus\n\napp.Run();\n\nAhora, en la dirección /metrics, su servicio entregará métricas en formato Prometheus. Entre ellas se incluyen la cantidad de solicitudes HTTP, su tiempo de procesamiento, métricas de GC y memoria.
Métricas personalizadas
\nPara métricas de negocio, use Meter y Counter:
using System.Diagnostics.Metrics;\n\npublic class OrderMetrics\n{\n private readonly Counter<int> _ordersCreated;\n\n public OrderMetrics(IMeterFactory meterFactory)\n {\n var meter = meterFactory.Create("MyApp.Orders");\n _ordersCreated = meter.CreateCounter<int>("orders.created.count");\n }\n\n public void OrderCreated() => _ordersCreated.Add(1);\n}\n\n// Registro en DI:\nbuilder.Services.AddSingleton<OrderMetrics>();\n\nEstas métricas llegarán automáticamente a Prometheus y estarán disponibles para construir paneles en Grafana.
\n\nConfiguración de alertas: de reglas simples a un sistema multinivel
\nLas métricas por sí solas son inútiles sin alertas. En Prometheus, las alertas se configuran a través de Alertmanager. Veamos un escenario avanzado: una alerta sobre un tiempo de respuesta anómalo de la API.
Regla en Prometheus (alert.rules.yml)
\ngroups:\n - name: csharp_app_alerts\n rules:\n - alert: HighRequestLatency\n expr: |\n histogram_quantile(0.95, \n rate(http_server_duration_seconds_bucket[5m])\n ) > 2\n for: 2m\n labels:\n severity: critical\n annotations:\n summary: "Alta latencia de solicitudes ({{ $value }}s)"\n descr