チュートリアル: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 を使用してカスタム イベントを追加する

このチュートリアル シリーズで学習する内容は次のとおりです。

前提条件

このチュートリアルを開始する前に

投票サンプル アプリケーションをダウンロードする

このチュートリアル シリーズの第 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] の順に選択します。

新しい AI リソースの作成

作成するリソースの属性に関する必要な情報を、ここで入力する必要があります。 適切な名前リソース グループ、およびサブスクリプションを入力します。 [場所] に、将来 Service Fabric クラスターをデプロイする場所を設定します。 このチュートリアルではローカル クラスターにアプリをデプロイするため、 [場所] フィールドは関係ありません。 [アプリケーションの種類] は "ASP.NET Web アプリケーション" のままにしておく必要があります。

AI リソース属性

必要な情報を入力したら、 [作成] を選択してリソースをプロビジョニングします。終わるまでに 1 分ほどかかります。

Application Insights をアプリケーションのサービスに追加する

スタート メニューで Visual Studio アイコンを右クリックし、 [管理者として実行] を選択して、昇格された特権で Visual Studio 2019 を起動します。 [ファイル]>[開く]>[プロジェクト/ソリューション] の順に選択し、投票アプリケーション (チュートリアルの第 1 部で作成済みまたは git から複製済み) に移動します。 Voting.sln を開きます。 アプリケーションの NuGet パッケージを復元するかどうかをたずねるプロンプトが表示されたら、 [はい] を選択します。

次の手順に従って、VotingWeb と VotingData の両方のサービス用に Application Insights を構成します。

  1. サービス名を右クリックして、[追加] > [接続済みサービス] > [Application Insights での監視] の順に選択します。

    AI の構成

Note

プロジェクト タイプによっては、サービスの名前を右クリックするときに、[追加] > [Application Insights Telemetry] の順に選択する必要があります。

  1. [Get started](作業を開始する) を選択します。

  2. Azure サブスクリプションに使用したアカウントにサインインし、Application Insights リソースを作成したサブスクリプションを選択します。 [リソース] ボックスの [Application Insights の既存のリソース] でリソースを探します。 [登録] を選択して Application Insights をサービスに追加します。

    AI の登録

  3. ポップアップ表示されるダイアログ ボックスの操作が完了したら、 [完了] をクリックします。

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 パッケージを設定する手順を示します。

  1. ソリューション エクスプローラーの上部にある "Voting" ソリューションを右クリックし、 [ソリューションの NuGet パッケージの管理] を選択します。
  2. [NuGet - ソリューション] ウィンドウ上部のナビゲーション メニューにある [参照] を選択し、検索バーの横にある [プレリリースを含める] チェック ボックスをオンにします。

Note

Microsoft.ServiceFabric.Diagnostics.Internal パッケージが事前にインストールされていない場合は、Application Insights パッケージをインストールする前に同様の方法でこのパッケージをインストールすることが必要になる場合があります

  1. Microsoft.ApplicationInsights.ServiceFabric.Native を検索し、適切な NuGet パッケージを選択します。

  2. 右側で、アプリケーション内の 2 つのサービス ( [VotingWeb][VotingData] ) の横にある 2 つのチェック ボックスをオンにして、 [インストール] を選択します。 AI SDK Nuget

  3. [変更のプレビュー] ダイアログ ボックスが表示されたら [OK] を選択し、 [ライセンスの同意] に同意します。 これで、サービスへの NuGet の追加が完了します。

  4. 今度は 2 つのサービスにテレメトリの初期化子を設定する必要があります。 そのためには、VotingWeb.csVotingData.cs を開きます。 両方に対して、次の 2 つの手順を実行します。

    1. それぞれの <サービス名>.cs の上部で、既存の using ステートメントの下に次の 2 つの using ステートメントを追加します。
    using Microsoft.ApplicationInsights.Extensibility;
    using Microsoft.ApplicationInsights.ServiceFabric;
    
    1. 両方のファイルで、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.csVotingData.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 にアクセスすると、単一ページの投票アプリケーションのサンプルを確認できます。 サンプル データとテレメトリを作成する項目をいくつか選んで投票します。この例ではデザートにしています!

AI 投票のサンプル

投票を追加し終わったら、投票オプションの一部を削除することもできます。

Application Insights でテレメトリとアプリ マップを表示する

Azure Portal で、Application Insights リソースのページに移動します。

[概要] を選択して、お使いのリソースのランディング ページに戻ります。 次に、上部の [検索] を選択して受信トレースを確認します。 Application Insights にトレースが表示されるまで数分かかります。 何も表示されない場合は、しばらく待ってから上部の [更新] をクリックします。 AI トレースの確認

[検索] ウィンドウを下にスクロールすると、Application Insights ですぐに利用できるすべての受信テレメトリが表示されます。 投票アプリケーションで行った操作ごとに、VotingWeb からの送信 PUT 要求 (PUT Votes/Put [name]) と VotingData からの受信 PUT 要求 (PUT VoteData/Put [name]) が発生し、その後、 表示データを最新の情報に更新するように求める GET 要求が対になって発生します。 それらは HTTP 要求であるため、ローカルホストでも HTTP に対する依存関係トレースが発生します。 1 つの投票がどのように追加されるかが分かるサンプルを次に示します。

AI サンプル要求のトレース

いずれかのトレースを選択すると、その詳細を表示できます。 Application Insights で提供される情報には、応答時間要求 URL など、要求に関する有用な情報があります。 また、Service Fabric 固有の NuGet を追加したため、後述の Custom Data セクションでは、お使いのアプリケーションに関する情報を Service Fabric クラスターのコンテキストで取得することもできます。 これにはサービス コンテキストが含まれるため、要求のソースの PartitionIDReplicaId を確認して、アプリケーションでのエラー診断時に問題箇所を適切に特定することができます。

AI トレースの詳細

さらに、[概要] ページの左側のメニューの [アプリケーション マップ] をクリックするか、 [アプリ マップ] アイコンを選択すると、2 つのサービスが接続されていることを示すアプリ マップが表示されます。

左側のメニューのアプリケーション マップが強調表示されているスクリーンショット。

アプリ マップを利用すると、アプリケーションのトポロジをより深く理解できます。特に、連携して動く複数の異なるサービスを追加し始めるときには有用です。 また、これによって要求の成功率に関する基本的なデータを取得し、失敗した要求を診断して、問題が起きた可能性のある場所を把握するのに役立てることもできます。 アプリ マップの使用方法について詳しくは、「Application Insights のアプリケーション マップ」をご覧ください。

カスタム インストルメンテーションをアプリケーションに追加する

Application Insights では多くのテレメトリをすぐに利用できますが、さらにカスタム インストルメンテーションを追加することもできます。 これは、ビジネス ニーズに基づいて行うことも、またはアプリケーションでの問題発生時に診断を改善するために行うこともできます。 Application Insights にはカスタム イベントとメトリックを取り込める API があります。詳細についてはこちらをご覧ください。

VoteDataController.cs (VotingData>Controllers の下) にカスタム イベントを追加して、基礎となる votesDictionary に対していつ投票が追加され、削除されるかを追跡します。

  1. 他の using ステートメントの最後に using Microsoft.ApplicationInsights; を追加します。
  2. クラスの最初の IReliableStateManager の作成の下で、新しい TelemetryClient を次のように宣言します。private TelemetryClient telemetry = new TelemetryClient();
  3. Put() 関数に、投票が追加されたことを確認するイベントを追加します。 トランザクションが完了した後の、return OkResult ステートメントの直前に telemetry.TrackEvent($"Added a vote for {name}"); を追加します。
  4. Delete() には、votesDictionary に指定された投票オプションに対応する投票を含むという条件の "if/else" が存在します。
    1. 投票が削除されたことを確認するイベントを、if ステートメント内の await tx.CommitAsync() の後に追加します。telemetry.TrackEvent($"Deleted votes for {name}");
    2. 削除が行われなかったことを示すイベントを、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 分かかります)。 追加および削除したすべての投票の "カスタム イベント"\* が、すべての応答のテレメトリとともに表示されます。

カスタム イベント

次の手順

このチュートリアルでは、以下の内容を学習しました。

  • Application Insights をお使いのアプリケーション用に構成する
  • 応答のテレメトリを収集してサービス間の HTTP ベース通信を追跡する
  • Application Insights でアプリ マップ機能を使用する
  • Application Insights API を使用してカスタム イベントを追加する

ASP.NET アプリケーションの監視と診断の設定が完了したところで、以下を試してみてください。