Oefening: telemetrie uitbreiden in .NET 8

Voltooid

De huidige eShopLite-app maakt gebruik van de standaardtelemetrie van OpenTelemetry. U kunt de telemetrie uitbreiden door aangepaste metrische gegevens en aangepaste kenmerken toe te voegen aan de telemetriegegevens. Met deze mogelijkheid kunt u meer context toevoegen aan de telemetriegegevens en krachtigere query's maken in Application Insights.

In deze oefening voegt u nieuwe metrische gegevens toe aan apps en ziet u hoe u deze kunt weergeven in uw waarneembaarheidsapps.

Een aangepaste metrische waarde maken

U wilt meer inzicht hebben in hoe een voorraad in de loop van de tijd verandert, zodat u een aangepaste metrische waarde maakt.

  1. Klik in Visual Studio Code in het deelvenster EXPLORER met de rechtermuisknop op de map Producten en selecteer vervolgens Nieuw bestand.

  2. Voer in het veld BestandsnaamProductsMetrics.csin.

  3. Vervang de code in de teksteditor door dit voorbeeld:

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

    Met de voorgaande code wordt een nieuwe metriek gemaakt met de naam eshoplite.products.stock_change. Met deze metrische waarde wordt de hoeveelheid voorraad bijgehouden die wordt gewijzigd via de productservice.

  4. Selecteer Ctrl+S- om het bestand op te slaan.

  5. Selecteer Program.csin het deelvenster EXPLORER in de map Producten.

  6. Vervang de AddObservability code door deze code:

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

    Met deze code wordt de ProductsMetrics-klasse toegevoegd aan de container voor afhankelijkheidsinjectie.

  7. Selecteer Ctrl+S- om het bestand op te slaan.

  8. Vouw in het deelvenster EXPLORER in de map Products de map Endpoint uit en selecteer ProductEndpoints.cs.

  9. Vervang het bestaande API-eindpunt voor voorraadupdate MapPut door deze 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();
    })      
    

    U gebruikt afhankelijkheidsinjectie om de ProductsMetrics-klasse toe te voegen aan het eindpunt. Vervolgens roept u de methode StockChange aan om de metrische waarde te verhogen met het nieuwe voorraadbedrag.

  10. Selecteer Ctrl+S- om het bestand op te slaan.

De metrische waarde toevoegen aan OpenTelemetry

U voegt nu de metrische waarde toe aan OpenTelemetry, zodat deze kan worden geƫxporteerd naar uw hulpprogramma's voor waarneembaarheid.

  1. In het deelvenster EXPLORER, open de map Diagnostics en selecteer DiagnosticServiceCollectionExtensions.

  2. Wijzig de methode AddObservability om een nieuwe parameter te accepteren:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Voeg onder de regel prometheus-exporteur deze code toe:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Selecteer Ctrl+S- om het bestand op te slaan.

De nieuwe metrische waarde weergeven in Prometheus

  1. Ga in het deelvenster TERMINAL onderaan naar de map dotnet-observability/eShopLite.

    cd ..
    
  2. Werk de appscontainers bij.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Ga naar de map dotnet-observability en start de app met Docker:

    cd ..
    docker compose up
    
  4. Open de eShopLite-app in een browser op http://localhost:32000.

  5. Ga naar de pagina Producten en wijzig het voorraadbedrag op verschillende producten.

  6. Open het Prometheus dashboard op http://localhost:9090.

  7. Voer in het zoekvak de metrischeeshoplite_products_stock_change_total in en selecteer vervolgens uitvoeren.

    U zou het in een tabel moeten zien staan.

  8. Selecteer het tabblad Graph. U ziet dat de voorraadhoeveelheid in de loop van de tijd verandert.

    Schermopname van Prometheus met de nieuwe aangepaste metrische gegevens in een grafiek.

  9. Druk in het deelvenster TERMINAL op Ctrl+C- om de app te stoppen.