Introducción: Por qué el monitoreo de aplicaciones C# es un arte
En el desarrollo moderno de C# (.NET), el monitoreo ha dejado de ser solo una opción. Es un elemento obligatorio en entornos de producción que permite no solo registrar fallos, sino también predecirlos. A nivel avanzado, el monitoreo se convierte en un sistema de alerta temprana: no solo miras los paneles, sino que configuras alertas basadas en métricas complejas.
En este artículo analizaremos cómo ir más allá de los contadores estándar de CPU y memoria. Aprenderás a recopilar métricas de negocio personalizadas, configurar alertas con Prometheus y Alertmanager, y utilizar OpenTelemetry para trazabilidad. Todos los ejemplos serán en C#.
1. Instrumentación avanzada: App Metrics y Prometheus
1.1. Conexión de Prometheus a ASP.NET Core
El monitoreo básico en .NET a menudo se limita al PerformanceCounter integrado. Sin embargo, para arquitecturas de microservicios, el estándar es Prometheus. Instala el paquete:
dotnet add package prometheus-net.AspNetCoreLuego agrega el middleware en Program.cs:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Habilitamos el endpoint de métricasapp.UseHttpMetrics();app.UseRouting();app.MapMetrics(); // /metrics
app.Run();Esto te dará métricas básicas: cantidad de solicitudes, duración, errores. Pero para un nivel avanzado, esto no es suficiente.
1.2. Métricas de negocio personalizadas
Supongamos que quieres rastrear la cantidad de pedidos creados o el tiempo de ejecución de una operación crítica de negocio. Usa Counter y Histogram:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCreated = Metrics .CreateCounter("orders_created_total", "Total number of created orders");
private static readonly Histogram OrderProcessingTime = Metrics .CreateHistogram("order_processing_seconds", "Histogram of order processing time");
public void RecordOrderCreation(double elapsedSeconds) { OrdersCreated.Inc(); OrderProcessingTime.Observe(elapsedSeconds); }}Ahora, en cualquier servicio puedes inyectar OrderMetrics y registrar datos. Esto te permitirá construir paneles en Grafana con precisión de segundos.
2. Alertas: de disparadores simples a reglas orientadas a SLO
2.1. Configuración de Alertmanager para métricas C#
Recopilar métricas es la mitad del trabajo. La otra mitad son las alertas. Crea una regla para Prometheus (alerts.yml):
groups: - name: csharp_app_alerts rules: - alert: HighErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "High error rate in C# app" description: "Error rate is {{ $value }} for the last 5 minutes"Este es un ejemplo básico. A nivel avanzado, vale la pena agregar alertas SLO. Por ejemplo, si el 99% de las solicitudes no se completan en 200 ms, es motivo de pánico.
2.2. Alertas basadas en métricas de negocio
Usa los contadores personalizados de la sección anterior. Si la cantidad de pedidos cae drásticamente, significa que algo se rompió:
- alert: OrdersStopped expr: rate(orders_created_total[10m]) == 0 for: 5m labels: severity: warning annotations: summary: "No orders created in last 10 minutes"Esta alerta no se puede obtener con métricas estándar del sistema operativo; requiere un profundo conocimiento de la lógica de negocio.
3. OpenTelemetry: trazabilidad distribuida en C#
3.1. Integración del SDK de OpenTelemetry
Cuando tienes 10 microservicios en C#, las métricas individuales no ayudan. Se necesita trazabilidad. Inst