練習 - 在 .NET 8 中擴充遙測功能

已完成

目前的 eShopLite 應用程式正在使用 OpenTelemetry 所提供的預設遙測功能。 您可以將自訂計量和自訂屬性新增至遙測資料來擴充遙測功能。 這項功能可讓您將更多的內容新增至遙測資料,並在 Application Insights 中建立更強大的查詢。

在本練習中,您要將新的計量新增至應用程式,並了解如何在可檢視性應用程式中檢視它們。

建立自訂計量

您想要更清楚地了解庫存隨時間的變化情況,因此您建立了一個自訂計量。

  1. 在 Visual Studio Code 的 [檔案總管] 窗格中,以滑鼠右鍵按一下 Products 資料夾,然後選取 [新增檔案]

  2. 在 [檔案名稱] 欄位中,輸入 ProductsMetrics.cs

  3. 在文字編輯器中,以下列範例取代程式碼:

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

    上面的程式碼會建立一個名為 eshoplite.products.stock_change 的新計量。 此計量會追蹤透過產品服務變更的庫存量。

  4. 選取 Ctrl+S 以儲存檔案。

  5. 在 [檔案總管] 窗格的 Products 資料夾中,選取 Program.cs

  6. 以下列程式碼取代 AddObservability 程式碼:

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

    此程式碼會將 ProductsMetrics 類別新增至相依性插入容器中。

  7. 選取 Ctrl+S 以儲存檔案。

  8. 在 [檔案總管] 窗格的 Products 資料夾中,展開 Endpoint 資料夾,然後選取 ProductEndpoints.cs

  9. 以下列程式碼取代現有的庫存更新 MapPut 端點:

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

    您可以使用相依性插入將 ProductsMetrics 類別新增至此端點中。 接著,您將呼叫 StockChange 方法來以新的庫存量遞增計量。

  10. 選取 Ctrl+S 以儲存檔案。

將計量新增至 OpenTelemetry 中

您現在要將計量新增至 OpenTelemetry 中,使其可以匯出至您的可檢視性工具。

  1. 在 [檔案總管] 窗格的 Diagnostics 資料夾中,選取 DiagnosticServiceCollectionExtensions

  2. 變更 AddObservability 方法以接受新的參數:

    public static IServiceCollection AddObservability(this IServiceCollection services,
        string serviceName,
        IConfiguration configuration,
        string[]? meeterNames = null)
    
  3. 在 Prometheus 匯出器行下方,新增下列程式碼:

    .AddPrometheusExporter();
    
    // add any additional meters provided by the caller
    if (meeterNames != null)
    {
      foreach (var name in meeterNames)
      {
        metrics.AddMeter(name);
      }
    }
    
  4. 選取 Ctrl+S 以儲存檔案。

在 Prometheus 中檢視新的計量

  1. 在底部的 [終端機] 窗格中,移至 dotnet-observability/eShopLite 資料夾。

    cd ..
    
  2. 更新應用程式容器。

    dotnet publish /p:PublishProfile=DefaultContainer 
    
  3. 移至 dotnet-observability 資料夾,並使用 Docker 啟動應用程式:

    cd ..
    docker compose up
    
  4. 在瀏覽器中開啟位於 http://localhost:32000 的應用程式 eShopLite

  5. 移至 Products 頁面並變更數項產品的庫存量。

  6. 開啟位於 http://localhost:9090Prometheus 儀表板。

  7. 在搜尋方塊中,輸入eshoplite_products_stock_change_total 計量,然後選取 [執行]

    您應該會看到它列在資料表中。

  8. 選取 [圖形] 索引標籤。您應該會看到隨時間變化的庫存量變更。

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

  9. 在 [終端機] 窗格中,按 Ctrl+C 以停止應用程式。