Monitoramento de aplicações C# (.NET): Guia completo sobre OpenTelemetry e Prometheus
Aplicações .NET modernas exigem observação constante de desempenho, erros e estado. Sem monitoramento, você corre o risco de perder o controle sobre a produção. Neste artigo, vamos abordar como configurar um monitoramento eficaz de aplicações C# (.NET) usando a combinação de OpenTelemetry (coleta de telemetria) e Prometheus + Grafana (visualização e alertas).
Por que OpenTelemetry?
OpenTelemetry (OTel) é o padrão da indústria para coleta de métricas, traces (rastreamento) e logs. Para .NET, ele fornece SDKs oficiais e instrumentação automática de bibliotecas populares (ASP.NET Core, gRPC, Entity Framework).
Instalação e configuração do OpenTelemetry no projeto C#
Adicione os pacotes NuGet ao seu projeto:
dotnet add package OpenTelemetrydotnet add package OpenTelemetry.Extensions.Hostingdotnet add package OpenTelemetry.Instrumentation.AspNetCoredotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCoreConfiguração básica no Program.cs
Configure a coleta de métricas e exportação para Prometheus:
using OpenTelemetry.Metrics;using OpenTelemetry.Resources;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource .AddService("MyApp", serviceVersion: "1.0.0")) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddMeter("Microsoft.AspNetCore.Hosting") .AddMeter("Microsoft.AspNetCore.Server.Kestrel") .AddPrometheusExporter());
var app = builder.Build();
// Endpoint para Prometheus (padrão /metrics)app.MapPrometheusScrapingEndpoint();
app.Run();Criação de métricas personalizadas
Você pode adicionar seus próprios contadores, histogramas e medidores:
using System.Diagnostics.Metrics;
public class OrderMetrics{ private readonly Counter<int> _ordersCreated; private readonly Histogram<double> _orderProcessingTime;
public OrderMetrics(IMeterFactory meterFactory) { var meter = meterFactory.Create("MyApp.Orders"); _ordersCreated = meter.CreateCounter<int>("orders.created", description: "Quantidade de pedidos criados"); _orderProcessingTime = meter.CreateHistogram<double>("orders.processing_time", unit: "ms"); }
public void RecordOrderCreated() => _ordersCreated.Add(1); public void RecordProcessingTime(double ms) => _orderProcessingTime.Record(ms);}Rastreamento de requisições (Distributed Tracing)
Para rastrear cadeias de chamadas, adicione tracing:
using OpenTelemetry.Trace;
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddEntityFrameworkCoreInstrumentation() .AddConsoleExporter()); // Para depuração, em produção — Jaeger ou ZipkinRegistro de logs via OpenTelemetry
Conecte o logger ao OTel:
using OpenTelemetry.Logs;
builder.Logging.AddOpenTelemetry(logging => logging .AddConsoleExporter() .AddOtlpExporter(options => options.Endpoint = new Uri("http://localhost:4317")));Configuração do Prometheus para coleta de métricas
No arquivo prometheus.yml, especifique seu endpoint:
scrape_configs: - job_name: 'dotnet-app' scrape_interval: 5s static_configs: - targets: ['localhost:5000'] # Porta da sua aplicaçãoVisualização no Grafana
Após conectar o Prometheus ao Grafana, crie um dashboard com as métricas principais:
- http_server_duration_ms — tempo de resposta do servidor
Também na biblioteca
Trabalho com datas em Go (Golang): visão geral de bibliotecas e pacotes
Cache em Go (Golang): Redis, cache em grupo e cache in-memory
PDFKit para JavaScript (Node.js): guia completo com exemplos
Programação Reativa em Rust: bibliotecas, frameworks e exemplos práticos
Trabalho com XML em Kotlin: bibliotecas, parsing e criação de documentos
Recommendations