Esercizio - Estendere i dati di telemetria in .NET 8
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.
In Visual Studio Code, nel riquadro EXPLORER fare clic con il pulsante destro del mouse sulla cartella Prodotti e quindi selezionare Nuovo file.
Nel campo Nome file immettere ProductsMetrics.cs.
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.Selezionare Ctrl+S per salvare il file.
Nel riquadro EXPLORER selezionare Program.cs nella cartella Prodotti.
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.Selezionare Ctrl+S per salvare il file.
Nel riquadro EXPLORER, nella cartella Prodotti espandere la cartella Endpoint e quindi selezionare ProductEndpoints.cs.
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 metodoStockChange
per incrementare la metrica con il nuovo importo azionario.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à.
Nel riquadro EXPLORER, nella cartella Diagnostica, selezionare DiagnosticServiceCollectionExtensions.
Modificare il metodo
AddObservability
per accettare un nuovo parametro:public static IServiceCollection AddObservability(this IServiceCollection services, string serviceName, IConfiguration configuration, string[]? meeterNames = null)
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); } }
Selezionare Ctrl+S per salvare il file.
Visualizzare la nuova metrica in Prometheus
Nella parte inferiore del riquadro TERMINALE, passare alla cartella dotnet-observability/eShopLite.
cd ..
Aggiornare i contenitori delle app.
dotnet publish /p:PublishProfile=DefaultContainer
Passare alla cartella dotnet-observability e avviare l'app con Docker:
cd .. docker compose up
Aprire l'app eShopLite in un browser in
http://localhost:32000
.Passare alla pagina Prodotti e modificare l'importo delle scorte su diversi prodotti.
Aprire il dashboard Prometheus in
http://localhost:9090
.Nella casella di ricerca immettere la metrica
eshoplite_products_stock_change_total
e quindi selezionare Esegui.Dovrebbe essere visualizzato in una tabella.
Selezionare la scheda Graph. L'importo delle scorte dovrebbe cambiare nel tempo.
Nel riquadro TERMINAL premere CTRL+C per arrestare l'app.