Open Telemetry Configuração | Observabilidade | CSharp
- Open Telemetry Configuração | Observabilidade | CSharp
var serviceName = builder.Configuration["OpenTelemetry:ServiceName"] ?? "OrangeFinanceApi";
var resourceBuilder = ResourceBuilder.CreateDefault().AddService(serviceName);
builder.Logging.AddOpenTelemetry(x =>
{
x.IncludeScopes = true;
x.IncludeFormattedMessage = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(opts =>
{
opts.AddMeter("Microsoft.AspNetCore.Hosting")
.AddMeter("Microsoft.AspNetCore.Server.Kestrel")
.AddMeter("Microsoft.AspNetCore.Http.Connections")
.AddMeter("Microsoft.AspNetCore.Routing")
.AddMeter("Microsoft.AspNetCore.Diagnostics")
.AddMeter("Microsoft.AspNetCore.RateLimiting")
.AddRuntimeInstrumentation()
.SetResourceBuilder(resourceBuilder)
.AddMeter(serviceName);
})
.WithTracing(opts =>
{
opts.SetResourceBuilder(resourceBuilder)
.AddAspNetCoreInstrumentation(options =>
{
options.Filter = httpContext => true;
options.EnrichWithHttpRequest = (activity, httpRequest) =>
{
foreach (var (key, value) in httpRequest.Query)
{
activity.SetTag($"http.request.query.{key}", value.ToString());
}
if (httpRequest.Headers.TryGetValue("User-Agent", out var userAgent))
{
activity.SetTag("http.request.header.user_agent", userAgent.ToString());
}
if (httpRequest.Headers.TryGetValue("Custom-Header", out var customHeader))
{
activity.SetTag("http.request.header.custom_header", customHeader.ToString());
}
};
}
)
.AddHttpClientInstrumentation()
.AddOtlpExporter(opts =>
{
opts.Endpoint = new Uri("http://localhost:4317");
});
});
}
WithMetrics e With Tracing
No OpenTelemetry para .NET, os métodos WithMetrics e WithTracing são usados para configurar e habilitar a coleta de métricas e rastreamento (tracing) em uma aplicação. Vamos detalhar cada um deles:
1. WithMetrics
O WithMetrics configura o sistema de métricas do OpenTelemetry, que é responsável por coletar, processar e exportar dados quantitativos sobre a aplicação, como contadores, medidores e observações.
Principais Funcionalidades de WithMetrics
-
Adicionar Instrumentações de Métricas: Permite registrar "meters" ou instrumentos específicos (contadores, medidores, etc.) para coletar métricas de várias partes da aplicação.
.WithMetrics(opts => opts.AddMeter("MyApp.Metrics")) -
Instrumentação de Runtime: Coleta métricas automáticas do runtime do .NET (como uso de memória e coleta de lixo) ao adicionar
.AddRuntimeInstrumentation(). -
Instrumentação ASP.NET Core: Coleta automaticamente métricas de desempenho relacionadas ao ASP.NET Core, como o tempo de resposta e o número de requisições, com
.AddAspNetCoreInstrumentation(). -
Exportação de Métricas: Permite configurar o exportador de métricas, que define para onde as métricas serão enviadas (por exemplo, para o Prometheus ou OTLP).
Exemplo de Uso de WithMetrics
builder.Services.AddOpenTelemetry()
.WithMetrics(opts =>
{
opts.AddMeter("MyApp.Metrics")
.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddPrometheusExporter(); // Exemplo de exportador para Prometheus
});
Quando Usar WithMetrics
Use WithMetrics quando você precisa monitorar o desempenho e a saúde da sua aplicação de maneira quantitativa, como:
- Medir a latência e o tempo de resposta de requisições HTTP.
- Monitorar o consumo de recursos, como uso de CPU e memória.
- Acompanhar contadores de eventos, como o número de requisições recebidas.
2. WithTracing
O WithTracing configura o sistema de rastreamento (tracing) do OpenTelemetry, que é responsável por coletar informações detalhadas sobre o fluxo de execução na aplicação, útil para identificar gargalos, falhas e compreender como as requisições se propagam pela aplicação.
Principais Funcionalidades de WithTracing
-
Adicionar Instrumentações de Rastreamento: Configura a coleta automática de rastreamentos de várias partes da aplicação, como:
.AddAspNetCoreInstrumentation()para rastrear requisições no ASP.NET Core..AddHttpClientInstrumentation()para rastrear chamadas feitas porHttpClient.
-
Configuração de Recursos: Define informações do serviço (nome, versão, etc.) usando
.SetResourceBuilder()para que o rastreamento possa identificar a origem dos dados. -
Exportação de Rastreios: Define o exportador de rastreamento, como o OTLP, para enviar os dados para um sistema de observabilidade (como Jaeger, Zipkin ou outro sistema compatível com OpenTelemetry).
Exemplo de Uso de WithTracing
builder.Services.AddOpenTelemetry()
.WithTracing(opts =>
{
opts.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyApp"))
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddOtlpExporter(opt => opt.Endpoint = new Uri("http://localhost:4317"));
});
Quando Usar WithTracing
Use WithTracing quando você quer:
- Rastrear o fluxo de uma requisição através de diferentes partes da aplicação.
- Identificar onde a aplicação está gastando mais tempo e quais operações estão sendo executadas.
- Diagnosticar problemas de desempenho em chamadas de rede, chamadas de API e tempo de resposta entre serviços.
Resumo das Diferenças
| Configuração | WithMetrics | WithTracing |
|---|---|---|
| Coleta | Dados quantitativos de desempenho | Dados detalhados sobre o fluxo de execução |
| Instrumentação | Meters para métricas de sistema e desempenho | Spans para rastreamento de operações |
| Objetivo | Monitorar a saúde e o uso de recursos | Diagnosticar falhas e entender a propagação de requisições |
| Exportadores | Prometheus, OTLP (para métricas) | OTLP, Jaeger, Zipkin (para rastreamento) |
Essas configurações ajudam a capturar tanto o desempenho (métricas) quanto a propagação de requisições e operações (rastreamento), oferecendo uma visão completa da aplicação.