Oefening: telemetrie uitbreiden in .NET 8

Voltooid

De huidige eShopLite app gebruikt 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 meetwaarde 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 Bestandsnaam ProductsMetrics.cs in.

  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.cs in 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 Producten de map Eindpunt uit en selecteer vervolgens ProductEndpoints.cs.

  9. Vervang het bestaande 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 aan om de StockChange 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. Selecteer DiagnosticServiceCollectionExtensions in het deelvenster EXPLORER in de map Diagnostische gegevens.

  2. Wijzig de AddObservability methode 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 TERMINAL-deelvenster onderaan naar de map dotnet-waarneembaarheid/eShopLite.

    cd ..
    
  2. Werk de appscontainers bij.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Ga naar de map dotnet-waarneembaarheid 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 deeshoplite_products_stock_change_total metrische waarde in en selecteer vervolgens Uitvoeren.

    U ziet deze in een tabel.

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

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

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