演習 - OpenTelemetry をクラウドネイティブ アプリケーションに追加する

完了

この演習では、 eShopLite ソリューションに新しい診断プロジェクトを追加します。 OpenTelemetry NuGet パッケージを含め、 Products サービスに可観測性を追加する方法について説明します。

開発環境を開き、Azure リソースを作成する

演習をホストする GitHub コードスペースを使用するか、Visual Studio Code で演習をローカルで完了することを選択できます。

コードスペースを使用するには、この Codespace 作成テンプレートを使用して、事前構成済みの GitHub コードスペースを作成します

GitHub がコードスペースを作成して構成するまで、この手順には数分かかります。 プロセスが完了すると、演習のコード ファイルが表示されます。 このモジュールの残りの部分で使用されるコードは 、/dotnet-observability ディレクトリにあります。

Visual Studio Code を使用するには、https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative リポジトリをローカル コンピューターに複製します。 その後、以下を実行します。

  1. Visual Studio Code で Dev Container を実行するためのシステム要件をインストールします。
  2. Docker が動作していることを確認します。
  3. 新しい Visual Studio Code ウィンドウで、複製されたリポジトリのフォルダーを開きます。
  4. Ctrl++キーを押してコマンド パレットを開きます。
  5. 検索: >Dev Containers: Rebuild and Reopen in Container
  6. ドロップダウンから eShopLite - dotnet-observability を選択します。 Visual Studio Code により、ローカルで開発コンテナーが作成されます。

ソリューションに診断プロジェクトを追加する

eShopLite アプリに可観測性を追加する最初の手順は、ソリューションに新しい診断プロジェクトを導入することです。 このプロジェクトには、アプリに可観測性を追加するために使用するすべての OpenTelemetry パッケージと構成が含まれています。

  1. Codespace コマンド パレットで、「 >.NET: Open Solution」と入力します。
  2. dotnet-observability/eShopLite/eShopLite.sln を選択します。
  3. ソリューション エクスプローラーの [エクスプローラー] ウィンドウの下部にある eShopLite ソリューションを右クリックし、[新しいプロジェクト] を選択します。
  4. [ テンプレートを選択して新しい .NET プロジェクトを作成する ] ダイアログで、[ クラス ライブラリ (共通、ライブラリ)]を選択します。
  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>
    

    上記のコードは、プロジェクトがライブラリとしてビルドされることを保証します。 それ以外の場合、コンパイラはProgram.cs メソッドを持つmain ファイルを期待します。

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. これで、Productsサービスで診断プロジェクトを使用する準備ができました。

  6. [エクスプローラー] ウィンドウの [ソリューション エクスプローラー] で製品プロジェクトを右クリックし、[プロジェクト参照の追加] を選択します。

  7. [ 診断] を選択します

  8. エクスプローラー ウィンドウで、[製品] フォルダーを展開し、[Program.cs] を選択します。

  9. コード コメント // Add observability code hereの下に、Diagnostics メソッドの呼び出しを追加します。

    builder.Services.AddObservability("Products", builder.Configuration);
    
  10. ターミナル ウィンドウで、Products フォルダーに移動します。

    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 
    

    バックエンド (Products サービス) コンテナーとフロントエンド (ストア サービス) コンテナーを構築する必要があります。 その後、アプリが起動します。

  3. コードスペースでこの演習を行っている場合は、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+キーを押してアプリを停止します。

OpenTelemetry を Products サービスに正常に追加しました。 次のユニットでは、Prometheus や Grafana などのツールでテレメトリ データを表示することで、テレメトリ データをより適切に使用する方法について説明します。