Introdução: por que monitorar aplicações C#
Aplicações C# modernas na plataforma .NET são sistemas distribuídos complexos operando sob alta carga. Sem um monitoramento de qualidade, você corre o risco de perder degradação de desempenho, vazamentos de memória ou falhas críticas. O monitoramento permite não apenas detectar problemas, mas também prevê-los, respondendo prontamente a anomalias.
Neste artigo, vamos abordar como configurar a coleta de métricas, logging e sistema de alertas para aplicações C# (.NET) usando ferramentas modernas: Prometheus, Grafana, Serilog e Health Checks integrados. Você obterá exemplos de código prontos e recomendações práticas.
Métricas principais para aplicações C# (.NET)
O monitoramento começa com a definição dos indicadores-chave. Para aplicações .NET, eles podem ser divididos em três categorias:
- Métricas de infraestrutura — uso de CPU, memória, disco, rede.
- Métricas de aplicação — tempo de resposta da API, número de requisições, erros (4xx/5xx), tamanho de filas.
- Métricas específicas do .NET — tamanho do heap GC, número de threads, tempo de coleta de lixo, número de conexões com o banco de dados.
Coleta de métricas com Prometheus e .NET
Para exportar métricas para o Prometheus, use a biblioteca prometheus-net. Instale-a via NuGet:
dotnet add package prometheus-net.AspNetCoreAdicione o middleware no Program.cs:
var builder = WebApplication.CreateBuilder(args);var app = builder.Build();
// Habilita métricas do Prometheusapp.UseHttpMetrics(); // Métricas HTTPapp.UseMetricServer(); // Endpoint /metrics
app.MapGet("/", () => "Hello World!");app.Run();Agora, no endereço /metrics, estarão disponíveis métricas padrão: número de requisições, duração, erros. Vamos adicionar uma métrica personalizada — um contador de acessos ao endpoint:
using Prometheus;
var requestCounter = Metrics.CreateCounter( "myapp_requests_total", "Total requests to the endpoint");
app.MapGet("/api/data", () => { requestCounter.Inc(); return new { Message = "Data loaded" };});Health Checks: verificação básica de estado
O mecanismo integrado de Health Checks no .NET permite avaliar rapidamente a saúde da aplicação. Adicione uma verificação de conexão com o banco de dados:
using Microsoft.Extensions.Diagnostics.HealthChecks;
builder.Services.AddHealthChecks() .AddDbContextCheck<AppDbContext>() .AddUrlGroup(new Uri("https://external-api.com"), "External API");
app.MapHealthChecks("/health");Os Health Checks retornam o status Healthy, Degraded ou Unhealthy — esta é uma fonte ideal para alertas.
Logging com Serilog: logs estruturados
Logs são a fonte de dados mais importante para diagnóstico. O Serilog permite enviar logs para Elasticsearch, Seq ou simplesmente para um arquivo com formato estruturado.
Instalação:
dotnet add package Serilog.AspNetCoredotnet add package Serilog.Sinks.SeqConfiguração no Program.cs:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.Seq("http://localhost:5341") .Enrich.WithProperty("Application", "MyApp") .CreateLogger();
builder.Host.UseSerilog();Agora, todos os logs conterão informações contextuais: RequestId, UserId, tempo de execução. Exemplo de log de erro:
try { // código perigoso} catch (Exception ex) { Log.Error(ex, "Erro ao processar pedido {OrderId}", orderId);}Logs estruturados são fáceis de analisar no Grafana ou Kibana, construindo