練習 - 將 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. 在 Visual Studio Code 命令選擇區中,輸入 >.NET:開啟解決方案
  2. 選取 dotnet-observability/eShopLite/eShopLite.sln
  3. 在 [方案總管] 的 [檔案總管] 窗格底部,以滑鼠右鍵按一下 [eShopLite] 解決方案,然後選取 [新增專案]
  4. 在 [選取範本以建立新的 .NET 專案] 對話方塊中,選取 [類別庫 (通用、程式庫)]
  5. 在 [名稱] 欄位中,輸入 [診斷]
  6. 在 [專案將建立在] 下拉式清單中,選取 [預設目錄]

新增 OpenTelemetry 套件

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

  1. 使用 Visual Studio Code 底部的 [終端] 窗格,前往 [診斷] 專案資料夾:

    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. 在 [檔案總管] 窗格中,以滑鼠右鍵按一下 [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. 在 [檔案總管] 窗格中,展開 [產品] 資料夾,然後選取 [Program.cs]

  9. 在程式碼註解 // Add observability code here 底下,新增診斷方法的呼叫:

    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 等工具上檢視遙測資料,以充分運用這項資料。