Adicionar observabilidade a um aplicativo nativo de nuvem
Agora que você entende a importância da observabilidade, verá como pode incluí-la em seu aplicativo nativo de nuvem. Você faz essa etapa adicionando o OpenTelemetry ao seu aplicativo.
Adicionar OpenTelemetry ao seu aplicativo
O .NET tem um ecossistema avançado de ferramentas de observabilidade internas que produzem registro em log, métricas e dados de rastreamento. Você pode usar essas ferramentas para adicionar observabilidade ao seu aplicativo nativo de nuvem. Essas bibliotecas são:
- Registro em log:
Microsoft.Extensions.Logging.ILogger
- Métricas:
System.Diagnostics.Metrics.Meter
- Rastreamento:
System.Diagnostics.Activity
eSystem.Diagnostics.ActivitySource
O OpenTelemetry consome toda a telemetria anterior, mas primeiro seu aplicativo nativo de nuvem precisa adicionar suporte ao OpenTelemetry por meio de pacotes NuGet. Esses pacotes podem ser categorizados em três grupos:
Categoria | Pacote | Descrição |
---|---|---|
API principal | OpenTelemetry | A biblioteca principal que fornece a funcionalidade principal do OpenTelemetry. |
API principal | OpenTelemetry.Extensions.Hosting | Fornece métodos de extensão para iniciar e interromper automaticamente o rastreamento do OpenTelemetry em hosts do ASP.NET Core. |
Instrumentação | OpenTelemetry.Instrumentation.AspNetCore | Instrumentação para aplicativos ASP.NET Core. Esse pacote coleta um grande número de métricas sobre seu aplicativo sem que você precise escrever nenhum código. |
Exportador | OpenTelemetry.Exporter.Console | O exportador para o console permite que o aplicativo grave a telemetria no console. |
Muitos outros pacotes de instrumentação e exportador estão disponíveis para incluir em seu aplicativo nativo de nuvem. Para obter mais informações, consulte a observabilidade do .NET com OpenTelemetry. Dependendo do tipo de aplicativo que você está criando, você pode adicionar os pacotes mais relevantes para você.
Este módulo se concentra no uso do OpenTelemetry com o aplicativo nativo de nuvem eShopLite . Esse aplicativo é criado com o .NET Core e o Blazor WebAssembly, portanto, significa que todos os exemplos de código se baseiam em aproveitar a injeção de dependência.
Você pode optar por incluir todos os OpenTelemetry
pacotes para os serviços de Produtos e Loja no aplicativo de microsserviços. No entanto, em um aplicativo do mundo real, você tem muito mais serviços. Adicionar todos esses pacotes a cada um deles envolve duplicação desnecessária. Uma abordagem melhor é adicionar um novo projeto de diagnósticos à sua solução que qualquer microsserviço pode referenciar para ser observado.
Aqui está um código de exemplo que cria um método AddObservability
que um microsserviço pode chamar para usar OpenTelemetry:
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.DependencyInjection;
public static class DiagnosticServiceCollectionExtensions
{
public static IServiceCollection AddObservability(this IServiceCollection services,
string serviceName,
IConfiguration configuration)
{
// create the resource that references the service name passed in
var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");
// add the OpenTelemetry services
var otelBuilder = services.AddOpenTelemetry();
otelBuilder
// add the metrics providers
.WithMetrics(metrics =>
{
metrics
.SetResourceBuilder(resource)
.AddRuntimeInstrumentation()
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddEventCountersInstrumentation(c =>
{
c.AddEventSources(
"Microsoft.AspNetCore.Hosting",
"Microsoft-AspNetCore-Server-Kestrel",
"System.Net.Http",
"System.Net.Sockets");
})
.AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
.AddConsoleExporter();
})
// add the tracing providers
.WithTracing(tracing =>
{
tracing.SetResourceBuilder(resource)
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddSqlClientInstrumentation();
});
return services;
}
// Add the Prometheus endpoints to your service, this will expose the metrics at http://service/metrics
public static void MapObservability(this IEndpointRouteBuilder routes)
{
routes.MapPrometheusScrapingEndpoint();
}
}
O método retorna uma IServiceCollection
classe que pode ser adicionada como um serviço a um ASP.NET Core WebApplicationBuilder
.
Essa ação cria uma variável var otelBuilder = services.AddOpenTelemetry()
para armazenar o construtor OpenTelemetry. Em seguida, o código pode adicionar métricas e rastreamentos a otelBuilder
.
Por exemplo, essa configuração adiciona instrumentação para:
- ASP.NET Core
- Runtime C#
- HttpCLient
- Servidor Web Kestrel
Essas métricas são exibidas no console. O método .AddConsoleExporter()
adiciona o exportador ao construtor.
Ele também adiciona rastreamento ao console para:
- ASP.NET Core
- HttpClient
- Cliente SQL
A última linha retorna a IServiceCollection
classe.
Com o projeto de diagnóstico concluído, é tão simples quanto adicionar uma referência ao projeto e uma única linha de código ao serviço. Por exemplo, para incluir o OpenTelemetry no serviço Produtos , adicione a referência de projeto em seu Product.csproj
arquivo:
<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />
Em seguida, adicione a seguinte linha no arquivo Program.cs
na sua declaração de builder
:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddObservability("Products", builder.Configuration);
Vamos adicionar esse código aos serviços de Produtos no aplicativo eShopLite .