Hinzufügen von Einblicken zu einer cloudnativen Anwendung

Abgeschlossen

Nachdem Sie verstehen, wie wichtig Einblicke sind, erfahren Sie nun, wie Sie diese in Ihre cloudnative Anwendung integrieren können. Hierzu fügen Sie Ihrer App in diesem Schritt OpenTelemetry hinzu.

Hinzufügen von OpenTelemetry zu Ihrer App

.NET verfügt über ein umfangreiches Ökosystem von integrierten Tools für Einblicke, die Protokollierung, Metriken und Ablaufverfolgungsdaten erzeugen. Sie können diese Tools verwenden, um Ihrer cloudnativen Anwendung Einblicke hinzuzufügen. Diese Bibliotheken sind:

  • Protokollierung: Microsoft.Extensions.Logging.ILogger
  • Metriken: System.Diagnostics.Metrics.Meter
  • Ablaufverfolgung: System.Diagnostics.Activity und System.Diagnostics.ActivitySource

OpenTelemetry verwendet alle oben genannten Telemetriedaten, doch muss Ihre cloudnative App zuerst OpenTelemetry-Unterstützung über NuGet-Pakete hinzufügen. Diese Pakete können in drei Gruppen kategorisiert werden:

Kategorie Paket Beschreibung
Core-API OpenTelemetry Die Hauptbibliothek, welche die Kernfunktionalität von OpenTelemetry bereitstellt.
Core-API OpenTelemetry.Extensions.Hosting Stellt Erweiterungsmethoden zum automatischen Starten und Beenden der OpenTelemetry-Ablaufverfolgung in ASP.NET Core-Hosts bereit.
Instrumentation OpenTelemetry.Instrumentation.AspNetCore Instrumentierung für ASP.NET Core-Anwendungen. Dieses Paket sammelt eine große Anzahl von Metriken über Ihre App, ohne dass Sie Code schreiben müssen.
Exporteur OpenTelemetry.Exporter.Console Der Exporter für die Konsole ermöglicht der App das Schreiben von Telemetriedaten in die Konsole.

Viele weitere Instrumentierungs- und Exporterpakete stehen zur Verfügung, die in Ihre cloudnative App aufgenommen werden können. Weitere Informationen finden Sie unter .NET-Einblicke mit OpenTelemetry. Je nach Typ der App, die Sie erstellen, können Sie die Pakete hinzufügen, die für Sie am relevantesten sind.

Dieses Modul konzentriert sich auf die Verwendung von OpenTelemetry mit der cloudnativen eShopLite-App. Diese App wird mit .NET Core und Blazor WebAssembly erstellt. Das bedeutet, dass alle Codebeispiele auf der Nutzung der Abhängigkeitsinjektion basieren.

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

Sie könnten sich dafür entscheiden, alle OpenTelemetry-Pakete sowohl für den Dienst Products als auch für den Dienst Store in die Microservices-App aufzunehmen. In einer realen App gibt es jedoch weit mehr Dienste. Das Hinzufügen aller dieser Pakete zu jedem einzelnen bedeutet unnötige Doppelarbeit. Ein besserer Ansatz besteht darin, Ihrer Lösung ein neues Diagnoseprojekt hinzuzufügen, auf das jeder Microservice verweisen kann, um beobachtet zu werden.

Hier ist ein Beispielcode, der eine Methode AddObservability erstellt, die ein Microservice aufrufen kann, um OpenTelemetry zu verwenden:

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

Die Methode gibt eine IServiceCollection-Klasse zurück, die ASP.NET Core WebApplicationBuilder als Dienst hinzugefügt werden kann.

Durch diese Aktion wird eine Variable var otelBuilder = services.AddOpenTelemetry() zum Speichern des OpenTelemetry-Generators erstellt. Der Code kann dann Metriken und Ablaufverfolgungen zu otelBuilder hinzufügen.

Diese Konfiguration fügt z. B. eine Instrumentierung für Folgende hinzu:

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

Diese Metriken werden in der Konsole angezeigt. Die .AddConsoleExporter()-Methode fügt dem Generator den Exporter hinzu.

Außerdem wird der Konsole die Ablaufverfolgung hinzugefügt für:

  • ASP.NET Core
  • HttpClient
  • SQL-Client

Die letzte Zeile gibt die IServiceCollection-Klasse zurück.

Nachdem das Diagnoseprojekt abgeschlossen wurde, ist es so einfach wie das Hinzufügen eines Verweises auf das Projekt und eine einzelne Codezeile zum Dienst. Um z. B. OpenTelemetry in den Dienst Products einzuschließen, fügen Sie Ihrer Product.csproj-Datei den Projektverweis hinzu:

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

Fügen Sie dann der Program.cs-Datei unter Ihrer Deklaration für builder die folgende Zeile hinzu:

var builder = WebApplication.CreateBuilder(args);

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

Fügen wir diesen Code den Produkt-Diensten in der eShopLite-App hinzu.