Esercizio - Estendere i dati di telemetria in .NET 8

Completato

L'app eShopLite corrente usa i dati di telemetria predefiniti forniti da OpenTelemetry. È possibile estendere i dati di telemetria aggiungendo metriche personalizzate e attributi personalizzati ai dati di telemetria. Questa funzionalità consente di aggiungere più contesto ai dati di telemetria e di creare query più potenti in Application Insights.

In questo esercizio vengono aggiunte nuove metriche alle app e si vedrà come visualizzarle nelle app di osservabilità.

Creare una metrica personalizzata

Per avere maggiore visibilità del modo in cui un titolo cambia nel tempo, si crea una metrica personalizzata.

  1. In Visual Studio Code, nel riquadro EXPLORER fare clic con il pulsante destro del mouse sulla cartella Prodotti e quindi selezionare Nuovo file.

  2. Nel campo Nome file immettere ProductsMetrics.cs.

  3. Nell'editor di testo sostituire il codice con questo esempio:

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

    Il codice precedente crea una nuova metrica denominata eshoplite.products.stock_change. Questa metrica tiene traccia della quantità di scorte modificate tramite il servizio prodotti.

  4. Selezionare Ctrl+S per salvare il file.

  5. Nel riquadro EXPLORER selezionare Program.cs nella cartella Prodotti.

  6. Sostituire il codice AddObservability con questo codice:

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

    Questo codice aggiunge la classe ProductsMetrics al contenitore di inserimento delle dipendenze.

  7. Selezionare Ctrl+S per salvare il file.

  8. Nel riquadro EXPLORER, nella cartella Prodotti espandere la cartella Endpoint e quindi selezionare ProductEndpoints.cs.

  9. Sostituire l'aggiornamento delle scorte esistente MapPut endpoint con questo codice:

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

    Usare l'inserimento delle dipendenze per aggiungere la classe ProductsMetrics all’endpoint. Si chiama quindi il metodo StockChange per incrementare la metrica con il nuovo importo azionario.

  10. Selezionare Ctrl+S per salvare il file.

Aggiungere la metrica a OpenTelemetry

È ora possibile aggiungere la metrica a OpenTelemetry in modo che possa essere esportata negli strumenti di osservabilità.

  1. Nel riquadro EXPLORER, nella cartella Diagnostica, selezionare DiagnosticServiceCollectionExtensions.

  2. Modificare il metodo AddObservability per accettare un nuovo parametro:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. Aggiungere questo codice sotto la riga dell'utilità di esportazione Prometheus:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. Selezionare Ctrl+S per salvare il file.

Visualizzare la nuova metrica in Prometheus

  1. Nella parte inferiore del riquadro TERMINALE, passare alla cartella dotnet-observability/eShopLite.

    cd ..
    
  2. Aggiornare i contenitori delle app.

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. Passare alla cartella dotnet-observability e avviare l'app con Docker:

    cd ..
    docker compose up
    
  4. Aprire l'app eShopLite in un browser in http://localhost:32000.

  5. Passare alla pagina Prodotti e modificare l'importo delle scorte su diversi prodotti.

  6. Aprire il dashboard Prometheus in http://localhost:9090.

  7. Nella casella di ricerca immettere la metricaeshoplite_products_stock_change_total e quindi selezionare Esegui.

    Dovrebbe essere visualizzato in una tabella.

  8. Selezionare la scheda Graph. L'importo delle scorte dovrebbe cambiare nel tempo.

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

  9. Nel riquadro TERMINAL premere CTRL+C per arrestare l'app.