Métricas Prometheus em C# (.NET): guia completo de integração
Prometheus é um sistema de monitoramento de código aberto que coleta e armazena métricas na forma de séries temporais. Para desenvolvedores em C# (.NET), a integração com Prometheus abre a possibilidade de acompanhar o desempenho das aplicações, indicadores de negócio e o estado do sistema em tempo real. Neste artigo, vamos abordar como conectar o Prometheus a uma aplicação .NET, quais bibliotecas usar e como configurar métricas corretamente.
Por que usar métricas Prometheus no .NET?
O monitoramento com Prometheus permite:
- Acompanhar o número de requisições, erros e tempo de resposta.
- Coletar métricas de desempenho (CPU, memória, GC).
- Criar métricas de negócio personalizadas (usuários ativos, pedidos).
- Integrar com Grafana para visualização de dashboards.
- Configurar alertas com base em valores limite.
Biblioteca prometheus-net
A principal biblioteca para trabalhar com Prometheus no .NET é prometheus-net. Ela suporta ASP.NET Core, .NET Core, .NET Framework e gRPC. Instalação via NuGet:
dotnet add package prometheus-netPara ASP.NET Core, instale adicionalmente:
dotnet add package prometheus-net.AspNetCoreTipos de métricas no Prometheus
A biblioteca suporta todos os tipos padrão de métricas:
- Counter — contador que apenas aumenta (número de requisições).
- Gauge — valor que pode aumentar e diminuir (temperatura atual).
- Histogram — histograma para medir a distribuição de valores (tempo de resposta).
- Summary — quantis para agregação de dados (p95, p99).
Exemplo: Counter básico
Vamos criar uma métrica que conta o número de requisições a um 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(); }}No controller ASP.NET Core, a chamada ficará assim:
[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" } }); }}Exemplo: Gauge para usuários ativos
private static readonly Gauge ActiveUsers = Metrics .CreateGauge("app_active_users", "Number of active users");
public void UserLoggedIn() => ActiveUsers.Inc();public void UserLoggedOut() => ActiveUsers.Dec();Exemplo: Histogram para tempo de resposta
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 até ~1s });
public void RecordRequestDuration(double seconds){ RequestDuration.Observe(seconds);}Exportação de métricas no ASP.NET Core
Para que o Prometheus possa coletar métricas, é necessário adicionar o endpoint /metrics. No Program.cs:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);builder.Services.AddCont Também na biblioteca
Internacionalização (i18n) em C++: guia completo
Chalk para JavaScript (Node.js): guia completo com exemplos
Processamento de imagens em C#: redimensionar e cortar com a biblioteca ImageSharp
Guia completo de gRPC Java: exemplos práticos e instalação
Filas de Tarefas em Go: Visão Geral das Bibliotecas async, gocelery e machinery