Métricas de Prometheus en C# (.NET): guía completa de integración
Prometheus es un sistema de monitoreo de código abierto que recopila y almacena métricas en forma de series temporales. Para desarrolladores de C# (.NET), la integración con Prometheus abre la posibilidad de rastrear el rendimiento de las aplicaciones, indicadores comerciales y el estado del sistema en tiempo real. En este artículo, analizaremos cómo conectar Prometheus a una aplicación .NET, qué librerías usar y cómo configurar correctamente las métricas.
¿Por qué son necesarias las métricas de Prometheus en .NET?
El monitoreo con Prometheus permite:
- Rastrear la cantidad de solicitudes, errores y tiempo de respuesta.
- Recopilar métricas de rendimiento (CPU, memoria, GC).
- Crear métricas de negocio personalizadas (usuarios activos, pedidos).
- Integrarse con Grafana para visualizar paneles.
- Configurar alertas basadas en valores umbral.
Librería prometheus-net
La librería principal para trabajar con Prometheus en .NET es prometheus-net. Soporta ASP.NET Core, .NET Core, .NET Framework y gRPC. Instalación a través de NuGet:
dotnet add package prometheus-netPara ASP.NET Core, instale adicionalmente:
dotnet add package prometheus-net.AspNetCoreTipos de métricas en Prometheus
La librería soporta todos los tipos estándar de métricas:
- Counter — contador que solo aumenta (número de solicitudes).
- Gauge — valor que puede aumentar y disminuir (temperatura actual).
- Histogram — histograma para medir la distribución de valores (tiempo de respuesta).
- Summary — cuantiles para agregar datos (p95, p99).
Ejemplo: Counter básico
Creemos una métrica que cuente el número de solicitudes a un endpoint:
using Prometheus;
public class MetricsService{ private static readonly Counter RequestCount = Metrics .CreateCounter("app_requests_total", "Total number of requests", new CounterConfiguration { LabelNames = new[] { "method", "endpoint" } });
public void RecordRequest(string method, string endpoint) { RequestCount.WithLabels(method, endpoint).Inc(); }}En el controlador de ASP.NET Core, la llamada se verá así:
[ApiController][Route("api/order")]public class OrderController : ControllerBase{ private readonly MetricsService _metrics;
public OrderController(MetricsService metrics) => _metrics = metrics;
[HttpGet] public IActionResult GetOrders() { _metrics.RecordRequest("GET", "/api/order"); return Ok(new { orders = new[] { "order1", "order2" } }); }}Ejemplo: Gauge para usuarios activos
private static readonly Gauge ActiveUsers = Metrics .CreateGauge("app_active_users", "Number of active users");
public void UserLoggedIn() => ActiveUsers.Inc();public void UserLoggedOut() => ActiveUsers.Dec();Ejemplo: Histogram para tiempo de respuesta
private static readonly Histogram RequestDuration = Metrics .CreateHistogram("app_request_duration_seconds", "Request duration in seconds", new HistogramConfiguration { Buckets = Histogram.ExponentialBuckets(0.001, 2, 10) // de 1ms a ~1s });
public void RecordRequestDuration(double seconds){ RequestDuration.Observe(seconds);}Exportación de métricas en ASP.NET Core
Para que Prometheus pueda recopilar métricas, es necesario agregar un endpoint /metrics. En Program.cs:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);builder.Services.AddCont También en la biblioteca
iTextSharp para C# (.NET): guía completa con ejemplos
Limitación de Tasa en C# (.NET): guía de la biblioteca System.Threading.RateLimiting
yaml-cpp para C++: guía completa con ejemplos prácticos
Análisis de HTML en C# (.NET): revisión de bibliotecas y ejemplos de código