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
Kern-API OpenTelemetry De hoofdbibliotheek die de kernfunctionaliteit van OpenTelemetry biedt.
Kern-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.
Exportfunctie 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 OpenTelemetry voor 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 cloudeigen eShopLite-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 Store-services in 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 aanpak is het toevoegen van een nieuw diagnostisch project aan uw oplossing waarnaar elke microservice kan verwijzen.

Hier volgt een voorbeeldcode waarmee een methode AddObservability wordt gemaakt 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() voor het opslaan van de opbouwfunctie voor OpenTelemetry. 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 .AddConsoleExporter() methode voegt de exporteur toe aan de opbouwfunctie.

Er wordt ook tracering toegevoegd aan de console voor:

  • ASP.NET Core
  • HttpClient
  • SQL-client

De laatste regel retourneert de IServiceCollection klasse.

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 productenservice , 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);

We gaan deze code toevoegen aan de productenservices in de eShopLite-app .