チュートリアル:Application Insights を使用して Service Fabric 上の ASP.NET Core アプリケーションを監視および診断する
このチュートリアルは、シリーズの第 5 部です。 Application Insights を使用して、Service Fabric クラスターで実行されている ASP.NET Core アプリケーションの監視と診断を構成する手順を説明します。 このチュートリアルの第 1 部「.NET Service Fabric アプリケーションを構築する」で開発したアプリケーションからテレメトリを収集します。
シリーズの第 4 部で学習する内容は次のとおりです。
- Application Insights をお使いのアプリケーション用に構成する
- 応答のテレメトリを収集してサービス間の HTTP ベース通信を追跡する
- Application Insights でアプリ マップ機能を使用する
- Application Insights API を使用してカスタム イベントを追加する
このチュートリアル シリーズで学習する内容は次のとおりです。
前提条件
このチュートリアルを開始する前に
- Azure サブスクリプションを持っていない場合は無料アカウントを作成する
- Visual Studio 2019 をインストールし、Azure 開発ワークロードと ASP.NET および Web 開発ワークロードをインストールします。
- Service Fabric SDK をインストールします。
投票サンプル アプリケーションをダウンロードする
このチュートリアル シリーズの第 1 部で投票サンプル アプリケーションをビルドしていない場合は、ダウンロードすることができます。 コマンド ウィンドウまたはターミナルで次のコマンドを実行して、サンプル アプリ リポジトリをローカル コンピューターに複製します。
git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart
Application Insights リソースを設定する
Application Insights は、Azure のアプリケーション パフォーマンス管理プラットフォームであり、アプリケーションを監視および診断するための Service Fabric の推奨プラットフォームです。
Application Insights リソースを作成するには、Azure Portal に移動します。 左側のナビゲーション メニューで [リソースの作成] を選択して Azure Marketplace を開きます。 [監視 + 管理] 、 [Application Insights] の順に選択します。
作成するリソースの属性に関する必要な情報を、ここで入力する必要があります。 適切な名前、リソース グループ、およびサブスクリプションを入力します。 [場所] に、将来 Service Fabric クラスターをデプロイする場所を設定します。 このチュートリアルではローカル クラスターにアプリをデプロイするため、 [場所] フィールドは関係ありません。 [アプリケーションの種類] は "ASP.NET Web アプリケーション" のままにしておく必要があります。
必要な情報を入力したら、 [作成] を選択してリソースをプロビジョニングします。終わるまでに 1 分ほどかかります。
Application Insights をアプリケーションのサービスに追加する
スタート メニューで Visual Studio アイコンを右クリックし、 [管理者として実行] を選択して、昇格された特権で Visual Studio 2019 を起動します。 [ファイル]>[開く]>[プロジェクト/ソリューション] の順に選択し、投票アプリケーション (チュートリアルの第 1 部で作成済みまたは git から複製済み) に移動します。 Voting.sln を開きます。 アプリケーションの NuGet パッケージを復元するかどうかをたずねるプロンプトが表示されたら、 [はい] を選択します。
次の手順に従って、VotingWeb と VotingData の両方のサービス用に Application Insights を構成します。
サービス名を右クリックして、[追加] > [接続済みサービス] > [Application Insights での監視] の順に選択します。
Note
プロジェクト タイプによっては、サービスの名前を右クリックするときに、[追加] > [Application Insights Telemetry] の順に選択する必要があります。
[Get started](作業を開始する) を選択します。
Azure サブスクリプションに使用したアカウントにサインインし、Application Insights リソースを作成したサブスクリプションを選択します。 [リソース] ボックスの [Application Insights の既存のリソース] でリソースを探します。 [登録] を選択して Application Insights をサービスに追加します。
ポップアップ表示されるダイアログ ボックスの操作が完了したら、 [完了] をクリックします。
Note
アプリケーションの両方のサービスで上記の手順を実行して、アプリケーション用の Application Insights の構成を完了します。 受信要求と送信要求、およびサービス間の通信を確認するために、両方のサービスで同じ Application Insights リソースを使用します。
Microsoft.ApplicationInsights.ServiceFabric.Native NuGet をサービスに追加する
Application Insights では、シナリオによって使い分けられる Service Fabric 固有の 2 つの NuGets があります。 1 つは Service Fabric のネイティブ サービスで使用し、もう 1 つはコンテナーおよびゲストの実行可能ファイルで使用します。 今回は、Microsoft.ApplicationInsights.ServiceFabric.Native NuGet を使用し、そこから得られるサービス コンテキストの知識を活用します。 Application Insights SDK と Service Fabric 固有の NuGet パッケージの詳細については、「Microsoft Application Insights for Service Fabric (Service Fabric での Microsoft Application Insights)」を参照してください。
次に、NuGet パッケージを設定する手順を示します。
- ソリューション エクスプローラーの上部にある "Voting" ソリューションを右クリックし、 [ソリューションの NuGet パッケージの管理] を選択します。
- [NuGet - ソリューション] ウィンドウ上部のナビゲーション メニューにある [参照] を選択し、検索バーの横にある [プレリリースを含める] チェック ボックスをオンにします。
Note
Microsoft.ServiceFabric.Diagnostics.Internal パッケージが事前にインストールされていない場合は、Application Insights パッケージをインストールする前に同様の方法でこのパッケージをインストールすることが必要になる場合があります
Microsoft.ApplicationInsights.ServiceFabric.Native
を検索し、適切な NuGet パッケージを選択します。右側で、アプリケーション内の 2 つのサービス ( [VotingWeb] と [VotingData] ) の横にある 2 つのチェック ボックスをオンにして、 [インストール] を選択します。
[変更のプレビュー] ダイアログ ボックスが表示されたら [OK] を選択し、 [ライセンスの同意] に同意します。 これで、サービスへの NuGet の追加が完了します。
今度は 2 つのサービスにテレメトリの初期化子を設定する必要があります。 そのためには、VotingWeb.cs と VotingData.cs を開きます。 両方に対して、次の 2 つの手順を実行します。
- それぞれの <サービス名>.cs の上部で、既存の using ステートメントの下に次の 2 つの using ステートメントを追加します。
using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.ServiceFabric;
- 両方のファイルで、CreateServiceInstanceListeners() または CreateServiceReplicaListeners() の入れ子になった return ステートメント内の ConfigureServices>services の下に、宣言されている他のシングルトン サービスと一緒に以下を追加します。
.AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
これにより、お使いのテレメトリにサービス コンテキストが追加され、Application Insights のテレメトリのソースをより深く理解できるようになります。 VotingWeb.cs の入れ子になった return ステートメントは、次のようになります。
return new WebHostBuilder() .UseKestrel() .ConfigureServices( services => services .AddSingleton<HttpClient>(new HttpClient()) .AddSingleton<FabricClient>(new FabricClient()) .AddSingleton<StatelessServiceContext>(serviceContext) .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))) .UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup<Startup>() .UseApplicationInsights() .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None) .UseUrls(url) .Build();
同様に、VotingData.cs では次のようになります。
return new WebHostBuilder() .UseKestrel() .ConfigureServices( services => services .AddSingleton<StatefulServiceContext>(serviceContext) .AddSingleton<IReliableStateManager>(this.StateManager) .AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))) .UseContentRoot(Directory.GetCurrentDirectory()) .UseStartup<Startup>() .UseApplicationInsights() .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl) .UseUrls(url) .Build();
上記のように、VotingWeb.cs と VotingData.cs の両方のファイルで UseApplicationInsights()
メソッドが呼び出されていることを再度確認します。
Note
このサンプル アプリでは、サービスの通信に http を使用します。 サービスのリモート処理 V2 を使用してアプリを開発する場合は、上記と同じ場所に次のコード行も追加する必要があります
ConfigureServices(services => services
...
.AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
.AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)
この時点で、アプリケーションをデプロイする準備が整いました。 上部にある [開始] を選択する (または F5 キーを押す) と、Visual Studio でアプリケーションがビルドおよびパッケージ化され、ローカル クラスターが設定され、そのクラスターにアプリケーションがデプロイされます。
Note
.NET Core SDK の最新バージョンがインストールされていないと、ビルド エラーが発生することがあります。
アプリケーションのデプロイが完了した後に localhost:8080
にアクセスすると、単一ページの投票アプリケーションのサンプルを確認できます。 サンプル データとテレメトリを作成する項目をいくつか選んで投票します。この例ではデザートにしています!
投票を追加し終わったら、投票オプションの一部を削除することもできます。
Application Insights でテレメトリとアプリ マップを表示する
Azure Portal で、Application Insights リソースのページに移動します。
[概要] を選択して、お使いのリソースのランディング ページに戻ります。 次に、上部の [検索] を選択して受信トレースを確認します。 Application Insights にトレースが表示されるまで数分かかります。 何も表示されない場合は、しばらく待ってから上部の [更新] をクリックします。
[検索] ウィンドウを下にスクロールすると、Application Insights ですぐに利用できるすべての受信テレメトリが表示されます。 投票アプリケーションで行った操作ごとに、VotingWeb からの送信 PUT 要求 (PUT Votes/Put [name]) と VotingData からの受信 PUT 要求 (PUT VoteData/Put [name]) が発生し、その後、 表示データを最新の情報に更新するように求める GET 要求が対になって発生します。 それらは HTTP 要求であるため、ローカルホストでも HTTP に対する依存関係トレースが発生します。 1 つの投票がどのように追加されるかが分かるサンプルを次に示します。
いずれかのトレースを選択すると、その詳細を表示できます。 Application Insights で提供される情報には、応答時間や要求 URL など、要求に関する有用な情報があります。 また、Service Fabric 固有の NuGet を追加したため、後述の Custom Data セクションでは、お使いのアプリケーションに関する情報を Service Fabric クラスターのコンテキストで取得することもできます。 これにはサービス コンテキストが含まれるため、要求のソースの PartitionID と ReplicaId を確認して、アプリケーションでのエラー診断時に問題箇所を適切に特定することができます。
さらに、[概要] ページの左側のメニューの [アプリケーション マップ] をクリックするか、 [アプリ マップ] アイコンを選択すると、2 つのサービスが接続されていることを示すアプリ マップが表示されます。
アプリ マップを利用すると、アプリケーションのトポロジをより深く理解できます。特に、連携して動く複数の異なるサービスを追加し始めるときには有用です。 また、これによって要求の成功率に関する基本的なデータを取得し、失敗した要求を診断して、問題が起きた可能性のある場所を把握するのに役立てることもできます。 アプリ マップの使用方法について詳しくは、「Application Insights のアプリケーション マップ」をご覧ください。
カスタム インストルメンテーションをアプリケーションに追加する
Application Insights では多くのテレメトリをすぐに利用できますが、さらにカスタム インストルメンテーションを追加することもできます。 これは、ビジネス ニーズに基づいて行うことも、またはアプリケーションでの問題発生時に診断を改善するために行うこともできます。 Application Insights にはカスタム イベントとメトリックを取り込める API があります。詳細についてはこちらをご覧ください。
VoteDataController.cs (VotingData>Controllers の下) にカスタム イベントを追加して、基礎となる votesDictionary に対していつ投票が追加され、削除されるかを追跡します。
- 他の using ステートメントの最後に
using Microsoft.ApplicationInsights;
を追加します。 - クラスの最初の IReliableStateManager の作成の下で、新しい TelemetryClient を次のように宣言します。
private TelemetryClient telemetry = new TelemetryClient();
- Put() 関数に、投票が追加されたことを確認するイベントを追加します。 トランザクションが完了した後の、return OkResult ステートメントの直前に
telemetry.TrackEvent($"Added a vote for {name}");
を追加します。 - Delete() には、votesDictionary に指定された投票オプションに対応する投票を含むという条件の "if/else" が存在します。
- 投票が削除されたことを確認するイベントを、if ステートメント内の await tx.CommitAsync() の後に追加します。
telemetry.TrackEvent($"Deleted votes for {name}");
- 削除が行われなかったことを示すイベントを、else ステートメント内の以下の return ステートメントの前に追加します。
telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
- 投票が削除されたことを確認するイベントを、if ステートメント内の await tx.CommitAsync() の後に追加します。
以下に、イベントを追加した後の Put() 関数と Delete() 関数の例を示します。
// PUT api/VoteData/name
[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");
using (ITransaction tx = this.stateManager.CreateTransaction())
{
await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
await tx.CommitAsync();
}
telemetry.TrackEvent($"Added a vote for {name}");
return new OkResult();
}
// DELETE api/VoteData/name
[HttpDelete("{name}")]
public async Task<IActionResult> Delete(string name)
{
var votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");
using (ITransaction tx = this.stateManager.CreateTransaction())
{
if (await votesDictionary.ContainsKeyAsync(tx, name))
{
await votesDictionary.TryRemoveAsync(tx, name);
await tx.CommitAsync();
telemetry.TrackEvent($"Deleted votes for {name}");
return new OkResult();
}
else
{
telemetry.TrackEvent($"Unable to delete votes for {name}, voting option not found");
return new NotFoundResult();
}
}
}
これらの変更が完了したら、アプリケーションを [開始] して、最新バージョンのビルドとデプロイを行います。 アプリケーションのデプロイが完了したら、localhost:8080
にアクセスし、一部の投票オプションの追加と削除を行います。 次に、Application Insights リソースに戻って、最新の実行に関するトレースを確認します (前と同様に、トレースが Application Insights に表示されるまでに 1、2 分かかります)。 追加および削除したすべての投票の "カスタム イベント"\* が、すべての応答のテレメトリとともに表示されます。
次の手順
このチュートリアルでは、以下の内容を学習しました。
- Application Insights をお使いのアプリケーション用に構成する
- 応答のテレメトリを収集してサービス間の HTTP ベース通信を追跡する
- Application Insights でアプリ マップ機能を使用する
- Application Insights API を使用してカスタム イベントを追加する
ASP.NET アプリケーションの監視と診断の設定が完了したところで、以下を試してみてください。
- Service Fabric での監視と診断についてさらに詳しく知る
- Application Insights を使用した Service Fabric イベントの分析
- Application Insights の詳細については、Application Insights のドキュメントをご覧ください。