Biblioteca AppMetrics para monitoramento de aplicações C# (.NET)
No desenvolvimento de aplicações .NET modernas, é fundamental monitorar seu estado, desempenho e identificar gargalos. A biblioteca AppMetrics é uma ferramenta poderosa e flexível para coletar, agregar e exportar métricas em tempo real. Ela permite que desenvolvedores e administradores obtenham uma visão completa do funcionamento do serviço: desde o tempo de execução das requisições até a taxa de erros.
O AppMetrics suporta diversos backends para armazenamento de métricas: Prometheus, InfluxDB, Graphite, Elasticsearch e outros. Graças aos Health Checks integrados, você pode não apenas coletar estatísticas, mas também verificar a disponibilidade de dependências (bancos de dados, APIs externas).
Principais funcionalidades
- Contadores (Counters) — número de requisições, erros, eventos.
- Histogramas (Histograms) — distribuição do tempo de execução das operações.
- Temporizadores (Timers) — medição da duração da execução do código.
- Medidores (Meters) — taxa de eventos por segundo.
- Health Checks — verificação da disponibilidade de serviços externos.
- Exportação de métricas — para Prometheus (formato /metrics), InfluxDB e outros.
Instalação e configuração
Instale o pacote via NuGet:
dotnet add package AppMetrics.AspNetCore.Mvcdotnet add package AppMetrics.Reporting.Prometheus.ClientEm seguida, adicione os serviços no Program.cs (ou Startup.cs):
using App.Metrics;using App.Metrics.AspNetCore;using App.Metrics.Formatters.Prometheus;
var builder = WebApplication.CreateBuilder(args);
// Configuração das métricasvar metrics = AppMetrics.CreateDefaultBuilder() .OutputMetrics.AsPrometheusPlainText() .Build();
builder.Services.AddMetrics(metrics);builder.Services.AddMetricsTrackingMiddleware();builder.Services.AddMetricsEndpoints();
var app = builder.Build();
app.UseMetricsAllMiddleware();app.UseMetricsAllEndpoints();
app.MapGet("/", () => "Hello World!");
app.Run();Após iniciar a aplicação, as métricas estarão disponíveis no endereço /metrics no formato Prometheus.
Criação de métricas personalizadas
Defina uma classe para armazenar as métricas:
public class MyMetrics{ private readonly IMetrics _metrics;
public MyMetrics(IMetrics metrics) { _metrics = metrics; }
// Contador de requisições private readonly CounterOptions _requestCounter = new CounterOptions { Name = "myapp_requests_total", MeasurementUnit = Unit.Requests };
// Temporizador para medir o tempo de execução private readonly TimerOptions _requestTimer = new TimerOptions { Name = "myapp_request_duration_seconds", MeasurementUnit = Unit.Requests, DurationUnit = TimeUnit.Seconds };
public void TrackRequest() { _metrics.Measure.Counter.Increment(_requestCounter); }
public IDisposable MeasureRequestDuration() { return _metrics.Measure.Timer.Time(_requestTimer); }}Utilize as métricas nos controladores:
[ApiController][Route("api/[controller]")]public class SampleController : ControllerBase{ private readonly MyMetrics _myMetrics;
public SampleController(MyMetrics myMetrics) { _myMetrics = myMetrics; }
[HttpGet] public IActionResult Get() { _myMetrics.TrackRequest();
using (_myMetrics.MeasureRequestDuration()) { // Simulação de trabalho Thread.Sleep(100); }
return Ok("Metrics tracked"); }}