チュートリアル: Application Insights を使用して Service Fabric アプリケーションを監視および診断する
このチュートリアルは、シリーズの第 5 部です。 Application Insights を使用して、Azure Service Fabric クラスターで実行されている ASP.NET Core アプリケーションの監視と診断を構成する手順を説明します。 チュートリアル シリーズ第 1 部で開発したアプリケーションからテレメトリを収集します。
このチュートリアルでは、次の作業を行う方法について説明します。
- Application Insights リソースを設定する
- Application Insights をアプリケーションのサービスに追加する
- Application Insights でテレメトリとアプリケーション マップを表示する
- カスタム インストルメンテーションをアプリケーションに追加する
このチュートリアル シリーズでは、次の操作方法について説明します。
- .NET Service Fabric アプリケーションを構築する
- アプリケーションをリモート クラスターにデプロイする
- ASP.NET Core フロントエンド サービスに HTTPS エンドポイントを追加する
- Azure Pipelines を使用して CI/CD を構成する
- アプリケーションの監視と診断を設定する (このチュートリアル)
前提条件
このチュートリアルを開始する前に
- Azure サブスクリプションをお持ちでない場合は、無料アカウントを作成してください。
- [Azure の開発] ワークロード、[ASP.NET および Web の開発] ワークロードを含む、Visual Studio 2019 をインストールします。
- Service Fabric SDK をインストールします。
投票サンプル アプリケーションをダウンロードする
このチュートリアル シリーズの第 1 部で投票サンプル アプリケーションをビルドしていない場合は、ダウンロードすることができます。 コマンド ウィンドウまたはターミナルで次のコマンドを実行して、サンプル アプリ リポジトリをローカル コンピューターに複製します。
git clone https://github.com/Azure-Samples/service-fabric-dotnet-quickstart
Application Insights リソースを設定する
Application Insights は Azure アプリケーションのパフォーマンス プラットフォームです。 Service Fabric でのアプリケーションの監視と診断では、Application Insights を使用することをお勧めします。
Application Insights リソースを作成するには、Azure portal に移動します。 [リソースの作成] を選択します。 ポータル メニューで、[監視と診断] を選択します。 [一般的な Azure サービス] 列の [Application Insights] で、[作成] を選択します。
[サブスクリプション]、[リソース グループ]、[名前] の値を入力または選択します。 [リージョン] で、将来 Service Fabric クラスターをデプロイする場所を選択します。 このチュートリアルではローカル クラスターにアプリをデプロイするため、Azure リージョンは関係ありません。 [アプリケーションの種類] では [ASP.NET Web アプリケーション] のままにしておきます。
必要な情報を入力または選択したら、[作成] を選択してリソースをプロビジョニングします。 リソースは約 1 分でデプロイされます。
Application Insights をアプリケーションのサービスに追加する
[管理者として実行] オプション ([スタート] メニューで Visual Studio アイコンを右クリック) を使用して、Visual Studio 2019 を開きます。 [ファイル]>[開く]>[プロジェクト/ソリューション] の順に選択し、投票アプリケーション (チュートリアルの第 1 部で作成済みまたは GitHub から複製済み) に移動します。 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 つの NuGet パッケージがあります。 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 パッケージを設定するには、次の操作を行います。
ソリューション エクスプローラーで、[ソリューションの '投票'] を右クリックし、[ソリューションの NuGet パッケージの管理] を選択します。
[NuGet - ソリューション] ダイアログで、[参照] を選択します。 [プレリリースを含める] チェック ボックスをオンにします。
Note
Microsoft.ServiceFabric.Diagnostics.Internal パッケージが事前にインストールされていない場合は、Application Insights パッケージをインストールする前に同じ方法でこのパッケージをインストールすることが必要になる場合があります。
Microsoft.ApplicationInsights.ServiceFabric.Native を検索し、NuGet パッケージを選択します。
右側のウィンドウで、VotingWeb チェックボックスと VotingData をオンにします。 [インストール] を選択します。
[変更のプレビュー] ダイアログで [OK] を選択してライセンスを承諾します。 NuGet パッケージがサービスに追加されます。
次に、2 つのサービスにテレメトリの初期化子を設定します。 VotingWeb.cs と VotingData.cs を開きます。 両方のコード ファイルで次の手順を実行します。
それぞれのファイルの上部で、既存の
using
ステートメントの下に次の 2 つのusing
ステートメントを追加します。using Microsoft.ApplicationInsights.Extensibility; using Microsoft.ApplicationInsights.ServiceFabric;
両方のファイルで、
CreateServiceInstanceListeners()
またはCreateServiceReplicaListeners()
の入れ子になったreturn
ステートメントのConfigureServices
>services
の下に、他のシングルトン サービスを宣言して、以下を追加します。.AddSingleton<ITelemetryInitializer>((serviceProvider) => FabricTelemetryInitializerExtension.CreateFabricTelemetryInitializer(serviceContext))
これにより、お使いのテレメトリに
Service Context
が追加され、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 を使用します。 Service Fabric Service Remoting V2 を使用してアプリを開発する場合は、コードの同じ場所に次の行も追加します。
ConfigureServices(services => services
...
.AddSingleton<ITelemetryModule>(new ServiceRemotingDependencyTrackingTelemetryModule())
.AddSingleton<ITelemetryModule>(new ServiceRemotingRequestTrackingTelemetryModule())
)
この時点で、アプリケーションをデプロイする準備が整いました。 [開始] を選択します (または、F5 を選択します)。 Visual Studio では、アプリケーションが構築されてパッケージ化され、ローカル クラスターを設定し、アプリケーションをクラスターにデプロイします。
Note
.NET Core SDK の最新バージョンがインストールされていないと、ビルド エラーが発生することがあります。
アプリケーションがデプロイされたら、Voting Sample シングル ページ アプリケーションを実行している localhost:8080
に移動します。 サンプル データとテレメトリを作成する項目をいくつか選んで投票します。 たとえば、デザートがあります。
投票を追加し終わったら、投票オプションの一部を削除することもできます。
Application Insights でテレメトリとアプリケーション マップを表示する
Azure portal で、お使いの Application Insights リソースに移動します。
[概要] を選択して、お使いのリソースの概要ウィンドウに戻ります。 [検索] を選択して受信トレースを確認します。 Application Insights にトレースが表示されるまで数分かかります。 トレースが表示されない場合は、1 分間待ってから [更新] ボタンを選択します。
検索ウィンドウを下にスクロールすると、Application Insights に付属するすべての受信テレメトリが表示されます。 投票アプリケーションで行った操作ごとに、VotingWeb からの送信 PUT 要求 (PUT Votes/Put [name]) と VotingData からの受信 PUT 要求 (PUT VoteData/Put [name]) が発生し、その後、 表示データを最新の情報に更新するように求める GET 要求が対になって発生します。 これらの要求は HTTP 要求であるため、localhost
でも 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()
関数に、投票が追加されたことを確認するイベントを追加します。 トランザクションが完了した後の、returnOkResult
ステートメントの直前に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");
- 投票が削除されたことを確認するイベントを、
イベントを追加した後に見える可能性のある 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 分かかります)。 追加および削除したすべての投票の "カスタム イベント" と関連する応答のテレメトリのエントリが表示されます。
関連するコンテンツ
- Service Fabric での監視と診断を参照してください。
- 「Application Insights を使用した Service Fabric イベントの分析」を参照してください。
- Application Insights についてさらに学習します。