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

完了

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

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

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

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

  1. Visual Studio Code のコマンド パレットで、「>.NET:Open Solution」と入力します。
  2. dotnet-observability/eShopLite/eShopLite.sln を選びます。
  3. [エクスプローラー] ペインの下部にある [ソリューション エクスプローラー] で、[eShopLite] ソリューションを右クリックし、[新しいプロジェクト] を選択します。
  4. [テンプレートを選択して新しい .NET プロジェクトを作成する] ダイアログで、[クラス ライブラリ (共通、ライブラリ)] を選択します。
  5. [名前] フィールドに、「Diagnostics」と入力します。
  6. [Project will be created in] (プロジェクトの作成場所) ドロップダウンで、[既定のディレクトリ] を選択します。

OpenTelemetry パッケージを追加する

次に、OpenTelemetry パッケージを新しい診断プロジェクトに追加します。

  1. Visual Studio Code の下部にある [ターミナル] ペインを使用して、[Diagnostics] プロジェクト フォルダーに移動します。

    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] フォルダーを展開し、[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. これで、Diagnostics プロジェクトを Products サービスで使用する準備ができました。

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

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

  8. [エクスプローラー] ペインで、[Products] フォルダーを展開し、[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 サービス) およびフロントエンド (Store サービス) のコンテナーがビルドされます。 その後、アプリケーションが起動します。

  3. codespace でこの演習を行っている場合は、Visual Studio Code ウィンドウの下部にある [ルート] タブを選択します。 [フロントエンド] サービスの横にある [ブラウザーで開く] リンクを選択します。

  4. Visual Studio Code でこの演習を行っている場合は、新しいブラウザー タブで、http://localhost:32000 のアプリに移動します。

  5. アプリのナビゲーション バーで、[製品] を選択します。

    eShopLite アプリの [製品] ページを示すスクリーンショット。このページには、名前、説明、価格を含む製品の一覧と、在庫を更新するボタンが表示されます。

  6. いくつかの商品の[Update Stock] (在庫の更新)を選択します。 次に、ダイアログで在庫の値を変更し、[更新] を選択します。

  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 が Products サービスに正常に追加されました。 次のユニットでは、テレメトリ データを Prometheus や Grafana などのツールに表示して、より有効に活用する方法を確認します。