Introdução: Por que monitorar aplicações C# é uma arte
No desenvolvimento moderno de C# (.NET), o monitoramento deixou de ser apenas uma opção. É um elemento obrigatório em ambientes de produção, que permite não apenas registrar falhas, mas também prevê-las. Em um nível avançado, o monitoramento se transforma em um sistema de alerta precoce: você não apenas observa dashboards, mas configura alertas com base em métricas complexas.
Neste artigo, vamos explorar como ir além dos contadores padrão de CPU e memória. Você aprenderá a coletar métricas de negócio personalizadas, configurar alertas com Prometheus e Alertmanager, e usar OpenTelemetry para rastreamento. Todos os exemplos serão em C#.
1. Instrumentação avançada: App Metrics e Prometheus
1.1. Conectando Prometheus ao ASP.NET Core
O monitoramento básico no .NET geralmente se limita ao PerformanceCounter embutido. No entanto, para arquiteturas de microsserviços, o padrão é o Prometheus. Instale o pacote:
dotnet add package prometheus-net.AspNetCoreEm seguida, adicione o middleware no Program.cs:
using Prometheus;
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Habilita o endpoint de métricasapp.UseHttpMetrics();app.UseRouting();app.MapMetrics(); // /metrics
app.Run();Isso fornecerá métricas básicas: número de requisições, duração, erros. Mas para um nível avançado, isso não é suficiente.
1.2. Métricas de negócio personalizadas
Suponha que você queira monitorar o número de pedidos criados ou o tempo de execução de uma operação crítica de negócio. Use Counter e Histogram:
using Prometheus;
public class OrderMetrics{ private static readonly Counter OrdersCreated = Metrics .CreateCounter("orders_created_total", "Total number of created orders");
private static readonly Histogram OrderProcessingTime = Metrics .CreateHistogram("order_processing_seconds", "Histogram of order processing time");
public void RecordOrderCreation(double elapsedSeconds) { OrdersCreated.Inc(); OrderProcessingTime.Observe(elapsedSeconds); }}Agora, em qualquer serviço, você pode injetar OrderMetrics e registrar os dados. Isso permitirá criar dashboards no Grafana com precisão de segundos.
2. Alertas: de gatilhos simples a regras orientadas por SLO
2.1. Configurando Alertmanager para métricas C#
Coletar métricas é metade do trabalho. A outra metade são os alertas. Crie uma regra para o Prometheus (alerts.yml):
groups: - name: csharp_app_alerts rules: - alert: HighErrorRate expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05 for: 2m labels: severity: critical annotations: summary: "High error rate in C# app" description: "Error rate is {{ $value }} for the last 5 minutes"Este é um exemplo básico. Em nível avançado, vale a pena adicionar alertas SLO. Por exemplo, se 99% das requisições não forem concluídas em 200 ms — é motivo para pânico.
2.2. Alertas baseados em métricas de negócio
Use os contadores personalizados da seção anterior. Se o número de pedidos cair drasticamente — algo está quebrado:
- alert: OrdersStopped expr: rate(orders_created_total[10m]) == 0 for: 5m labels: severity: warning annotations: summary: "No orders created in last 10 minutes"Esse alerta não pode ser obtido a partir de métricas padrão do sistema operacional — ele exige um profundo entendimento da lógica de negócio.
3. OpenTelemetry: rastreamento distribuído em C#
3.1. Integração do OpenTelemetry SDK
Quando você tem 10 microsserviços em C#, métricas individuais não ajudam. É necessário rastreamento. Inst