Monitoreo de aplicaciones C#: métricas y alertas de nivel avanzado

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Monitoreo de aplicaciones C#: métricas y alertas a nivel avanzado

\n\n

En 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?

\n

El 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
\n

Nos centraremos en el nivel de aplicación, que ofrece el mayor beneficio para los desarrolladores de C#.

\n\n

Recopilación de métricas con OpenTelemetry y Prometheus

\n

OpenTelemetry (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\n

Instale los paquetes NuGet:

\n
dotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore
\n\n

Configuración en Program.cs:

\n
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\n

Ahora, 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.

\n\n

Métricas personalizadas

\n

Para métricas de negocio, use Meter y Counter:

\n
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\n

Estas métricas llegarán automáticamente a Prometheus y estarán disponibles para construir paneles en Grafana.

\n\n

Configuración de alertas: de reglas simples a un sistema multinivel

\n

Las 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.

\n\n

Regla en Prometheus (alert.rules.yml)

\n
groups:\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                

Blogs

Book Recommendations