サービス正常性のレポートとチェック

サービスで問題が発生した場合、インシデントと停止に対処して修正する能力は、問題を迅速に検出できるかどうかに依存します。 問題とエラーをサービス コードから Service Fabric Health Manager にレポートすれば、正常性状態を確認するために Service Fabric に用意されている標準の正常性監視ツールを使用できます。

サービスから正常性をレポートできる 3 つの方法があります。

  • Partition オブジェクトまたは CodePackageActivationContext オブジェクトを使用します。
    PartitionCodePackageActivationContext オブジェクトを使用し、現在のコンテキストに含まれる要素の正常性をレポートできます。 たとえば、レプリカの一部として実行されるコードでは、そのレプリカ、所属パーティション、含まれるアプリケーションのみの正常性をレポートできます。
  • FabricClientを使用します。
    クラスターがセキュリティで保護されていない場合やサービスが管理者特権で実行されている場合、FabricClient を使用し、サービス コードから正常性をレポートできます。 ほとんどの現実のシナリオでは、セキュリティで保護されていないクラスターを使用しません。また、管理者特権を付与しません。 FabricClientでは、クラスターの一部であるすべてのエンティティの正常性をレポートできます。 ただし、サービス コードで独自の正常性に関するレポートのみを送信するのが理想的です。
  • クラスター、アプリケーション、デプロイされたアプリケーション、サービス、サービス パッケージ、パーティション、レプリカ、またはノード レベルで、REST API を使用します。 これは、コンテナー内から正常性レポートを取得するために使用できます。

この記事では、サービス コードから正常性をレポートするサンプルを紹介します。 このサンプルでは、Service Fabric が提供するツールで正常性を確認する方法についても紹介します。 この記事は、Service Fabric の正常性状態を監視する機能を簡単に説明することを目的としています。 詳細については、この記事の最後にあるリンクから始まる、正常性に関する一連の解説記事を参照してください。

前提条件

以下のものがインストールされている必要があります。

  • Visual Studio 2015 または Visual Studio 2019
  • Service Fabric SDK

セキュリティで保護されたローカル開発クラスターを作成するには

  • 管理者特権で PowerShell を起動し、次のコマンドを実行します。

セキュリティ保護された開発クラスターを作成する方法を表示するコマンド

アプリケーションをデプロイしてその正常性をチェックするには

  1. Visual Studio を管理者として開きます。

  2. ステートフル サービス テンプレートを利用し、プロジェクトを作成します。

    Create a Service Fabric application with Stateful Service

  3. F5 キーを押してデバッグ モードでアプリケーションを実行します。 アプリケーションは、ローカル クラスターにデプロイされます。

  4. アプリケーションが実行されたら、通知領域のローカル クラスター マネージャー アイコンを右クリックし、ショートカット メニューから [ローカル クラスターの管理] を選択し、Service Fabric Explorer を起動します。

    通知領域から Service Fabric Explorer を開く

  5. アプリケーションの正常性がこの画像のように表示されます。 この時点では、アプリケーションはエラーなしで、正常です。

    Healthy application in Service Fabric Explorer

  6. また、PowerShell を使用して正常性をチェックすることもできます。 Get-ServiceFabricApplicationHealth を利用し、アプリケーションの正常性を確認できます。Get-ServiceFabricServiceHealth を利用し、サービスの正常性を確認できます。 PowerShell の同じアプリケーションの正常性レポートがこの画像にあります。

    Healthy application in PowerShell

サービス コードにカスタム正常性イベントを追加するには

Visual Studio の Service Fabric プロジェクト テンプレートには、サンプル コードが含まれています。 次の手順では、サービス コードからカスタム正常性イベントをレポートする方法を説明します。 このようなレポートは、Service Fabric に用意されている正常性監視用の標準ツール (Service Fabric Explorer、Azure Portal の正常性ビュー、PowerShell など) に自動的に表示されます。

  1. Visual Studio で前に作成したアプリケーションを再度開くか、Visual Studio テンプレートの ステートフル サービス を使用して新しいアプリケーションを作成します。

  2. Stateful1.cs ファイルを開き、RunAsync メソッドの myDictionary.TryGetValueAsync 呼び出しを見つけます。 カウンターの現在の値を保持している result がこのメソッドにより返されることがわかります。これは、このアプリケーションのキー ロジックが実行回数を保持するためです。 このアプリケーションが実際のアプリケーションであり、結果がないとエラーになる場合は、そのイベントにフラグを設定します。

  3. 結果がなくてエラーになるときに正常性イベントを報告するには、さらに次の手順を実行します。

    a. System.Fabric.Health 名前空間を Stateful1.cs ファイルに追加します。

    using System.Fabric.Health;
    

    b. 次のコードを myDictionary.TryGetValueAsync 呼び出しの後ろに追加します。

    if (!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportReplicaHealth(healthInformation);
    }
    

    ステートフル サービスからレポートされているため、レプリカの正常性がレポートされます。 HealthInformation パラメーターには、レポートされている正常性の問題に関する情報が格納されます。

    ステートレス サービスを作成した場合は、次のコードを使用します。

    if (!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportInstanceHealth(healthInformation);
    }
    
  4. サービスが管理者特権で実行されている場合、またはクラスターがセキュリティで保護 されていない場合は、次の手順に示すように、FabricClient を利用して正常性をレポートすることもできます。

    a. var myDictionary 宣言の後に FabricClient インスタンスを作成します。

    var fabricClient = new FabricClient(new FabricClientSettings() { HealthReportSendInterval = TimeSpan.FromSeconds(0) });
    

    b. 次のコードを myDictionary.TryGetValueAsync 呼び出しの後ろに追加します。

    if (!result.HasValue)
    {
       var replicaHealthReport = new StatefulServiceReplicaHealthReport(
            this.Context.PartitionId,
            this.Context.ReplicaId,
            new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error));
        fabricClient.HealthManager.ReportHealth(replicaHealthReport);
    }
    
  5. このエラーをシミュレートし、正常性監視ツールに表示されるところを見てみましょう。 エラーをシミュレートするには、前に追加した正常性レポート コードの最初の行をコメント アウトします。 最初の行をコメント アウトすると、コードは次の例のようになります。

    //if(!result.HasValue)
    {
        HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
        this.Partition.ReportReplicaHealth(healthInformation);
    }
    

    このコードでは、RunAsync が実行されるたびに正常性レポートが実行されます。 変更後、 F5 を押し、アプリケーションを実行します。

  6. アプリケーションの実行後、Service Fabric Explorer を開いて、アプリケーションの正常性をチェックします。 今度は、Service Fabric Explorer に、アプリケーションが異常であることが表示されます。 アプリケーションは、異常として表示されます。これは、前に追加したコードからレポートされたエラーが原因です。

    Unhealthy application in Service Fabric Explorer

  7. Service Fabric Explorer のツリー ビューでプライマリ レプリカを選択すると、 正常性状態 にエラーが示されていることもわかります。 Service Fabric Explorer には、コードで HealthInformation パラメーターに追加した正常性レポートの詳細も表示されます。 同じ正常性レポートを、PowerShell でも、Azure Portal でも見ることができます。

    Replica health in Service Fabric Explorer

このレポートは、別のレポートで置き換えられるか、このレプリカが削除されるまで、Health Manager に残されます。 HealthInformation オブジェクトのこの正常性レポートに TimeToLive を設定しなかったため、レポートには期限切れがありません。

最も細かいレベルで正常性をレポートすることをお勧めします (この例の場合はレプリカ)。 Partitionの正常性をレポートすることもできます。

HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);

ApplicationDeployedApplicationDeployedServicePackage の正常性をレポートするには、CodePackageActivationContext を使用します。

HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);

次のステップ