練習 - 將 OpenTelemetry 新增至雲端原生應用程式

已完成

在此練習中,您會將新的診斷專案新增至您的 eShopLite 解決方案。 您將瞭解如何包含 OpenTelemetry NuGet 套件,然後將可觀察性新增至 產品 服務。

開啟開發環境並建立 Azure 資源

您可以選擇使用提供練習的 GitHub Codespace,或在本機的 Visual Studio Code 中完成練習。

若要使用 codespace,請使用這個 Codespace 建立範本建立預先設定的 GitHub Codespace。

當 GitHub 建立及設定 codespace 時,此步驟需要幾分鐘的時間。 程式完成之後,您會看到練習的程式代碼檔案。 此課程模組其餘部分所使用的程式代碼位於 /dotnet-observability 目錄中。

若要使用 Visual Studio Code,請將 https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative 存放庫複製到本機電腦。 然後:

  1. 安裝任何 系統需求 ,以在 Visual Studio Code 中執行開發容器。
  2. 請確保 Docker 正在運行。
  3. 在新的 Visual Studio Code 視窗中,開啟複製存放庫的資料夾。
  4. 按下 Ctrl+Shift+P,以開啟命令選擇區。
  5. 搜尋:>開發容器: 重建並在容器中重新開啟
  6. 從下拉式清單中選取 eShopLite - dotnet-observability。 Visual Studio Code 會在本機上建立您的開發容器。

將診斷專案新增至方案

將可觀察性新增至 eShopLite 應用程式的第一個步驟是將新的診斷專案引入解決方案。 此專案包含您將用來將可觀察性新增至應用程式的所有 OpenTelemetry 套件和設定。

  1. 在 Codespace 命令選擇區中,輸入 [.NET:開啟解決方案]>
  2. 選取 dotnet-observability/eShopLite/eShopLite.sln
  3. 方案總管EXPLORER 窗格底部,以滑鼠右鍵按一下 eShopLite 方案,然後選取 新增專案
  4. 在 [ 選取範本以建立新的 .NET 專案 ] 對話框中,選取 [類別庫] (Common, Library)
  5. 在 [ 名稱] 欄位中,輸入 [診斷]。
  6. 「將在專案中建立」的下拉式選單中,確定檔案路徑目錄為 /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/eShopLite/

新增 OpenTelemetry 套件

現在,將OpenTelemetry套件新增至新的診斷專案。

  1. 使用 Codespace 底部的終端機窗格,移至診斷項目資料夾:

    cd dotnet-observability/eShopLite/Diagnostics
    
  2. 執行下列 dotnet add 命令:

    dotnet add package OpenTelemetry.Exporter.Console
    dotnet add package OpenTelemetry.Extensions.Hosting
    dotnet add package OpenTelemetry.Instrumentation.AspNetCore
    dotnet add package OpenTelemetry.Instrumentation.EventCounters --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Runtime
    dotnet add package OpenTelemetry.Instrumentation.SqlClient --prerelease
    dotnet add package OpenTelemetry.Instrumentation.Http
    
  3. 在 [檔案總管] 窗格中,展開 [診斷] 資料夾並選取 Diagnostics.csproj

  4. Project Sdk頂端變更為:

    <Project Sdk="Microsoft.NET.Sdk.Web">
    

    上述程式代碼可讓您在程式代碼中使用 IConfiguration 類別。

  5. 在 中 <PropertyGroup>,新增輸出類型:

    <OutputType>Library</OutputType>
    

    上述程式碼確保專案被建置為程式庫。 否則,編譯器預期會是 main 方法的 Program.cs 檔案。

新增程序代碼以使用 OpenTelemetry

新增 OpenTelemetry 套件後,您現在可以加入程式代碼來使用它們。

  1. EXPLORER 窗格中,以滑鼠右鍵按一下 Class1.cs 檔案,然後選取重新命名

  2. 將檔案重新命名為 DiagnosticServiceCollectionExtensions.cs

  3. 將檔案中的程式碼替換為以下程式碼:

    using OpenTelemetry.Metrics;
    using OpenTelemetry.Resources;
    using OpenTelemetry.Trace;
    
    namespace Microsoft.Extensions.DependencyInjection;
    
    public static class DiagnosticServiceCollectionExtensions
    {
      public static IServiceCollection AddObservability(this IServiceCollection services,
          string serviceName,
          IConfiguration configuration)
      {
        // create the resource that references the service name passed in
        var resource = ResourceBuilder.CreateDefault().AddService(serviceName: serviceName, serviceVersion: "1.0");
    
        // add the OpenTelemetry services
        var otelBuilder = services.AddOpenTelemetry();
    
        otelBuilder
            // add the metrics providers
            .WithMetrics(metrics =>
            {
              metrics
                .SetResourceBuilder(resource)
                .AddRuntimeInstrumentation()
                .AddAspNetCoreInstrumentation()
                .AddHttpClientInstrumentation()
                .AddEventCountersInstrumentation(c =>
                {
                  c.AddEventSources(
                          "Microsoft.AspNetCore.Hosting",
                          "Microsoft-AspNetCore-Server-Kestrel",
                          "System.Net.Http",
                          "System.Net.Sockets");
                })
                .AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel")
                .AddConsoleExporter();
    
            })
            // add the tracing providers
            .WithTracing(tracing =>
            {
              tracing.SetResourceBuilder(resource)
                          .AddAspNetCoreInstrumentation()
                          .AddHttpClientInstrumentation()
                          .AddSqlClientInstrumentation();
            });
    
        return services;
      }
    }
    
  4. [終端機 ] 窗格上,執行此命令來建置專案:

    dotnet build
    

    您應該會看到如以下範例所示的輸出:

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    
  5. 診斷項目現在已可供產品服務使用。

  6. 在 [總管] 窗格的 [解決方案總管] 底下,以滑鼠右鍵按一下 [產品] 專案,然後選取 [新增專案參考]

  7. 選取診斷

  8. EXPLORER窗格中,展開Products資料夾,然後選取Program.cs

  9. 在程序代碼批註 // Add observability code here下,新增對 Diagnostics 方法的呼叫:

    builder.Services.AddObservability("Products", builder.Configuration);
    
  10. [終端機 ] 窗格上,移至 [產品 ] 資料夾:

    cd ../Products
    
  11. 執行此指令以建置專案:

    dotnet build
    

    您應該會看到如以下範例所示的輸出:

    Build succeeded.
        0 Warning(s)
        0 Error(s)
    

更新 Docker 設定並執行應用程式

  1. [終端機 ] 窗格中,移至 dotnet-observability 資料夾的根目錄:

    cd ..
    dotnet publish /p:PublishProfile=DefaultContainer
    
  2. 執行下列 Docker 命令:

    cd /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/
    docker compose up 
    

    後端 (產品服務) 和前端 (商店服務) 容器應該會組建。 然後應用程式就會啟動。

  3. 如果您要在 Codespace 中執行此練習,請選取 Visual Studio Code 視窗底部的 [ ] 索引標籤。 選取前端服務旁的 [在瀏覽器中開啟] 連結。

  4. 如果您要在 Visual Studio Code 中本機執行此練習,請在新的瀏覽器分頁中移至應用程式。http://localhost:32000

  5. 在應用程式中,選取導覽列中 的產品

    顯示 eShopLite 應用程式中 [產品] 頁面的螢幕快照。此頁面會顯示具有名稱、描述和價格的產品清單,以及更新庫存的按鈕。

  6. 針對數個產品選取 [更新庫存 ]。 然後,在對話框中變更庫存值,然後選取 [ 更新]。

  7. 選取 [終端機] 標籤頁,然後向下捲動查看訊息。 請注意,有來自 OpenTelemetry 的訊息,例如:

    backend-1   | Export ec.Microsoft-AspNetCore-Server-Kestrel.connection-queue-length, Meter: OpenTelemetry.Instrumentation.EventCounters/1.5.1.1
    backend-1   | (2023-11-09T19:55:14.8933518Z, 2023-11-09T20:04:44.8596671Z] http.request.method: PUT http.response.status_code: 200 http.route: /api/Stock/{id} network.protocol.name: http network.protocol.version: 1.1 url.scheme: http Histogram      
    backend-1   | Value: Sum: 0.05144170000000001 Count: 4 Min: 0.0039736 Max: 0.0359739
    
  8. Ctrl+C 以停止應用程式。

您已成功將 OpenTelemetry 新增至 產品 服務。 在下一個單元中,您將瞭解如何在 Prometheus 和 Grafana 等工具上檢視遙測數據,以充分利用遙測數據。