SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Stack HCI のヘルスサービスのイベントログを KQL で加工する

leave a comment

Azure StackHCI では「SDDC グループ」(SDDC: Software-Defined Data Center) のクラスターグループ内で「ヘルスサービス」リソースが動作しており、Azure Stack HCI の稼働状況の監視が自動的に行われています。

ヘルスサービスによって確認された情報は、イベントログの「Microsoft-Windows-Health/Operational」に出力が行われており、この情報の活用については、Azure Monitor を使用してヘルス サービスのエラーの電子メールを送信する に記載されています。

Azure Stack HCI では、Azure ポータルから「分析情報 (Insights)」 を有効にすることで、Azure Monitor Agent (AMA) が導入され、Insights の構成 に記載されている情報がデフォルトで取得されます。

取得される情報については、前述の「Microsoft-Windows-Health/Operational」も含まれているのですが、この情報を Log Analytics ワークスペース に対しての KQL で取得しようとした場合には、多少加工が必要なようでしたので情報を残しておきたいと思います。

Azure Stack HCI では「Get-HealthFault」というコマンドレットがあり、このコマンドで Azure Stack HCI での障害の発生状況を確認することができます。

ここで確認できる情報と等価の内容が「Microsoft-Windows-Health/Operational」のイベントログにも出力が行われており、AMA により Log Analytics ワークスペース の「Event」テーブルに格納が行われます。

情報が出力されている 「Microsoft-Windows-Health/Operational」のイベントログですが、私の環境で確認できている範囲では次のような特徴があるようです。

  1. 5 分間に一度情報が出力される
  2. カバレッジ に記載されている障害の検知が行われる
  3. カバレッジの内容に該当する事象の検知の有無にかかわらず、特定のフォーマットでログが出力される
    • レベル: 情報 / イベント ID: 8496

「3.」の内容がポイントとなり、カバレッジでサポートされている障害の発生有無にかかわらず、ログは 5 分間隔で出力されており、カバレッジに該当した内容があった場合には、ログのテキスト内に追加の情報が出力されるということを意識する必要がありそうでした。

障害が発生していない状態では、次の画像のように、ログは出力されていても「Fault」の要素がブランクとなっています。

image

カバレッジで検知される障害が発生している場合は、次の画像のように「Fault」に情報が追加される形式となっています。

image

ヘルスサービスにより Log Analytics ワークスペースに連携されているログを使用したアラートルールを設定したい場合、

Event
| where Source =~"microsoft-windows-health"

 

というような KQL をベースにして情報の取得を検討するかと思いますが、このクエリだけでは「Faultがブランクの時のイベントログの情報」も含まれてしまっています。

アラートルールで使用する場合には「Fault に値が含まれているレコード」を取得する必要があるため、KQL で次のようにログを加工する必要があるようです。

Event
| where Source =~"microsoft-windows-health"
| extend _d = parse_xml(EventData)
| mv-expand _EventData = _d.DataItem.EventData.Data
| extend _text  = dynamic_to_json(_EventData.["#text"])
| where _EventData["@Name"] =~ "Fault" and 
    extract_json("$.Description", dynamic_to_json(_EventData.["#text"])) <> ""
| project  TimeGenerated, Computer,  
    RootObjectType = extract_json("$.RootObjectType", _text),
    ObjectType = extract_json("$.ObjectType", _text),
    Description = extract_json("$.Description", _text)
| sort by TimeGenerated desc


 

このようなクエリを実行すると、Fault に値が含まれているレコードのみを抽出することができ、「Microsoft-Windows-Health/Operational」を使用したアラートルールを作成することができそうです。

image

ログについては同一のメッセージが異なる「RootObjectType」で出力されているケースがあるようですが、1 件でも該当する情報がある場合は、アラートを実行する必要があると思いますので、今回のケースでは重複した情報がヒットしても問題はないかと思います。

Share

Written by Masayuki.Ozawa

7月 12th, 2023 at 11:00 am

Posted in Azure Stack HCI

Tagged with

Leave a Reply