Adicionar observabilidade a um aplicativo nativo da nuvem

Concluído

Agora que você entende a importância da observabilidade, verá como pode incluí-la em seu aplicativo nativo da nuvem. Para fazer esta etapa, adicione OpenTelemetry ao seu aplicativo.

Adicionar OpenTelemetry ao seu aplicativo

O .NET tem um rico ecossistema de ferramentas internas de observabilidade que produzem dados de registro, métricas e rastreamento. Você pode usar essas ferramentas para adicionar observabilidade ao seu aplicativo nativo da nuvem. Estas bibliotecas são:

  • Registo: Microsoft.Extensions.Logging.ILogger
  • Métricas: System.Diagnostics.Metrics.Meter
  • Rastreio: System.Diagnostics.Activity e System.Diagnostics.ActivitySource

O OpenTelemetry consome toda a telemetria anterior, mas primeiro seu aplicativo nativo da nuvem precisa adicionar suporte a OpenTelemetry por meio de pacotes NuGet. Estes pacotes podem ser categorizados em três grupos:

Categoria Pacote Description
API principal OpenTelemetria A biblioteca principal que fornece a funcionalidade principal do OpenTelemetry .
API principal OpenTelemetry.Extensões.Hospedagem Fornece métodos de extensão para iniciar e interromper automaticamente o rastreamento OpenTelemetry em hosts ASP.NET Core.
Instrumentação OpenTelemetry.Instrumentation.AspNetCore Instrumentação para aplicações ASP.NET Core. Este pacote coleta um grande número de métricas sobre seu aplicativo sem que você precise escrever nenhum código.
Exportador OpenTelemetry.Exporter.Console Exportador para o console permite que o aplicativo escreva telemetria no console.

Muitos outros pacotes de instrumentação e exportação estão disponíveis para inclusão em seu aplicativo nativo da nuvem. Para obter mais informações, consulte Observabilidade do .NET com OpenTelemetry. Dependendo do tipo de aplicativo que você está criando, você pode adicionar os pacotes que são mais relevantes para você.

Este módulo se concentra no uso do OpenTelemetry com o aplicativo nativo da nuvem eShopLite . Este aplicativo é construído com .NET Core e Blazor WebAssembly, então isso significa que todos os exemplos de código são baseados em tirar proveito da 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óstico à sua solução que qualquer microsserviço possa referenciar para ser observado.

Aqui está um exemplo de código 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.

Em seguida, essa ação cria uma variável var otelBuilder = services.AddOpenTelemetry() para armazenar o construtor OpenTelemetry . O código pode então adicionar métricas e rastreamentos ao otelBuilder.

Por exemplo, esta configuração adiciona instrumentação para:

  • ASP.NET Core
  • Tempo de execução do C#
  • HttpCLient
  • Servidor web Kestrel

Essas métricas são exibidas no console. O .AddConsoleExporter() método 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 OpenTelemetry no serviço Products , adicione a referência do projeto em seu Product.csproj arquivo:

<ProjectReference Include="..\Diagnostics\Diagnostics.csproj" />

Em seguida, adicione a seguinte linha ao arquivo sob sua Program.cs declaração de builder:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddObservability("Products", builder.Configuration);

Vamos adicionar este código aos serviços de Produtos no aplicativo eShopLite .