サービス正常性のレポートとチェック
サービスで問題が発生した場合、インシデントと停止に対処して修正する能力は、問題を迅速に検出できるかどうかに依存します。 問題とエラーをサービス コードから Service Fabric Health Manager にレポートすれば、正常性状態を確認するために Service Fabric に用意されている標準の正常性監視ツールを使用できます。
サービスから正常性をレポートできる 3 つの方法があります。
- Partition オブジェクトまたは CodePackageActivationContext オブジェクトを使用します。
Partition
とCodePackageActivationContext
オブジェクトを使用し、現在のコンテキストに含まれる要素の正常性をレポートできます。 たとえば、レプリカの一部として実行されるコードでは、そのレプリカ、所属パーティション、含まれるアプリケーションのみの正常性をレポートできます。 FabricClient
を使用します。
クラスターがセキュリティで保護されていない場合やサービスが管理者特権で実行されている場合、FabricClient
を使用し、サービス コードから正常性をレポートできます。 ほとんどの現実のシナリオでは、セキュリティで保護されていないクラスターを使用しません。また、管理者特権を付与しません。FabricClient
では、クラスターの一部であるすべてのエンティティの正常性をレポートできます。 ただし、サービス コードで独自の正常性に関するレポートのみを送信するのが理想的です。- クラスター、アプリケーション、デプロイされたアプリケーション、サービス、サービス パッケージ、パーティション、レプリカ、またはノード レベルで、REST API を使用します。 これは、コンテナー内から正常性レポートを取得するために使用できます。
この記事では、サービス コードから正常性をレポートするサンプルを紹介します。 このサンプルでは、Service Fabric が提供するツールで正常性を確認する方法についても紹介します。 この記事は、Service Fabric の正常性状態を監視する機能を簡単に説明することを目的としています。 詳細については、この記事の最後にあるリンクから始まる、正常性に関する一連の解説記事を参照してください。
前提条件
以下のものがインストールされている必要があります。
- Visual Studio 2015 または Visual Studio 2019
- Service Fabric SDK
セキュリティで保護されたローカル開発クラスターを作成するには
- 管理者特権で PowerShell を起動し、次のコマンドを実行します。
アプリケーションをデプロイしてその正常性をチェックするには
Visual Studio を管理者として開きます。
ステートフル サービス テンプレートを利用し、プロジェクトを作成します。
F5 キーを押してデバッグ モードでアプリケーションを実行します。 アプリケーションは、ローカル クラスターにデプロイされます。
アプリケーションが実行されたら、通知領域のローカル クラスター マネージャー アイコンを右クリックし、ショートカット メニューから [ローカル クラスターの管理] を選択し、Service Fabric Explorer を起動します。
アプリケーションの正常性がこの画像のように表示されます。 この時点では、アプリケーションはエラーなしで、正常です。
また、PowerShell を使用して正常性をチェックすることもできます。
Get-ServiceFabricApplicationHealth
を利用し、アプリケーションの正常性を確認できます。Get-ServiceFabricServiceHealth
を利用し、サービスの正常性を確認できます。 PowerShell の同じアプリケーションの正常性レポートがこの画像にあります。
サービス コードにカスタム正常性イベントを追加するには
Visual Studio の Service Fabric プロジェクト テンプレートには、サンプル コードが含まれています。 次の手順では、サービス コードからカスタム正常性イベントをレポートする方法を説明します。 このようなレポートは、Service Fabric に用意されている正常性監視用の標準ツール (Service Fabric Explorer、Azure Portal の正常性ビュー、PowerShell など) に自動的に表示されます。
Visual Studio で前に作成したアプリケーションを再度開くか、Visual Studio テンプレートの ステートフル サービス を使用して新しいアプリケーションを作成します。
Stateful1.cs ファイルを開き、
RunAsync
メソッドのmyDictionary.TryGetValueAsync
呼び出しを見つけます。 カウンターの現在の値を保持しているresult
がこのメソッドにより返されることがわかります。これは、このアプリケーションのキー ロジックが実行回数を保持するためです。 このアプリケーションが実際のアプリケーションであり、結果がないとエラーになる場合は、そのイベントにフラグを設定します。結果がなくてエラーになるときに正常性イベントを報告するには、さらに次の手順を実行します。
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); }
サービスが管理者特権で実行されている場合、またはクラスターがセキュリティで保護 されていない場合は、次の手順に示すように、
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); }
このエラーをシミュレートし、正常性監視ツールに表示されるところを見てみましょう。 エラーをシミュレートするには、前に追加した正常性レポート コードの最初の行をコメント アウトします。 最初の行をコメント アウトすると、コードは次の例のようになります。
//if(!result.HasValue) { HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error); this.Partition.ReportReplicaHealth(healthInformation); }
このコードでは、
RunAsync
が実行されるたびに正常性レポートが実行されます。 変更後、 F5 を押し、アプリケーションを実行します。アプリケーションの実行後、Service Fabric Explorer を開いて、アプリケーションの正常性をチェックします。 今度は、Service Fabric Explorer に、アプリケーションが異常であることが表示されます。 アプリケーションは、異常として表示されます。これは、前に追加したコードからレポートされたエラーが原因です。
Service Fabric Explorer のツリー ビューでプライマリ レプリカを選択すると、 正常性状態 にエラーが示されていることもわかります。 Service Fabric Explorer には、コードで
HealthInformation
パラメーターに追加した正常性レポートの詳細も表示されます。 同じ正常性レポートを、PowerShell でも、Azure Portal でも見ることができます。
このレポートは、別のレポートで置き換えられるか、このレプリカが削除されるまで、Health Manager に残されます。 HealthInformation
オブジェクトのこの正常性レポートに TimeToLive
を設定しなかったため、レポートには期限切れがありません。
最も細かいレベルで正常性をレポートすることをお勧めします (この例の場合はレプリカ)。 Partition
の正常性をレポートすることもできます。
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
this.Partition.ReportPartitionHealth(healthInformation);
Application
、DeployedApplication
、DeployedServicePackage
の正常性をレポートするには、CodePackageActivationContext
を使用します。
HealthInformation healthInformation = new HealthInformation("ServiceCode", "StateDictionary", HealthState.Error);
var activationContext = FabricRuntime.GetActivationContext();
activationContext.ReportApplicationHealth(healthInformation);