Monitoramento de aplicações C# (.NET): das métricas aos alertas
As aplicações .NET modernas exigem monitoramento constante de desempenho, disponibilidade e estado dos processos internos. Neste artigo, abordaremos as principais ferramentas para organizar o monitoramento: Prometheus para coleta de métricas, OpenTelemetry para rastreamento e Serilog para registro estruturado de logs. Você aprenderá como implementar observabilidade em sua aplicação C#.
Por que o monitoramento de aplicações .NET é necessário?
A falta de monitoramento transforma a depuração em um jogo de adivinhação. Sem métricas, você não saberá sobre o aumento no tempo de resposta; sem rastreamentos, não encontrará o gargalo na cadeia de chamadas; sem logs, não entenderá a causa do erro. Um monitoramento configurado corretamente permite:
- Detectar anomalias antes que elas afetem os usuários.
- Analisar o desempenho de componentes individuais (banco de dados, API, cache).
- Coletar métricas de negócios (número de pedidos, sessões ativas).
- Automatizar notificações sobre incidentes.
Ferramentas para monitoramento .NET
Usaremos três componentes principais:
- Prometheus — sistema de coleta e armazenamento de métricas com a poderosa linguagem de consulta PromQL.
- OpenTelemetry — padrão para coleta de telemetria (rastreamentos, métricas, logs).
- Serilog — biblioteca de registro estruturado de logs para .NET.
Passo 1: Instalação e configuração do Prometheus com .NET
Para integrar o Prometheus com C#, use o pacote prometheus-net. Instale-o via NuGet:
dotnet add package prometheus-netEm seguida, adicione o middleware ao seu Program.cs:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Habilita o endpoint /metrics para o Prometheusapp.UseHttpMetrics();app.MapMetrics();
app.MapGet("/", () => "Hello World!");app.Run();Após iniciar a aplicação, acesse http://localhost:5000/metrics. Você verá métricas padrão: http_requests_total, http_request_duration_seconds e outras.
Passo 2: Criação de métricas personalizadas
Frequentemente, é necessário monitorar indicadores de negócios. Por exemplo, o número de pedidos processados:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCounter = Metrics .CreateCounter("orders_processed_total", "Total number of processed orders");
public static void RecordOrder() { OrdersCounter.Inc(); }}
// Uso no controller[ApiController][Route("api/orders")]public class OrdersController : ControllerBase{ [HttpPost] public IActionResult CreateOrder() { // ... lógica de criação do pedido OrderMetrics.RecordOrder(); return Ok(); }}Agora, em /metrics, aparecerá a linha orders_processed_total 1.
Passo 3: Rastreamento com OpenTelemetry
O rastreamento ajuda a entender quanto tempo cada etapa do processamento da requisição leva. Instale os pacotes:
dotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.ConsoleConfigure o OpenTelemetry no Program.cs:
using OpenTelemetry.Trace;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddConsoleExporter());
var app = builder.Build();app.Run();Agora, cada requisição HTTP criará automaticamente um rastreamento com informações sobre o tempo de execução. Para export