演習 - クラウドネイティブ アプリケーションで OpenTelemetry データを使う
この演習では、アプリ内の OpenTelemetry によって生成されたすべてのデータの可視性を向上させます。 Store サービスへの診断機能の追加を完了させます。 それが完了したら、Prometheus と Grafana を eShopLite サービスに追加し、取り込まれているメトリックの一部を確認します。 次の手順では、Zipkin を追加し、分散トレースを表示します。 最後に、Application Insights をアプリに追加し、それを使用してデータを表示します。
Prometheus と Grafana を追加する
Prometheus と Grafana には、プロジェクトに簡単に追加できる Docker イメージが用意されています。 ソリューションのルートにある docker-compose.yml ファイルに含めます。
Visual Studio Code の [エクスプローラー] ペインで、docker-compose.yml ファイルを選びます。
この YAML をファイルの末尾に追加します。
prometheus: image: prom/prometheus container_name: prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' ports: - 9090:9090 restart: unless-stopped volumes: - ./prometheus:/etc/prometheus grafana: image: grafana/grafana container_name: grafana ports: - 3000:3000 restart: unless-stopped environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=grafana volumes: - ./grafana/datasource:/etc/grafana/provisioning/datasources
上記の Docker yaml により、Prometheus と Grafana という 2 つの新しいサービスが追加されます。 Prometheus セクションでは、ポート 9090 で応答するようにコンテナーを構成します。 prometheus.yml ファイルを想定して prometheus フォルダーがマップされます。 Grafana セクションでは、ポート 3000で応答するようにコンテナーを構成します。 grafana フォルダー内の 3 つのフォルダーがマップされます。
Prometheus を構成する
Prometheus は、メトリックを収集する場所を認識できるように構成する必要があります。 prometheus.yml ファイルを prometheus フォルダーに追加します。
Visual Studio Code の [エクスプローラー] ペインで、dotnet-observability フォルダーを右クリックし、[新しいフォルダー] を選びます。
[名前] フィールドに「prometheus」と入力します。
[エクスプローラー] ペインで、prometheus フォルダーを右クリックし、[新しいファイル] を選びます。
[名前] フィールドに「prometheus.yml」と入力します。
ファイル エディターで、次の YAML を入力します。
global: scrape_interval: 1s scrape_configs: - job_name: 'products' static_configs: - targets: ['backend:8080'] - job_name: 'store' static_configs: - targets: ['frontend:8080']
上記の YAML は、バックエンドとフロントエンドのサービスからメトリックをスクレイピングするように Prometheus を構成します。 アプリは Docker で実行されているため、そのホスト名がサービス名になります。
Ctrl+S を選択して、ファイルを保存します。
Grafana の構成
Grafana は、メトリックを収集する場所を認識できるように構成する必要があります。
Visual Studio Code の [エクスプローラー] ペインで、dotnet-observability フォルダーを右クリックし、[新しいフォルダー] を選びます。
[名前] フィールドに、「grafana」と入力します。
grafana フォルダーを右クリックし、[新しいフォルダー] を選びます。
[名前] フィールドに、「datasource」と入力します。
grafana フォルダーを右クリックし、[新しいフォルダー] を選びます。
[名前] フィールドに、「dashboard」と入力します。
grafana フォルダーを展開し、datasource フォルダーを右クリックし、[新しいファイル] を選びます。
[名前] フィールドに、「datasource.yml」と入力します。
[エディター] タブで、次の YAML を入力します。
apiVersion: 1 datasources: - name: Prometheus type: prometheus url: http://prometheus:9090 isDefault: true access: proxy editable: true
上記の YAML は、データ ソースとして Prometheus を使用するように Grafana を構成します。
Ctrl+S を選択して、ファイルを保存します。
Prometheus にメトリックを公開するように ASP.NET Core アプリを更新する
現在、診断プロジェクトは、コンソールに対してのみメトリックを公開するように構成されています。 代わりに、Prometheus にメトリックを公開するようにプロジェクトを更新します。
Visual Studio Code の下部にある [ターミナル] ペインで、Diagnostics フォルダーに移動します。
このコマンドを実行します。
cd .\eShopLite\Diagnostics\
OpenTelemetry.Exporter.Console
パッケージを削除します。dotnet remove package OpenTelemetry.Exporter.Console
OpenTelemetry.Exporter.Prometheus.AspNetCore
パッケージを追加します。dotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore --prerelease
[エクスプローラー] ペインで、Diagnostics フォルダーを展開し、DiagnosticServiceCollectionExtensions.cs を選びます。
コンソール エクスポーター
.AddConsoleExporter();
を次のコードに置き換えます。.AddPrometheusExporter();
ファイルの一番下にある最後の
}
の前に、次のコードを追加します。public static void MapObservability(this IEndpointRouteBuilder routes) { routes.MapPrometheusScrapingEndpoint(); }
このコードは、アプリでこれを含むすべてのサービスに Prometheus スクレイピング エンドポイントを追加します。 これにより、Prometheus が
http://service/metrics
からメトリックをスクレイピングできるようになります。Ctrl+S を選択して、ファイルを保存します。
Store サービスでメトリックを公開する
アプリは現在、Products サービスにのみメトリックを公開するように構成されています。 Store サービスにもメトリックを公開するようにアプリを更新します。
[エクスプローラー] ペインのソリューション エクスプローラーで、Store プロジェクトを右クリックし、[プロジェクト参照の追加] を選びます。
[診断]を選択します。
[エクスプローラー] ペインで、Store フォルダーを展開し、Program.cs を選びます。
コード コメント
// Add observability code here
の下に、Diagnostics メソッドの呼び出しを追加します。builder.Services.AddObservability("Store", builder.Configuration);
app.Run()
メソッドの前に、次のコードを追加します。app.MapObservability();
このメソッドは、Prometheus スクレイピング エンドポイントを Store サービスに追加します。
Ctrl+S を選択して、ファイルを保存します。
[エクスプローラー] ペインで、Product フォルダーを展開し、Program.cs を選びます。
app.Run()
メソッドの前に、次のコードを追加します。app.MapObservability();
このメソッドは、Prometheus スクレイピング エンドポイントを Product サービスに追加します。
Ctrl+S を選択して、ファイルを保存します。
新しい監視機能をテストする
次に、アプリに追加した新しい監視機能をテストします。
下部の [ターミナル] ペインで、dotnet-observability/eShopLite フォルダーに移動します。
cd ..
アプリ コンテナーを更新します。
dotnet publish /p:PublishProfile=DefaultContainer
dotnet-observability フォルダーに移動し、Docker でアプリを起動します。
cd .. docker compose up
[ポート] タブの Prometheus (9090) で [ブラウザーで開く] を選びます。 Visual Studio Code でローカルで実行している場合は、ブラウザーを開き、新しいタブで Prometheus アプリ
http://localhost:9090
に移動します。上部のメニューで、[状態]、[ターゲット] の順に選びます。
Productsと Store のサービスが UP として一覧表示されます。
[ポート] タブの Grafana (3000) で [ブラウザーで開く] を選びます。 Visual Studio Code でローカルで実行している場合は、ブラウザーを開き、新しいタブで Grafana アプリ
http://localhost:3000
に移動します。ユーザー名「admin」を入力します。
パスワード「grafana」を入力します。
[最初のダッシュボードの作成] を選びます。
[ダッシュボードのインポート] を選びます。
新しいタブで GitHub に移動し、ASP.NET Core ダッシュボード json ファイルを開きます。
"生" ファイルをコピーします。
この JSON を [ダッシュボード経由の JSON モデルのインポート] テキスト ボックスに貼り付けます。
[読み込み] を選択します。
[Prometheus データ ソース] ドロップダウンで、[Prometheus] を選びます。
インポート を選択します。
Products と Store のサービスのメトリックを示すダッシュボードが表示されます。 2 つのサービス間で変更するジョブを選びます。
[ターミナル] ペインで、Ctrl+C キーを押してアプリを停止します。
Zipkin を追加する
次に、Zipkin を追加して、アプリのトレース機能を拡張します。 前に行ったように、Zipkin コンテナーをアプリに追加し、OpenTelemetry コレクターに接続するように構成します。 次に、OpenTelemetry Zipkin エクスポーターをアプリに追加します。
Visual Studio Code の [エクスプローラー] ペインで dotnet-observability フォルダー内の docker-compose.yml ファイルを選びます。
frontend
のdepends_on
にprometheus
とzipkin
を追加します。depends_on: - backend - prometheus - zipkin
backend
のdepends_on
にprometheus
を追加します。depends_on: - prometheus
Zipkin の環境変数を
frontend
とbackend
の両方に追加します。environment: - ZIPKIN_URL=http://zipkin:9411
2 つのサービスは次のようになります。
frontend: image: storeimage build: context: . dockerfile: ./eShopLite/Store/Dockerfile environment: - ProductEndpoint=http://backend:8080 - ZIPKIN_URL=http://zipkin:9411 ports: - "32000:8080" depends_on: - backend - prometheus - zipkin backend: image: productservice build: context: . dockerfile: ./eShopLite/Products/Dockerfile environment: - ZIPKIN_URL=http://zipkin:9411 ports: - "32001:8080" depends_on: - prometheus
この YAML をファイルの末尾に追加します。
zipkin: image: openzipkin/zipkin ports: - 9411:9411
上記の YAML は、Zipkin コンテナーをアプリに追加します。 これは、Zipkin コンテナーがポート 9411 で応答するように構成します。
Ctrl+S を選択して、ファイルを保存します。
[ターミナル] ペインで、Diagnostics フォルダーに移動します。
cd ./eShopLite/Diagnostics/
Zipkin エクスポート パッケージを追加します。
dotnet add package OpenTelemetry.Exporter.Zipkin --prerelease
[エクスプローラー] ペインで、Diagnostics フォルダーを展開し、DiagnosticServiceCollectionExtensions.cs を選びます。
トレース プロバイダーの末尾に、Zipkin を追加します。
// add the tracing providers .WithTracing(tracing => { tracing.SetResourceBuilder(resource) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddSqlClientInstrumentation() .AddZipkinExporter(zipkin => { var zipkinUrl = configuration["ZIPKIN_URL"] ?? "http://zipkin:9411"; zipkin.Endpoint = new Uri($"{zipkinUrl}/api/v2/spans"); }); });
Ctrl+S を選択して、ファイルを保存します。
下部の [ターミナル] ペインで、dotnet-observability/eShopLite フォルダーに移動します。
cd ..
アプリ コンテナーを更新します。
dotnet publish /p:PublishProfile=DefaultContainer
dotnet-observability フォルダーに移動し、Docker でアプリを起動します。
cd .. docker compose up
[ポート] タブの Prometheus (9090) で [ブラウザーで開く] を選びます。 Visual Studio Code でローカルで実行している場合は、新しいブラウザー タブを開き、Zipkin アプリ
http://localhost:9411
に移動します。メニューで [依存関係] を選びます。
[ターミナル] ペインで、Ctrl+C キーを押してアプリを停止します。
Application Insights を追加する
最後の手順は、Application Insights をアプリに追加することです。
Azure で Application Insights リソースを作成する
Visual Studio Code の [ターミナル] ペインで、Azure にサインインします。
az login --use-device-code
選択された Azure サブスクリプションを表示します。
az account show -o table
間違ったサブスクリプションが選択されている場合は、az account set コマンドを使って正しいものを選びます。
Application Insights の拡張機能を追加します。
az extension add -n application-insights
Application Insights のリソースを作成します。
az monitor app-insights component create --app eShopLiteInsights --location eastus --kind web -g eShopLite
次のように出力されます。
{ "appId": "fb6e1af0-7556-469d-a31f-85e4550c8fde", "applicationId": "eShopLiteInsights", "applicationType": "web", "connectionString": "InstrumentationKey=00000000-0000-0000-0000-000000000000;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/", "creationDate": "2023-11-10T16:50:00.950726+00:00", "disableIpMasking": null, "etag": "\"3a02952a-0000-0100-0000-654e5f380000\"", "flowType": "Bluefield", "hockeyAppId": null, "hockeyAppToken": null, "id": "/subscriptions/7eebce2a-0884-4df2-8d1d-2a3c051e47fe/resourceGroups/eShopLite/providers/microsoft.insights/components/eShopLiteInsights", "immediatePurgeDataOn30Days": null, "ingestionMode": "ApplicationInsights", "instrumentationKey": "00000000-0000-0000-0000-000000000000", "kind": "web", "location": "eastus", "name": "eShopLiteInsights", "privateLinkScopedResources": null, "provisioningState": "Succeeded", "publicNetworkAccessForIngestion": "Enabled", "publicNetworkAccessForQuery": "Enabled", "requestSource": "rest", "resourceGroup": "eShopLite", "retentionInDays": 90, "samplingPercentage": null, "tags": {}, "tenantId": "7eebce2a-0884-4df2-8d1d-2a3c051e47fe", "type": "microsoft.insights/components" }
上記の返された JSON から、".を除く
connectionString
をコピーします。 次に例を示します。InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
Visual Studio Code の [エクスプローラー] ペインで、docker-compose.yml ファイルを選びます。
Application Insights に接続するために診断プロジェクトで使用される環境変数を追加します。 この YAML を Store サービスに追加します。
environment: - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
上記の接続文字列を、Azure CLI からコピーしたものに置き換えます。
Product サービスに対して、これらの手順を繰り返します。 YAML は最終的に次のようになります。
frontend: image: storeimage build: context: . dockerfile: ./eShopLite/Store/Dockerfile environment: - ProductEndpoint=http://backend:8080 - ZIPKIN_URL=http://zipkin:9411 - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/ ports: - "32000:8080" depends_on: - backend - prometheus - zipkin backend: image: productservice build: context: . dockerfile: ./eShopLite/Products/Dockerfile environment: - ZIPKIN_URL=http://zipkin:9411 - APPLICATIONINSIGHTS_CONNECTION_STRING=InstrumentationKey=b851fa75-85a2-42f7-bb6f-413725d9d8ba;IngestionEndpoint=https://eastus-2.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/
Ctrl+S を選択して、ファイルを保存します。
[ターミナル] ペインで、Diagnostics フォルダーに移動します。
cd .\eShopLite\Diagnostics\
Application Insights エクスポーター パッケージを追加します。
dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore --prerelease
[エクスプローラー] ペインで、Diagnostics フォルダー、DiagnosticServiceCollectionExtensions.cs の順に選びます。
ファイルの先頭に、次の
using
ステートメントを追加します。using Azure.Monitor.OpenTelemetry.AspNetCore;
var otelBuilder = services.AddOpenTelemetry();
の下に、次のコードを追加します。if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"])) { otelBuilder.UseAzureMonitor(); }
Ctrl+S を選択して、ファイルを保存します。
下部の [ターミナル] ペインで、dotnet-observability/eShopLite フォルダーに移動します。
cd ..
アプリ コンテナーを更新します。
dotnet publish /p:PublishProfile=DefaultContainer
dotnet-observability フォルダーに移動し、Docker でアプリを起動します。
cd .. docker compose up
Azure CLI へのサインインに使用したのと同じ資格情報を使用して、Azure portal にサインインします。
Azure portal で、[リソース グループ] を選択します。
eShopLite リソース グループを選びます。
eShopLiteInsights Application Insights リソースを選びます。
[アプリケーション ダッシュボード] を選びます。
メトリックの変更を確認するには、eShopLite アプリに移動して在庫を変更します。 次に、Application Insights ダッシュボードを更新します。
[ターミナル] ペインで、Ctrl+C キーを押してアプリを停止します。