演習 - 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 リポジトリをローカル コンピューターに複製します。 その後、以下を実行します。
- Visual Studio Code で Dev Container を実行するためのシステム要件をインストールします。
- Docker が動作していることを確認します。
- 新しい Visual Studio Code ウィンドウで、複製されたリポジトリのフォルダーを開きます。
- Ctrl++キーを押してコマンド パレットを開きます。
- 検索: >Dev Containers: Rebuild and Reopen in Container
- ドロップダウンから eShopLite - dotnet-observability を選択します。 Visual Studio Code により、ローカルで開発コンテナーが作成されます。
ソリューションに診断プロジェクトを追加する
eShopLite アプリに可観測性を追加する最初の手順は、ソリューションに新しい診断プロジェクトを導入することです。 このプロジェクトには、アプリに可観測性を追加するために使用するすべての OpenTelemetry パッケージと構成が含まれています。
- Codespace コマンド パレットで、「 >.NET: Open Solution」と入力します。
- dotnet-observability/eShopLite/eShopLite.sln を選択します。
- ソリューション エクスプローラーの [エクスプローラー] ウィンドウの下部にある eShopLite ソリューションを右クリックし、[新しいプロジェクト] を選択します。
- [ テンプレートを選択して新しい .NET プロジェクトを作成する ] ダイアログで、[ クラス ライブラリ (共通、ライブラリ)]を選択します。
- [ 名前 ] フィールドに「 診断」と入力します。
- プロジェクトがドロップダウンで作成されます。ファイル パス ディレクトリが /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/eShopLite/ であることを確認します。
OpenTelemetry パッケージを追加する
次に、OpenTelemetry パッケージを新しい診断プロジェクトに追加します。
Codespace の下部にある ターミナル ウィンドウを使用して、 診断 プロジェクト フォルダーに移動します。
cd dotnet-observability/eShopLite/Diagnostics次の
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[エクスプローラー] ウィンドウで、[診断] フォルダーを展開し、[Diagnostics.csproj] を選択します。
上部の
Project Sdkを次の値に変更します。<Project Sdk="Microsoft.NET.Sdk.Web">上記のコードを使用すると、コード内で
IConfigurationクラスを使用できます。<PropertyGroup>で、出力の種類を追加します。<OutputType>Library</OutputType>上記のコードは、プロジェクトがライブラリとしてビルドされることを保証します。 それ以外の場合、コンパイラは
Program.csメソッドを持つmainファイルを期待します。
OpenTelemetry を使用するコードを追加する
OpenTelemetry パッケージが追加されたので、それらを利用するコードを導入しました。
エクスプローラー ウィンドウで、Class1.cs ファイルを右クリックし、[名前の変更] を選択します。
ファイルの名前を DiagnosticServiceCollectionExtensions.cs に変更します。
ファイルのコードを以下のコードに置き換えます。
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; } }ターミナル ウィンドウで、次のコマンドを実行してプロジェクトをビルドします。
dotnet build次の例のような出力が表示されます。
Build succeeded. 0 Warning(s) 0 Error(s)これで、Productsサービスで診断プロジェクトを使用する準備ができました。
[エクスプローラー] ウィンドウの [ソリューション エクスプローラー] で、製品プロジェクトを右クリックし、[プロジェクト参照の追加] を選択します。
[ 診断] を選択します。
エクスプローラー ウィンドウで、[製品] フォルダーを展開し、[Program.cs] を選択します。
コード コメント
// Add observability code hereの下に、Diagnostics メソッドの呼び出しを追加します。builder.Services.AddObservability("Products", builder.Configuration);ターミナル ウィンドウで、Products フォルダーに移動します。
cd ../Products次のコマンドを実行してプロジェクトをビルドします。
dotnet build次の例のような出力が表示されます。
Build succeeded. 0 Warning(s) 0 Error(s)
Docker の設定を更新してアプリを実行する
ターミナル ウィンドウで、dotnet-observability フォルダーのルートに移動します。
cd .. dotnet publish /p:PublishProfile=DefaultContainer次の Docker コマンドを実行します。
cd /workspaces/mslearn-dotnet-cloudnative/dotnet-observability/ docker compose upバックエンド (Products サービス) コンテナーとフロントエンド (ストア サービス) コンテナーを構築する必要があります。 その後、アプリが起動します。
コードスペースでこの演習を行っている場合は、Visual Studio Code ウィンドウの下部にある [ ポート ] タブを選択します。 フロントエンド サービスの横にある [ブラウザーで開く] リンクを選択します。
Visual Studio Code でローカルでこの演習を行っている場合は、新しいブラウザー タブで、
http://localhost:32000のアプリに移動します。アプリで、ナビゲーション バーの [製品 ] を選択します。
いくつかの製品の 更新在庫 を選択します。 次に、ダイアログで在庫値を変更し、[ 更新] を選択します。
[ターミナル] タブを選択し、メッセージをスクロールします。 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.0359739Ctrl+キーを押してアプリを停止します。
OpenTelemetry を Products サービスに正常に追加しました。 次のユニットでは、Prometheus や Grafana などのツールでテレメトリ データを表示することで、テレメトリ データをより適切に使用する方法について説明します。
![eShopLite アプリの [製品] ページを示すスクリーンショット。このページには、名前、説明、価格を含む製品の一覧と、在庫を更新するためのボタンが表示されます。](../../aspnetcore/implement-observability-cloud-native-app-with-opentelemetry/media/eshoplite-products.png)