Introdução: Por que o monitoramento é crítico para aplicações C#
\n\nNo desenvolvimento moderno de software, escrever código é apenas metade do trabalho. Para que uma aplicação funcione de forma estável, rápida e previsível, é necessário um monitoramento constante. Para aplicações C# (.NET), frequentemente usadas em sistemas corporativos de alta carga, setor bancário, e-commerce e serviços em nuvem, o monitoramento se torna não apenas uma opção, mas um requisito obrigatório.
\n\nSem monitoramento, você trabalha no escuro: vazamentos de memória passam despercebidos até a queda do servidor, requisições lentas se acumulam e os usuários migram para a concorrência. Neste artigo, abordaremos o ciclo completo de configuração de observabilidade para aplicações C#: desde a coleta de métricas básicas até a configuração de alertas inteligentes em tempo real.
\n\n1. Fundamentos do monitoramento: quais métricas coletar no .NET
\n\nAntes de configurar as ferramentas, é importante entender quais métricas são realmente importantes para aplicações C#. Vamos dividi-las em três grupos:
\n\n1.1. Métricas do sistema (nível de infraestrutura)
\n- \n
- CPU e Memória — carga da CPU e consumo de RAM pelo processo dotnet. \n
- GC (Garbage Collection) — frequência e duração das coletas de lixo, tamanho dos heaps (Gen0, Gen1, Gen2, LOH). \n
- Thread Pool — número de threads ativas, livres e em espera. \n
- Disk I/O e Rede — leitura/gravação em disco, conexões de rede. \n
1.2. Métricas de negócio (nível de aplicação)
\n- \n
- Request Rate — número de requisições por segundo (RPS). \n
- Latência — tempo de resposta (percentis p50, p95, p99). \n
- Taxa de Erro — porcentagem de erros 4xx e 5xx. \n
- Usuários Ativos — número de usuários simultâneos. \n
1.3. Métricas do .NET Runtime
\n- \n
- Compilação JIT — tempo de compilação dos métodos. \n
- Carregamento de Assemblies — número de assemblies carregados. \n
- Exceções — número de exceções lançadas por segundo. \n
Para coletar essas métricas no .NET, utiliza-se uma ferramenta poderosa: System.Diagnostics.Metrics (API nativa desde .NET 6+) e a biblioteca OpenTelemetry.
\n\n2. Configuração da coleta de métricas com OpenTelemetry e Prometheus
\n\nA melhor forma de organizar o monitoramento de uma aplicação C# é usar a combinação OpenTelemetry (coleta de métricas) + Prometheus (armazenamento) + Grafana (visualização). Vamos ver a configuração passo a passo.
\n\n2.1. Instalação dos pacotes NuGet
\nAdicione os seguintes pacotes ao projeto:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.Runtime\n\n2.2. Configuração no Program.cs
\nConfigure o OpenTelemetry para coleta automática de métricas do ASP.NET Core e do .NET Runtime:
\nusing OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation() // métricas de requisições HTTP\n .AddRuntimeInstrumentation() // métricas de GC, JIT, ThreadPool\n .AddPrometheusExporter()); // exportação para Prometheus\n\nvar app = builder.Build();\n\napp.UseOpenTelemetryPrometheusScrapingEndpoint(); // endpoint /metrics\n\napp.Run();\n\nAgora, no endereço http://localhost:5000/metrics, estará disponível um endpoint com métricas no formato Prometheus.
2.3. Criando métricas personalizadas
\nVamos adicionar uma métrica de negócio — um contador de pedidos processados:
\npublic class OrderMetrics\