チュートリアル: Application Insights を使用して Service Fabric アプリケーションを監視および診断する

このチュートリアルは、シリーズの第 5 部です。 Application Insights を使用して、Azure Service Fabric クラスターで実行されている ASP.NET Core アプリケーションの監視と診断を構成する手順を説明します。 チュートリアル シリーズ第 1 部で開発したアプリケーションからテレメトリを収集します。

このチュートリアルでは、次の作業を行う方法について説明します。

  • Application Insights リソースを設定する
  • Application Insights をアプリケーションのサービスに追加する
  • Application Insights でテレメトリとアプリケーション マップを表示する
  • カスタム インストルメンテーションをアプリケーションに追加する

このチュートリアル シリーズでは、次の操作方法について説明します。

前提条件

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

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

このチュートリアル シリーズの第 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] で、[作成] を選択します。

新しい Application Insights リソースの作成方法を示すスクリーンショット。

[サブスクリプション][リソース グループ][名前] の値を入力または選択します。 [リージョン] で、将来 Service Fabric クラスターをデプロイする場所を選択します。 このチュートリアルではローカル クラスターにアプリをデプロイするため、Azure リージョンは関係ありません。 [アプリケーションの種類] では [ASP.NET Web アプリケーション] のままにしておきます。

Application Insights のリソース属性を示すスクリーンショット。

必要な情報を入力または選択したら、[作成] を選択してリソースをプロビジョニングします。 リソースは約 1 分でデプロイされます。

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

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

VotingWeb と VotingData の両方のサービス用に Application Insights を構成するには、次の操作を行います。

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

    Application Insights サービスの構成を示すスクリーンショット。

    Note

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

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

  3. Azure サブスクリプションに使用したアカウントにサインインし、Application Insights リソースを作成したサブスクリプションを選択します。 リソースを見つけるには、[リソース][Application Insights の既存のリソース] に移動します。 [登録] を選択して Application Insights をサービスに追加します。

    Application Insights の登録方法を示すスクリーンショット。

  4. [完了] を選択します。

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 パッケージを設定するには、次の操作を行います。

  1. ソリューション エクスプローラーで、[ソリューションの '投票'] を右クリックし、[ソリューションの NuGet パッケージの管理] を選択します。

  2. [NuGet - ソリューション] ダイアログで、[参照] を選択します。 [プレリリースを含める] チェック ボックスをオンにします。

    Note

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

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

  4. 右側のウィンドウで、VotingWeb チェックボックスと VotingData をオンにします。 [インストール] を選択します。

    NuGet の Application Insights SDK を示すスクリーンショット。

  5. [変更のプレビュー] ダイアログで [OK] を選択してライセンスを承諾します。 NuGet パッケージがサービスに追加されます。

  6. 次に、2 つのサービスにテレメトリの初期化子を設定します。 VotingWeb.csVotingData.cs を開きます。 両方のコード ファイルで次の手順を実行します。

    1. それぞれのファイルの上部で、既存の using ステートメントの下に次の 2 つの using ステートメントを追加します。

      using Microsoft.ApplicationInsights.Extensibility;
      using Microsoft.ApplicationInsights.ServiceFabric;
      
    2. 両方のファイルで、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.csVotingData.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 を示すスクリーンショット。

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

Application Insights のサンプル要求トレースを示すスクリーンショット。

トレースを選択すると、そのトレースの詳細を確認できます。 Application Insights には、応答時間要求 URL の値を含む、要求に関する役立つ情報が含まれています。 Service Fabric 固有の NuGet を追加したため、Custom Data セクションでは、お使いのアプリケーションに関する情報を Service Fabric クラスターのコンテキストで取得することもできます。 データにはサービス コンテキストが含まれるため、要求のソースの PartitionIDReplicaId の値を確認して、アプリケーションでのエラー診断時に問題を適切に分離することができます。

Application Insights のトレースの詳細を示すスクリーンショット。

アプリケーション マップに移動するには、[概要] ウィンドウのリソース メニューから [アプリケーション マップ] を選択するか、[アプリ マップ] アイコンを選択します。 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 分かかります)。 追加および削除したすべての投票の "カスタム イベント" と関連する応答のテレメトリのエントリが表示されます。

カスタム イベントを示すスクリーンショット。