Waarneembaarheid toevoegen aan een cloudeigen toepassing

Voltooid

Nu u het belang van waarneembaarheid begrijpt, ziet u hoe u deze kunt opnemen in uw cloudeigen toepassing. U doet deze stap door OpenTelemetry toe te voegen aan uw app.

OpenTelemetry toevoegen aan uw app

.NET heeft een uitgebreid ecosysteem van ingebouwde hulpprogramma's voor waarneembaarheid die logboekregistratie, metrische gegevens en traceringsgegevens produceren. U kunt deze hulpprogramma's gebruiken om waarneembaarheid toe te voegen aan uw cloudeigen toepassing. Deze bibliotheken zijn:

  • logboekregistratie: Microsoft.Extensions.Logging.ILogger
  • metrische gegevens: System.Diagnostics.Metrics.Meter
  • tracering: System.Diagnostics.Activity en System.Diagnostics.ActivitySource

OpenTelemetry verbruikt alle voorgaande telemetrie, maar eerst moet uw cloudeigen app OpenTelemetry-ondersteuning toevoegen via NuGet-pakketten. Deze pakketten kunnen worden onderverdeeld in drie groepen:

Categorie Pakket Beschrijving
Core-API- OpenTelemetry De hoofdbibliotheek die de kernfunctionaliteit van OpenTelemetry biedt.
Core-API- OpenTelemetry.Extensions.Hosting- Biedt uitbreidingsmethoden voor het automatisch starten en stoppen van OpenTelemetry-tracering in ASP.NET Core-hosts.
instrumentatie OpenTelemetry.Instrumentation.AspNetCore Instrumentatie voor ASP.NET Core-toepassingen. Dit pakket verzamelt een groot aantal metrische gegevens over uw app zonder dat u code hoeft te schrijven.
exporteur OpenTelemetry.Exporter.Console Met de exporteur voor de console kan de app telemetrie naar de console schrijven.

Er zijn nog veel meer instrumentatie- en exportpakketten beschikbaar die u kunt opnemen in uw cloudeigen app. Zie .NET-waarneembaarheid met OpenTelemetryvoor meer informatie. Afhankelijk van het type app dat u bouwt, kunt u de pakketten toevoegen die het meest relevant voor u zijn.

Deze module is gericht op het gebruik van OpenTelemetry met de eShopLite cloudeigen app. Deze app is gebouwd met .NET Core en Blazor WebAssembly, dus dit betekent dat alle codevoorbeelden zijn gebaseerd op het gebruik van afhankelijkheidsinjectie.

een diagram met de verschillende OpenTelemetry-onderdelen van de app.

U kunt ervoor kiezen om alle OpenTelemetry pakketten op te nemen in zowel de Producten als de Store services binnen de microservices-app. In een echte app hebt u echter nog veel meer services. Het toevoegen van al deze pakketten aan elk pakket omvat onnodige duplicatie. Een betere benadering is het toevoegen van een nieuw diagnostisch project aan uw oplossing, dat kan worden geraadpleegd door elke microservice.

Hier volgt een voorbeeldcode waarmee een methode wordt gemaakt AddObservability die een microservice kan aanroepen om OpenTelemetry te gebruiken:

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();
  }
}

De methode retourneert een IServiceCollection-klasse die als een service kan worden toegevoegd aan een ASP.NET Core-WebApplicationBuilder.

Met deze actie maakt u vervolgens een variabele var otelBuilder = services.AddOpenTelemetry() om de opbouwfunctie voor OpenTelemetry op te slaan. De code kan vervolgens metrische gegevens en traceringen toevoegen aan otelBuilder.

Met deze configuratie wordt bijvoorbeeld instrumentatie toegevoegd voor:

  • ASP.NET Core
  • C# Runtime
  • HttpClient
  • Kestrel-webserver

Deze metrische gegevens worden weergegeven in de console. De methode .AddConsoleExporter() voegt de exporteur toe aan de bouwer.

Er wordt ook tracering toegevoegd aan de console voor:

  • ASP.NET Core
  • HttpClient
  • SQL-client

De laatste regel retourneert de IServiceCollection class.

Als het diagnostische project is voltooid, is het net zo eenvoudig als het toevoegen van een verwijzing naar het project en één regel code aan de service. Als u bijvoorbeeld OpenTelemetry wilt opnemen in de Products-service, voegt u de projectreferentie toe aan uw Product.csproj-bestand:

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

Voeg vervolgens de volgende regel toe aan het Program.cs bestand onder uw declaratie van builder:

var builder = WebApplication.CreateBuilder(args);

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

Laten we deze code toevoegen aan de Products services in de eShopLite-app.