Monitoramento de aplicações C#: métricas e alertas em nível avançado
\n\nNo desenvolvimento moderno em C# (.NET), uma aplicação simplesmente "funcionando" deixou de ser um critério de qualidade suficiente. Sistemas de produção exigem monitoramento constante: é preciso saber quanta memória o serviço consome, quão rápido as requisições são processadas, se a fila no broker de mensagens não está crescendo. Sem um sistema de monitoramento e alertas, você corre o risco de saber do problema apenas pelos usuários. Neste artigo, abordaremos técnicas avançadas de coleta de métricas, sua visualização e configuração de alertas para aplicações C#, utilizando ferramentas modernas como Prometheus, Grafana e OpenTelemetry.
\n\nPor que o monitoramento avançado é necessário?
\nO monitoramento básico (CPU, RAM, disco) não fornece um quadro completo. Para aplicações C#, métricas específicas são críticas: número de coletas de lixo (GC), tempo de bloqueio de threads, tamanho do pool de conexões com o banco de dados. Alertas sobre essas métricas permitem reagir antes que ocorra uma falha. A abordagem avançada implica três níveis:
\n- \n
- Infrastructure level — métricas padrão do servidor. \n
- Application level — métricas da lógica de negócio (latências, erros, frequência de chamadas). \n
- Business level — métricas relacionadas ao domínio (número de pedidos, conversão). \n
Vamos nos concentrar no nível de aplicação, que oferece o maior benefício para desenvolvedores C#.
\n\nColeta de métricas com OpenTelemetry e Prometheus
\nOpenTelemetry (OTel) é o padrão de facto para instrumentar aplicações .NET. Ele permite coletar métricas, traces e logs com uma API unificada. Vejamos um exemplo de integração com o Prometheus.
\n\nInstale os pacotes NuGet:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\n\nConfiguração em Program.cs:
using OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation()\n .AddRuntimeInstrumentation()\n .AddPrometheusExporter());\n\nvar app = builder.Build();\n\napp.MapPrometheusScrapingEndpoint(); // endpoint para o Prometheus\n\napp.Run();\n\nAgora, no endereço /metrics, seu serviço fornecerá métricas no formato do Prometheus. Entre elas estão o número de requisições HTTP, o tempo de processamento, métricas de GC e memória.
Métricas personalizadas
\nPara métricas de negócio, use Meter e Counter:
using System.Diagnostics.Metrics;\n\npublic class OrderMetrics\n{\n private readonly Counter<int> _ordersCreated;\n\n public OrderMetrics(IMeterFactory meterFactory)\n {\n var meter = meterFactory.Create("MyApp.Orders");\n _ordersCreated = meter.CreateCounter<int>("orders.created.count");\n }\n\n public void OrderCreated() => _ordersCreated.Add(1);\n}\n\n// Registro no DI:\nbuilder.Services.AddSingleton<OrderMetrics>();\n\nEssas métricas serão automaticamente enviadas para o Prometheus e estarão disponíveis para a criação de dashboards no Grafana.
\n\nConfiguração de alertas: de regras simples a um sistema em vários níveis
\nAs métricas por si só são inúteis sem alertas. No Prometheus, os alertas são configurados através do Alertmanager. Vejamos um cenário avançado: um alerta para tempo de resposta anormal da API.
Regra no Prometheus (alert.rules.yml)
\ngroups:\n - name: csharp_app_alerts\n rules:\n - alert: HighRequestLatency\n expr: |\n histogram_quantile(0.95, \n rate(http_server_duration_seconds_bucket[5m])\n ) > 2\n for: 2m\n labels:\n severity: critical\n annotations:\n summary: "Alta latência de requisições ({{ $value }}s)"\n descr