Dodawanie możliwości obserwowania do aplikacji natywnej dla chmury

Ukończone

Teraz, gdy rozumiesz znaczenie obserwacji, zobaczysz, jak można ją uwzględnić w aplikacji natywnej dla chmury. Ten krok należy wykonać, dodając metodę OpenTelemetry do aplikacji.

Dodawanie aplikacji OpenTelemetry do aplikacji

Platforma .NET oferuje bogaty ekosystem wbudowanych narzędzi do obserwacji, które generują rejestrowanie, metryki i dane śledzenia. Za pomocą tych narzędzi można dodać obserwowalność do aplikacji chmurowo-natywnej. Te biblioteki to:

  • rejestrowanie: Microsoft.Extensions.Logging.ILogger
  • Metryki: System.Diagnostics.Metrics.Meter
  • śledzenie: System.Diagnostics.Activity i System.Diagnostics.ActivitySource

Funkcja OpenTelemetry korzysta ze wszystkich powyższych danych telemetrycznych, ale najpierw aplikacja natywna dla chmury musi dodać obsługę biblioteki OpenTelemetry za pośrednictwem pakietów NuGet. Te pakiety można podzielić na trzy grupy:

Kategoria Pakiet Opis
Podstawowy interfejs API OpenTelemetry Główna biblioteka, która udostępnia podstawowe funkcje OpenTelemetry.
Podstawowy interfejs API OpenTelemetry.Extensions.Hosting Udostępnia metody rozszerzenia do automatycznego uruchamiania i zatrzymywania śledzenia OpenTelemetry na hostach ASP.NET Core.
Aparatura OpenTelemetry.Instrumentation.AspNetCore Instrumentacja dla aplikacji ASP.NET Core. Ten pakiet zbiera dużą liczbę metryk dotyczących aplikacji bez konieczności pisania kodu.
Eksporterze OpenTelemetry.Exporter.Console Eksporter dla konsoli umożliwia aplikacji zapisywanie danych telemetrycznych w konsoli.

Wiele pakietów instrumentacji i eksporterów jest dostępnych do uwzględnienia w aplikacji natywnej dla chmury. Aby uzyskać więcej informacji, zobacz .NET observability with OpenTelemetry. W zależności od typu tworzonej aplikacji możesz dodać pakiety, które są dla Ciebie najbardziej istotne.

Ten moduł koncentruje się na korzystaniu z OpenTelemetry z aplikacją eShopLite natywną dla chmury. Ta aplikacja jest kompilowana przy użyciu platformy .NET Core i zestawu WebAssembly platformy Blazor, co oznacza, że wszystkie przykłady kodu są oparte na wykorzystaniu wstrzykiwania zależności.

Diagram przedstawiający różne składniki OpenTelemetry aplikacji.

Możesz uwzględnić wszystkie pakiety OpenTelemetry w usługach Products i Store w aplikacji mikrousług. Jednak w rzeczywistej aplikacji masz o wiele więcej usług. Dodanie wszystkich tych pakietów do każdego z nich wiąże się z niepotrzebnymi duplikacjami. Lepszym podejściem jest dodanie nowego projektu diagnostycznego do rozwiązania, który może być odniesieniem dla każdej mikrousługi.

Oto przykładowy kod, który tworzy metodę AddObservability, którą mikrousługa może wywołać w celu użycia metody 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();
  }
}

Metoda zwraca klasę IServiceCollection, którą można dodać jako usługę do ASP.NET Core WebApplicationBuilder.

Następnie ta akcja tworzy zmienną var otelBuilder = services.AddOpenTelemetry() do przechowywania konstruktora OpenTelemetry. Następnie kod może dodawać metryki i ślady do otelBuilder.

Na przykład ta konfiguracja dodaje instrumentację dla:

  • ASP.NET Core
  • Środowisko uruchomieniowe języka C#
  • HttpClient
  • Serwer internetowy Kestrel

Te metryki są wyświetlane w konsoli. Metoda .AddConsoleExporter() dodaje eksportera do konstruktora.

Dodaje również śledzenie do konsoli:

  • ASP.NET Core
  • HttpClient
  • Klient SQL

Ostatnia linia zwraca klasę IServiceCollection.

Po zakończeniu projektu diagnostycznego jest to tak proste, jak dodanie odwołania do projektu i pojedynczego wiersza kodu do usługi. Aby na przykład uwzględnić elementy OpenTelemetry w usłudze Products, dodaj odwołanie do projektu w pliku Product.csproj:

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

Potem dodaj następujący wiersz do pliku Program.cs pod deklaracją builder.

var builder = WebApplication.CreateBuilder(args);

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

Dodajmy ten kod do usług Products w aplikacji eShopLite.