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ć wgląd w aplikację natywną dla chmury. 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.
Instrumentacji OpenTelemetry.Instrumentation.AspNetCore Instrumentacja dla aplikacji ASP.NET Core. Ten pakiet zbiera dużą liczbę metryk dotyczących aplikacji bez konieczności pisania kodu.
Eksporter 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 (Obserwowanie platformy .NET za pomocą technologii 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 używaniu biblioteki OpenTelemetry z aplikacją natywną dla chmury eShopLite . 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.

A diagram that shows the different OpenTelemetry components of the app.

Możesz dołączyć wszystkie OpenTelemetry pakiety zarówno do usług Products , jak 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, do którego można odwoływać się do dowolnej 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. Kod może następnie dodawać metryki i ślady do otelBuilderelementu .

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 programu . Metoda .AddConsoleExporter() dodaje eksportera do konstruktora.

Dodaje również śledzenie do konsoli programu :

  • ASP.NET Core
  • HttpClient
  • Klient SQL

Ostatni wiersz 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ć metodę OpenTelemetry w usłudze Products , dodaj odwołanie do projektu w Product.csproj pliku:

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

Następnie dodaj następujący wiersz do Program.cs pliku pod deklaracją builder:

var builder = WebApplication.CreateBuilder(args);

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

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