Übung: Erweitern der Telemetrie in .NET 8

Abgeschlossen

Die aktuelle App eShopLite verwendet die Standardtelemetrie, die von OpenTelemetry bereitgestellt wird. Sie können die Telemetrie erweitern, indem Sie den Telemetriedaten benutzerdefinierte Metriken und Attribute hinzufügen. Diese Fähigkeit ermöglicht es Ihnen, den Telemetriedaten mehr Kontext hinzuzufügen und leistungsfähigere Abfragen in Application Insights erstellen.

In dieser Übung fügen Sie Apps neue Metriken hinzu und erfahren, wie Sie diese in Ihren Einblick-Apps anzeigen können.

Erstellen einer benutzerdefinierten Metrik

Sie möchten einen besseren Überblick darüber haben, wie sich eine Aktie im Laufe der Zeit ändert, also erstellen Sie eine benutzerdefinierte Metrik.

  1. Klicken Sie in Visual Studio Code im Bereich EXPLORER mit der rechten Maustaste auf den Ordner Products und wählen Sie anschließend Neue Datei aus.

  2. Geben Sie im Feld Dateiname den Namen ProductsMetrics.cs ein.

  3. Ersetzen Sie den Code im Text-Editor durch folgenden Beispiel-Code:

    using System;
    using System.Diagnostics.Metrics;
    
    public class ProductsMetrics
    {
        private readonly Counter<int> _serviceCalls;
        private readonly Counter<int> _stockChange;
    
        public ProductsMetrics(IMeterFactory meterFactory)
        {
            var meter = meterFactory.Create("eShopLite.Products");
            _stockChange = meter.CreateCounter<int>("eshoplite.products.stock_change", unit: "{stock}", description: "Amount of stock being changed through the product service.");
        }
    
        public void StockChange(int quantity)
        {
            _stockChange.Add(quantity);
        }
    }
    

    Der vorangehende Code erstellt eine neue Metrik namens eshoplite.products.stock_change. Diese Metrik verfolgt die Menge der durch den Produktservice geänderten Bestände.

  4. Drücken Sie STRG+S, um die Datei zu speichern.

  5. Wählen Sie im Bereich EXPLORER im Ordner Products die DateiProgram.cs aus.

  6. Ersetzen Sie den AddObservability-Code durch den folgenden Code:

    builder.Services.AddObservability("Products", builder.Configuration, ["eShopLite.Products"]);
    
    // Register the metrics service.
    builder.Services.AddSingleton<ProductsMetrics>();
    

    Dieser Code registriert die ProductsMetrics-Klasse beim Abhängigkeitsinjektionscontainer.

  7. Drücken Sie STRG+S, um die Datei zu speichern.

  8. Erweitern Sie im Bereich EXPLORER im Ordner Products den Ordner Endpoint und wählen Sie dann ProductEndpoints.cs aus.

  9. Ersetzen Sie den vorhandenen Endpunkt MapPut zum Aktualisieren des Lagerbestands durch diesen Code:

    stock.MapPut("/{id}", async  (int id, int stockAmount, ProductDataContext db, ProductsMetrics metrics) =>
    {
        // Increment the stock change metric.
        metrics.StockChange(stockAmount);
    
        var affected = await db.Product
            .Where(model => model.Id == id)
            .ExecuteUpdateAsync(setters => setters
              .SetProperty(m => m.Stock, stockAmount)
            );
    
        return affected == 1 ? Results.Ok() : Results.NotFound();
    })      
    

    Sie verwenden die Abhängigkeitsinjektion, um die ProductsMetrics-Klasse zum Endpunkt hinzuzufügen. Anschließend rufen Sie die StockChange-Methode auf, um die Metrik um die neue Lagerbestandsmenge zu erhöhen.

  10. Drücken Sie STRG+S, um die Datei zu speichern.

Hinzufügen der Metrik zu OpenTelemetry

Sie fügen nun die Metrik zu OpenTelemetry hinzu, damit sie in Ihre Tools zur Gewinnung von Einblicken exportiert werden kann.

  1. Wählen Sie im Bereich EXPLORER im Ordner Diagnose den Eintrag DiagnosticServiceCollectionExtensions aus.

  2. Ändern Sie die AddObservability-Methode so, dass ein neuer Parameter akzeptiert wird:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Fügen Sie unter der Prometheus-Exporterzeile folgenden Code hinzu:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Drücken Sie STRG+S, um die Datei zu speichern.

Anzeigen der neuen Metrik in Prometheus

  1. Wechseln Sie im Bereich TERMINAL unten zum dotnet-observability/eShopLite-Ordner.

    cd ..
    
  2. Aktualisieren Sie die App-Container.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Wechseln Sie zum dotnet-observability-Ordner, und starten Sie die App mit Docker:

    cd ..
    docker compose up
    
  4. Öffnen Sie die App eShopLite in einem Browser auf http://localhost:32000.

  5. Wechseln Sie zur Seite Produkte und ändern Sie den Lagerbestand für mehrere Produkte.

  6. Öffnen Sie das Dashboard Prometheus auf http://localhost:9090.

  7. Geben Sie in das Suchfeld die Metrik eshoplite_products_stock_change_total ein, und wählen Sie dann Ausführen aus.

    Sie sollte in einer Tabelle aufgeführt werden.

  8. Wählen Sie die Registerkarte Graph aus. Der Lagerbestand sollte sich im Laufe der Zeit ändern.

    Screenshot that shows Prometheus showing the new custom metric on a graph.

  9. Drücken Sie im Bereich TERMINALSTRG+C, um die App zu beenden.