チュートリアル:Azure 内で Service Fabric クラスターを監視する
監視と診断は、あらゆるクラウド環境でアプリケーションやサービスを開発、テスト、およびデプロイするために非常に重要です。 このチュートリアルは、シリーズの第 2 部です。イベント、パフォーマンス カウンター、および正常性レポートを使用して Service Fabric クラスターを監視し、診断する方法を説明します。 詳細については、クラスターの監視とインフラストラクチャの監視に関する概要を参照してください。
このチュートリアルでは、以下の内容を学習します。
- Service Fabric イベントの表示
- クラスター イベントに対して EventStore API のクエリを実行する
- インフラストラクチャの監視/パフォーマンス カウンターの収集を行う
- クラスターの正常性レポートを表示する
このチュートリアル シリーズで学習する内容は次のとおりです。
- テンプレートを使用して Azure にセキュリティで保護された Windows クラスターを作成する
- クラスターを監視する
- クラスターをスケールインまたはスケールアウトする
- クラスターのランタイムをアップグレードする
- クラスターの削除
Note
Azure を操作するには、Azure Az PowerShell モジュールを使用することをお勧めします。 作業を始めるには、「Azure PowerShell をインストールする」を参照してください。 Az PowerShell モジュールに移行する方法については、「AzureRM から Az への Azure PowerShell の移行」を参照してください。
前提条件
このチュートリアルを開始する前に
- Azure サブスクリプションを持っていない場合は無料アカウントを作成する
- Azure PowerShell または Azure CLI をインストールします。
- セキュリティで保護された Windows クラスターを作成する
- クラスターに対して診断の収集を設定する
- クラスター内で EventStore サービスを有効にする
- クラスターに対して Azure Monitor ログと Log Analytics エージェントを構成する
Azure Monitor ログを使用して Service Fabric イベントを表示する
Azure Monitor ログでは、クラウド内でホストされているアプリケーションとサービスからテレメトリが収集および分析され、それらの可用性とパフォーマンスを最大限に高めるために役立つ分析ツールが提供されます。 Azure Monitor ログ内でクエリを実行して、分析情報を取得したり、クラスター内の処理のトラブルシューティングを行ったりできます。
Service Fabric Analytics ソリューションにアクセスするには、Azure portal に移動し、Service Fabric Analytics ソリューションを作成したリソース グループを選択します。
リソースの [ServiceFabric(mysfomsworkspace)] を選択します。
[概要] に、有効になっているソリューションごとのグラフ形式のタイルが表示されます (Service Fabric のタイルも含まれています)。 [Service Fabric] グラフを選択して、Service Fabric Analytics ソリューションを継続します。
次の画像には、Service Fabric Analytics ソリューションのホーム ページが示されています。 このホーム ページでは、クラスター内で行われている処理のスナップショット ビューが提供されます。
クラスター作成時に診断を有効にした場合は、以下に対するイベントが表示されます。
Note
診断の拡張機能の構成を更新することで、すぐに利用できる Service Fabric イベントだけでなく、より詳細なシステム イベントが収集できます。
ノードに対する操作を含む Service Fabric イベントを表示する
Service Fabric Analytics ページで、クラスター イベントのグラフをクリックします。 収集済みのすべてのシステム イベントのログが表示されます。 参考までに、これらは Azure Storage アカウント内の WADServiceFabricSystemEventsTable に由来し、次に確認する Reliable Services イベントや Reliable Actors イベントも同様に、それぞれのテーブルに由来します。
クエリでは、Kusto クエリ言語を使用します。これを変更して、探しているものを絞り込むことができます。 たとえば、クラスター内のノードに対して行われたすべての操作を検索するは、次のクエリを使用できます。 使用されているイベント ID は、操作チャネルのイベント リファレンスで確認できます。
ServiceFabricOperationalEvent
| where EventId < 25627 and EventId > 25619
Kusto クエリ言語は優れています。 他にも便利なクエリをいくつか紹介します。
エイリアス ServiceFabricEvent を使用してクエリを関数として保存することで、ServiceFabricEvent ルックアップ テーブルをユーザー定義関数として作成します。
let ServiceFabricEvent = datatable(EventId: int, EventName: string)
[
...
18603, 'NodeUpOperational',
18604, 'NodeDownOperational',
...
];
ServiceFabricEvent
過去 1 時間に記録された操作イベントを返します。
ServiceFabricOperationalEvent
| where TimeGenerated > ago(1h)
| join kind=leftouter ServiceFabricEvent on EventId
| project EventId, EventName, TaskName, Computer, ApplicationName, EventMessage, TimeGenerated
| sort by TimeGenerated
EventId == 18604 および EventName == 'NodeDownOperational' の操作イベントを返します。
ServiceFabricOperationalEvent
| where EventId == 18604
| project EventId, EventName = 'NodeDownOperational', TaskName, Computer, EventMessage, TimeGenerated
| sort by TimeGenerated
EventId == 18604 および EventName == 'NodeUpOperational' の操作イベントを返します。
ServiceFabricOperationalEvent
| where EventId == 18603
| project EventId, EventName = 'NodeUpOperational', TaskName, Computer, EventMessage, TimeGenerated
| sort by TimeGenerated
HealthState == 3 (エラー) の正常性レポートを返し、EventMessage フィールドから追加のプロパティを抽出します。
ServiceFabricOperationalEvent
| join kind=leftouter ServiceFabricEvent on EventId
| extend HealthStateId = extract(@"HealthState=(\S+) ", 1, EventMessage, typeof(int))
| where TaskName == 'HM' and HealthStateId == 3
| extend SourceId = extract(@"SourceId=(\S+) ", 1, EventMessage, typeof(string)),
Property = extract(@"Property=(\S+) ", 1, EventMessage, typeof(string)),
HealthState = case(HealthStateId == 0, 'Invalid', HealthStateId == 1, 'Ok', HealthStateId == 2, 'Warning', HealthStateId == 3, 'Error', 'Unknown'),
TTL = extract(@"TTL=(\S+) ", 1, EventMessage, typeof(string)),
SequenceNumber = extract(@"SequenceNumber=(\S+) ", 1, EventMessage, typeof(string)),
Description = extract(@"Description='([\S\s, ^']+)' ", 1, EventMessage, typeof(string)),
RemoveWhenExpired = extract(@"RemoveWhenExpired=(\S+) ", 1, EventMessage, typeof(bool)),
SourceUTCTimestamp = extract(@"SourceUTCTimestamp=(\S+)", 1, EventMessage, typeof(datetime)),
ApplicationName = extract(@"ApplicationName=(\S+) ", 1, EventMessage, typeof(string)),
ServiceManifest = extract(@"ServiceManifest=(\S+) ", 1, EventMessage, typeof(string)),
InstanceId = extract(@"InstanceId=(\S+) ", 1, EventMessage, typeof(string)),
ServicePackageActivationId = extract(@"ServicePackageActivationId=(\S+) ", 1, EventMessage, typeof(string)),
NodeName = extract(@"NodeName=(\S+) ", 1, EventMessage, typeof(string)),
Partition = extract(@"Partition=(\S+) ", 1, EventMessage, typeof(string)),
StatelessInstance = extract(@"StatelessInstance=(\S+) ", 1, EventMessage, typeof(string)),
StatefulReplica = extract(@"StatefulReplica=(\S+) ", 1, EventMessage, typeof(string))
EventId != 17523 のイベントの時間グラフを返します。
ServiceFabricOperationalEvent
| join kind=leftouter ServiceFabricEvent on EventId
| where EventId != 17523
| summarize Count = count() by Timestamp = bin(TimeGenerated, 1h), strcat(tostring(EventId), " - ", case(EventName != "", EventName, "Unknown"))
| render timechart
特定のサービスとノードで集計された Service Fabric の操作イベントを取得します。
ServiceFabricOperationalEvent
| where ApplicationName != "" and ServiceName != ""
| summarize AggregatedValue = count() by ApplicationName, ServiceName, Computer
クロスリソース クエリを使用して、EventId/EventName 別に Service Fabric イベントの数を表示します。
app('PlunkoServiceFabricCluster').traces
| where customDimensions.ProviderName == 'Microsoft-ServiceFabric'
| extend EventId = toint(customDimensions.EventId), TaskName = tostring(customDimensions.TaskName)
| where EventId != 17523
| join kind=leftouter ServiceFabricEvent on EventId
| extend EventName = case(EventName != '', EventName, 'Undocumented')
| summarize ["Event Count"]= count() by bin(timestamp, 30m), EventName = strcat(tostring(EventId), " - ", EventName)
| render timechart
Service Fabric アプリケーション イベントを表示する
クラスター上に展開されている Reliable Services アプリケーションと Reliable Actors アプリケーションのイベントを表示できます。 Service Fabric Analytics ページで、アプリケーション イベントのグラフを選択します。
次のクエリを実行すると、Reliable Services アプリケーションのイベントが表示されます。
ServiceFabricReliableServiceEvent
| sort by TimeGenerated desc
通常はデプロイおよびアップグレードで行われるサービス runasync
の開始時点および完了時点に関する、さまざまなイベントを表示できます。
ServiceName == "fabric:/Watchdog/WatchdogService" を使用して、Reliable Services のイベントを検索することもできます。
ServiceFabricReliableServiceEvent
| where ServiceName == "fabric:/Watchdog/WatchdogService"
| project TimeGenerated, EventMessage
| order by TimeGenerated desc
Reliable Actors のイベントも、同様の方式で表示できます。
ServiceFabricReliableActorEvent
| sort by TimeGenerated desc
Reliable Actors に対してより詳細なイベントを構成するには、クラスター テンプレート内にある診断の拡張機能の構成で scheduledTransferKeywordFilter
を変更する必要があります。 これらの値の詳細については、「Reliable Actors の診断とパフォーマンス監視」を参照してください。
"EtwEventSourceProviderConfiguration": [
{
"provider": "Microsoft-ServiceFabric-Actors",
"scheduledTransferKeywordFilter": "1",
"scheduledTransferPeriod": "PT5M",
"DefaultEvents": {
"eventDestination": "ServiceFabricReliableActorEventTable"
}
},
Azure Monitor ログを使用してパフォーマンス カウンターを表示する
パフォーマンス カウンターを表示するには、Azure portal に移動し、Service Fabric Analytics ソリューションを作成したリソース グループに移動します。
リソースの [ServiceFabric(mysfomsworkspace)] 、 [Log Analytics ワークスペース] 、 [詳細設定] の順に選択します。
[データ] を選択し、[Windows パフォーマンス カウンター] を選択します。 選択して有効にできる既定のカウンターの一覧があり、収集の間隔を設定することもできます。 収集する追加のパフォーマンス カウンターを追加することもできます。 正しい形式については、この記事を参照してください。 [保存] をクリックし、[OK] を選択します。
[詳細設定] ブレードを閉じ、 [全般] という見出しの下にある [ワークスペースの概要] を選択します。 有効なソリューションごとにグラフ形式のタイルがあります (Service Fabric のタイルも含まれています)。 [Service Fabric] グラフを選択して、Service Fabric Analytics ソリューションを継続します。
これらは、操作チャネルと Reliable Services のイベントのグラフ形式のタイルです。 選択したカウンターのデータ フローのグラフィック表現が、[Node Metrics]\(ノード メトリック\) の下に表示されます。
[Container Metric]\(コンテナー メトリック\) グラフを選択すると、詳細が追加表示されます。 また、Kusto クエリ言語を使用して、イベントをクラスタリングし、ノード、パフォーマンス カウンター名および値をフィルタリングするために、同様にパフォーマンス カウンター データに対してクエリを実行できます。
EventStore サービスに対してクエリを実行する
EventStore サービスでは、任意の時点でのクラスターまたはワークロードの状態を理解する手段が提供されます。 EventStore は、クラスターからのイベントを保持するステートフルな Service Fabric サービスです。 イベントは、Service Fabric Explorer、REST、および API シリーズを介して公開されます。 EventStore では、クラスターに対してクエリが直接実行されて、クラスター内の任意のエンティティに関する診断データが取得されます。EventStore で使用できるイベントの完全な一覧を確認するには、「Service Fabric イベント」を参照してください。
Service Fabric クライアント ライブラリを使用して EventStore API シリーズのクエリをプログラムで実行することもできます。
GetClusterEventListAsync 関数を使用して、2018-04-03T18:00:00Z と 2018-04-04T18:00:00Z の間のすべてのクラスター イベントを要求する例を示します。
var sfhttpClient = ServiceFabricClientFactory.Create(clusterUrl, settings);
var clstrEvents = sfhttpClient.EventsStore.GetClusterEventListAsync(
"2018-04-03T18:00:00Z",
"2018-04-04T18:00:00Z")
.GetAwaiter()
.GetResult()
.ToList();
2018 年 9 月のクラスターの正常性と、すべてのノード イベントに対してクエリが実行され、それらが出力される別の例を次に示します。
const int timeoutSecs = 60;
var clusterUrl = new Uri(@"http://localhost:19080"); // This example is for a Local cluster
var sfhttpClient = ServiceFabricClientFactory.Create(clusterUrl);
var clusterHealth = sfhttpClient.Cluster.GetClusterHealthAsync().GetAwaiter().GetResult();
Console.WriteLine("Cluster Health: {0}", clusterHealth.AggregatedHealthState.Value.ToString());
Console.WriteLine("Querying for node events...");
var nodesEvents = sfhttpClient.EventsStore.GetNodesEventListAsync(
"2018-09-01T00:00:00Z",
"2018-09-30T23:59:59Z",
timeoutSecs,
"NodeDown,NodeUp")
.GetAwaiter()
.GetResult()
.ToList();
Console.WriteLine("Result Count: {0}", nodesEvents.Count());
foreach (var nodeEvent in nodesEvents)
{
Console.Write("Node event happened at {0}, Node name: {1} ", nodeEvent.TimeStamp, nodeEvent.NodeName);
if (nodeEvent is NodeDownEvent)
{
var nodeDownEvent = nodeEvent as NodeDownEvent;
Console.WriteLine("(Node is down, and it was last up at {0})", nodeDownEvent.LastNodeUpAt);
}
else if (nodeEvent is NodeUpEvent)
{
var nodeUpEvent = nodeEvent as NodeUpEvent;
Console.WriteLine("(Node is up, and it was last down at {0})", nodeUpEvent.LastNodeDownAt);
}
}
クラスターの正常性を監視する
Service Fabric には、正常性エンティティを使用する正常性モデルが導入されています。ここでは、システム コンポーネントやウォッチドッグで監視しているローカルの状態についてのレポートを確認できます。 すべての正常性データは正常性ストアによって集計され、エンティティが正常であるかどうかが判断されます。
クラスターには、システム コンポーネントから送信された正常性レポートが自動的に設定されます。 詳細については、「 トラブルシューティングのためのシステム正常性レポートの使用」を参照してください。
Service Fabric では、サポート対象の各 エンティティ型について正常性クエリが公開されています。 アクセスには、API (FabricClient.HealthManager 上メソッドを使用)、PowerShell コマンドレット、および REST を使用できます。 これらのクエリは、正常性状態の集計、エンティティの正常性イベント、子の正常性状態 (該当する場合)、異常評価 (エンティティが正常でない場合)、子の正常性統計情報 (該当する場合) といったエンティティの正常性についての完全な情報を返します。
クラスターの正常性の取得
Get-ServiceFabricClusterHealth コマンドレットは、クラスター エンティティの正常性を返し、アプリケーションとノード (クラスターの子) の正常性状態が含まれます。 まず、Connect-ServiceFabricCluster コマンドレットを使用してクラスターに接続します。
クラスターの状態 (11 個のノード、システム アプリケーション、fabric:/Voting) は上記のように構成されています。
次の例では、既定の正常性ポリシーを使用してクラスターの正常性を取得します。 11 個のノードは正常ですが、クラスターの集計された正常性状態はエラーです。これは fabric:/Voting アプリケーションがエラー状態であるためです。 異常性の評価には、正常性の集計をトリガーした条件の詳細が表示されます。
Get-ServiceFabricClusterHealth
AggregatedHealthState : Error
UnhealthyEvaluations :
100% (1/1) applications are unhealthy. The evaluation tolerates 0% unhealthy applications.
Application 'fabric:/Voting' is in Error.
33% (1/3) deployed applications are unhealthy. The evaluation tolerates 0% unhealthy deployed applications.
Deployed application on node '_nt2vm_3' is in Error.
50% (1/2) deployed service packages are unhealthy.
Service package for manifest 'VotingWebPkg' and service package activation ID '8723eb73-9b83-406b-9de3-172142ba15f3' is in Error.
'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376195593305'.
There was an error during CodePackage activation.The service host terminated with exit code:1
NodeHealthStates :
NodeName : _nt2vm_3
AggregatedHealthState : Ok
NodeName : _nt1vm_4
AggregatedHealthState : Ok
NodeName : _nt2vm_2
AggregatedHealthState : Ok
NodeName : _nt1vm_3
AggregatedHealthState : Ok
NodeName : _nt2vm_1
AggregatedHealthState : Ok
NodeName : _nt1vm_2
AggregatedHealthState : Ok
NodeName : _nt2vm_0
AggregatedHealthState : Ok
NodeName : _nt1vm_1
AggregatedHealthState : Ok
NodeName : _nt1vm_0
AggregatedHealthState : Ok
NodeName : _nt3vm_0
AggregatedHealthState : Ok
NodeName : _nt2vm_4
AggregatedHealthState : Ok
ApplicationHealthStates :
ApplicationName : fabric:/System
AggregatedHealthState : Ok
ApplicationName : fabric:/Voting
AggregatedHealthState : Error
HealthEvents : None
HealthStatistics :
Node : 11 Ok, 0 Warning, 0 Error
Replica : 4 Ok, 0 Warning, 0 Error
Partition : 2 Ok, 0 Warning, 0 Error
Service : 2 Ok, 0 Warning, 0 Error
DeployedServicePackage : 3 Ok, 1 Warning, 1 Error
DeployedApplication : 1 Ok, 1 Warning, 1 Error
Application : 0 Ok, 0 Warning, 1 Error
次の例では、カスタム アプリケーション ポリシーを使用してクラスターの正常性を取得します。 結果はフィルター処理され、エラーまたは警告状態のアプリケーションとノードのみを取得します。 この例では、すべて正常であったため、ノードは返されません。 アプリケーションのフィルターが考慮されるのは fabric:/Voting アプリケーションに対してのみです。 カスタム ポリシーでは fabric:/Voting アプリケーションに対する警告をエラーと認識するよう指定しているため、アプリケーションとクラスターはエラーとして評価されます。
$appHealthPolicy = New-Object -TypeName System.Fabric.Health.ApplicationHealthPolicy
$appHealthPolicy.ConsiderWarningAsError = $true
$appHealthPolicyMap = New-Object -TypeName System.Fabric.Health.ApplicationHealthPolicyMap
$appUri1 = New-Object -TypeName System.Uri -ArgumentList "fabric:/Voting"
$appHealthPolicyMap.Add($appUri1, $appHealthPolicy)
Get-ServiceFabricClusterHealth -ApplicationHealthPolicyMap $appHealthPolicyMap -ApplicationsFilter "Warning,Error" -NodesFilter "Warning,Error" -ExcludeHealthStatistics
AggregatedHealthState : Error
UnhealthyEvaluations :
100% (1/1) applications are unhealthy. The evaluation tolerates 0% unhealthy applications.
Application 'fabric:/Voting' is in Error.
100% (5/5) deployed applications are unhealthy. The evaluation tolerates 0% unhealthy deployed applications.
Deployed application on node '_nt2vm_3' is in Error.
50% (1/2) deployed service packages are unhealthy.
Service package for manifest 'VotingWebPkg' and service package activation ID '8723eb73-9b83-406b-9de3-172142ba15f3' is in Error.
'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376195593305'.
There was an error during CodePackage activation.The service host terminated with exit code:1
Deployed application on node '_nt2vm_2' is in Error.
50% (1/2) deployed service packages are unhealthy.
Service package for manifest 'VotingWebPkg' and service package activation ID '2466f2f9-d5fd-410c-a6a4-5b1e00630cca' is in Error.
'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376486201388'.
There was an error during CodePackage activation.The service host terminated with exit code:1
Deployed application on node '_nt2vm_4' is in Error.
100% (1/1) deployed service packages are unhealthy.
Service package for manifest 'VotingWebPkg' and service package activation ID '5faa5201-eede-400a-865f-07f7f886aa32' is in Error.
'System.Hosting' reported Warning for property 'CodePackageActivation:Code:SetupEntryPoint:131959376207396204'. The evaluation treats
Warning as Error.
There was an error during CodePackage activation.The service host terminated with exit code:1
Deployed application on node '_nt2vm_0' is in Error.
100% (1/1) deployed service packages are unhealthy.
Service package for manifest 'VotingWebPkg' and service package activation ID '204f1783-f774-4f3a-b371-d9983afaf059' is in Error.
'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959375885791093'.
There was an error during CodePackage activation.The service host terminated with exit code:1
Deployed application on node '_nt3vm_0' is in Error.
50% (1/2) deployed service packages are unhealthy.
Service package for manifest 'VotingWebPkg' and service package activation ID '2533ae95-2d2a-4f8b-beef-41e13e4c0081' is in Error.
'System.Hosting' reported Error for property 'CodePackageActivation:Code:SetupEntryPoint:131959376108346272'.
There was an error during CodePackage activation.The service host terminated with exit code:1
NodeHealthStates : None
ApplicationHealthStates :
ApplicationName : fabric:/Voting
AggregatedHealthState : Error
HealthEvents : None
ノードの正常性の取得
Get-ServiceFabricNodeHealth コマンドレットは、ノード エンティティの正常性を返し、ノードでレポートされた正常性のイベントが含まれます。 まず、Connect-ServiceFabricCluster コマンドレットを使用してクラスターに接続します。 次の例では、既定の正常性ポリシーを使用して特定のノードの正常性を取得します。
Get-ServiceFabricNodeHealth _nt1vm_3
次の例では、クラスター内のすべてのノードの正常性を取得します。
Get-ServiceFabricNode | Get-ServiceFabricNodeHealth | select NodeName, AggregatedHealthState | ft -AutoSize
システム サービスの正常性の取得
システム サービスの正常性の集計を取得します。
Get-ServiceFabricService -ApplicationName fabric:/System | Get-ServiceFabricServiceHealth | select ServiceName, AggregatedHealthState | ft -AutoSize
次のステップ
このチュートリアルでは、以下の内容を学習しました。
- Service Fabric イベントの表示
- クラスター イベントに対して EventStore API のクエリを実行する
- インフラストラクチャの監視/パフォーマンス カウンターの収集を行う
- クラスターの正常性レポートを表示する
次に、以下のチュートリアルに進んで、クラスターをスケーリングする方法について学習します。