Lägga till observerbarhet i ett molnbaserat program

Slutförd

Nu när du förstår vikten av observerbarhet ser du hur du kan inkludera det i ditt molnbaserade program. Du gör det här steget genom att lägga till OpenTelemetry i din app.

Lägga till OpenTelemetry i din app

.NET har ett omfattande ekosystem med inbyggda observerbarhetsverktyg som producerar loggning, mått och spårningsdata. Du kan använda dessa verktyg för att lägga till observerbarhet i ditt molnbaserade program. Dessa bibliotek är:

  • Loggning: Microsoft.Extensions.Logging.ILogger
  • Mått:System.Diagnostics.Metrics.Meter
  • Spårning: System.Diagnostics.Activity och System.Diagnostics.ActivitySource

OpenTelemetry använder all föregående telemetri, men först måste din molnbaserade app lägga till OpenTelemetry-stöd via NuGet-paket. Dessa paket kan kategoriseras i tre grupper:

Kategori Paket beskrivning
Kärn-API OpenTelemetry Huvudbiblioteket som tillhandahåller grundläggande OpenTelemetry-funktioner.
Kärn-API OpenTelemetry.Extensions.Hosting Tillhandahåller tilläggsmetoder för att automatiskt starta och stoppa OpenTelemetry-spårning i ASP.NET Core-värdar.
Instrumentation OpenTelemetry.Instrumentation.AspNetCore Instrumentation för ASP.NET Core-program. Det här paketet samlar in ett stort antal mått om din app utan att du behöver skriva någon kod.
Exportör OpenTelemetry.Exporter.Console Med exportören för konsolen kan appen skriva ut telemetri till konsolen.

Det finns många fler instrumentations- och exportpaket att ta med i din molnbaserade app. Mer information finns i .NET-observerbarhet med OpenTelemetry. Beroende på vilken typ av app du skapar kan du lägga till de paket som är mest relevanta för dig.

Den här modulen fokuserar på att använda OpenTelemetry med den molnbaserade eShopLite-appen . Den här appen är byggd med .NET Core och Blazor WebAssembly, så det innebär att alla kodexempel baseras på att dra nytta av beroendeinmatning.

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

Du kan välja att inkludera alla OpenTelemetry paket till både produkter och store-tjänster i mikrotjänstappen. Men i en verklig app har du många fler tjänster. Att lägga till alla dessa paket i var och en innebär onödig duplicering. En bättre metod är att lägga till ett nytt diagnostikprojekt i din lösning som alla mikrotjänster kan referera till som ska observeras.

Här är en exempelkod som skapar en metod AddObservability som en mikrotjänst kan anropa för att använda 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();
  }
}

Metoden returnerar en IServiceCollection klass som kan läggas till som en tjänst i en ASP.NET Core WebApplicationBuilder.

Den här åtgärden skapar sedan en variabel var otelBuilder = services.AddOpenTelemetry() för att lagra OpenTelemetry-byggaren. Koden kan sedan lägga till mått och spårningar i otelBuilder.

Den här konfigurationen lägger till exempel instrumentation för:

  • ASP.NET Core
  • C# Runtime
  • HttpCLient
  • Kestrel-webbserver

Dessa mått visas i konsolen. Metoden .AddConsoleExporter() lägger till exportören i byggaren.

Den lägger också till spårning i -konsolen för:

  • ASP.NET Core
  • HttpClient
  • SQL-klient

Den sista raden returnerar IServiceCollection klassen.

När diagnostikprojektet har slutförts är det lika enkelt som att lägga till en referens till projektet och en enda kodrad i tjänsten. Om du till exempel vill inkludera OpenTelemetry i produkttjänsten lägger du till projektreferensen i Product.csproj filen:

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

Lägg sedan till följande rad i Program.cs filen under din deklaration av builder:

var builder = WebApplication.CreateBuilder(args);

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

Nu ska vi lägga till den här koden i products-tjänsterna i eShopLite-appen .