Monitoramento de aplicações C#: métricas e alertas em .NET

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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.AspNetCore

Adicione 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.Seq

Configuraçã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

Blogs

Book Recommendations