Introducción: ¿por qué es necesario monitorear aplicaciones C#?
Las aplicaciones C# modernas en la plataforma .NET son sistemas distribuidos complejos que operan bajo altas cargas. Sin un monitoreo de calidad, corre el riesgo de pasar por alto la degradación del rendimiento, fugas de memoria o fallos críticos. El monitoreo no solo permite detectar problemas, sino también predecirlos, respondiendo oportunamente a las anomalías.
En este artículo, analizaremos cómo configurar la recopilación de métricas, el registro de logs y el sistema de alertas para aplicaciones C# (.NET) utilizando herramientas modernas: Prometheus, Grafana, Serilog y los Health Checks integrados. Obtendrá ejemplos de código listos para usar y recomendaciones prácticas.
Métricas principales para aplicaciones C# (.NET)
El monitoreo comienza con la definición de indicadores clave. Para aplicaciones .NET, se pueden dividir en tres categorías:
- Métricas de infraestructura — uso de CPU, memoria, disco, red.
- Métricas de aplicación — tiempo de respuesta de la API, cantidad de solicitudes, errores (4xx/5xx), tamaño de colas.
- Métricas específicas de .NET — tamaño del heap de GC, cantidad de hilos, tiempo de recolección de basura, cantidad de conexiones a la base de datos.
Recopilación de métricas con Prometheus y .NET
Para exportar métricas a Prometheus, use la librería prometheus-net. Instálela a través de NuGet:
dotnet add package prometheus-net.AspNetCoreAgregue el middleware en Program.cs:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Habilitamos métricas de Prometheusapp.UseHttpMetrics(); // HTTP metricsapp.UseMetricServer(); // /metrics endpoint
app.MapGet("/", () => "Hello World!");app.Run();Ahora, en la dirección /metrics, estarán disponibles las métricas estándar: cantidad de solicitudes, duración, errores. Agreguemos una métrica personalizada: un contador de visitas al endpoint:
using Prometheus;
var requestCounter = Metrics.CreateCounter( "myapp_requests_total", "Total requests to the endpoint");
app.MapGet("/api/data", () => { requestCounter.Inc(); return new { Message = "Data loaded" };});Health Checks: verificación básica del estado
El mecanismo integrado de Health Checks en .NET permite evaluar rápidamente la salud de la aplicación. Agregue una verificación de conexión a la base de datos:
using Microsoft.Extensions.Diagnostics.HealthChecks;
builder.Services.AddHealthChecks() .AddDbContextCheck<AppDbContext>() .AddUrlGroup(new Uri("https://external-api.com"), "External API");
app.MapHealthChecks("/health");Los Health Checks devuelven el estado Healthy, Degraded o Unhealthy — esto es una fuente ideal para alertas.
Registro de logs con Serilog: logs estructurados
Los logs son la fuente de datos más importante para el diagnóstico. Serilog permite enviar logs a Elasticsearch, Seq o simplemente a un archivo con formato estructurado.
Instalación:
dotnet add package Serilog.AspNetCoredotnet add package Serilog.Sinks.SeqConfiguración en Program.cs:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.Seq("http://localhost:5341") .Enrich.WithProperty("Application", "MyApp") .CreateLogger();
builder.Host.UseSerilog();Ahora todos los logs contendrán información contextual: RequestId, UserId, tiempo de ejecución. Ejemplo de registro de un error:
try { // código peligroso} catch (Exception ex) { Log.Error(ex, "Error al procesar el pedido {OrderId}", orderId);}Los logs estructurados son fáciles de analizar en Grafana o Kibana, construir