Adicionar observabilidade a um aplicativo nativo de nuvem

Concluído

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 e System.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.

Um diagrama que mostra os diferentes componentes opentelemetry do aplicativo.

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 .