🥨

Azure Monitor で プロセス監視(Dependency Agent)

2024/03/07に公開

はじめに

本記事では Dependency Agent を利用して Windows / Linux 仮想マシンのプロセス監視を試してみます。
なお、他にどういう方法があるかは以下の記事を参照ください。
https://zenn.dev/microsoft/articles/azuremonitor-processes

Dependency Agent (VM Insights 機能で利用されているエージェント) を利用すると、 Azure Log Analytics へ プロセスの情報を含むログ (VMProcessテーブル + InsightsMetrics テーブル) を収集することができ、このログに対して Kusto クエリ をかけることで、プロセス監視することが可能です。
Dependency Agent を活用したプロセス監視の方法については、以下の記事が非常に参考になります。

https://akazure.hatenablog.com/entry/2022/03/03/132148

https://blog.blue.wirednet.jp/2020/02/03/71/azure-monitor-for-vmsで仮想マシンの中のプロセス一覧を取得す/

Dependency Agent は以前からあるエージェントであるため、先人の知恵を活用可能でき、ありがたいですね!
いちおう簡単に以下でも仕組みは記載をしておきますが、元記事の方が詳しいです。

仕組み

InsightsMetrics テーブル (公式ドキュメント) には、CPU の使用率など様々な値が格納されます。
その中の一つ、具体的には Name : Heartbeat かつ Origin: vm.azm.ms/map のログの Tags の値として、プロセスの情報が格納されています。
が、しかし、以下キャプチャ例のとおり、格納されている値は p-**** という VMProcessテーブル の ID 表記となってしまっています。

一方、VMProcess テーブル (公式ドキュメント) には、プロセスの表示名 や プロセス名 が格納されています。
例えば、以下のキャプチャ例だと、
 Process(プロセスの名前): p-b781d59041ab585a6840bac8eb710f38e22ab6c2
 ExecutableName(プロセスの実行可能ファイルの名前): sqlservr
という関係が見えます。

ちなみに、複数の似たプロセスが起動している場合、例えばコマンドラインの引数が異なるもののプロセス名が同じものが複数起動している場合などは CommandLine 列でフィルタする等して、意図したものを監視対象にするようにします。

ということで、この2つのテーブル、 InsightsMetrics テーブル に格納されている起動中のプロセスの ID と、VMProcessテーブル に格納されている プロセス名 を結合することで、プロセス監視ができそうですね。

やってみる

今回はお手軽な方法として、デモ環境として公開されている以下の Log Analytics ワークスペース を利用して、上記の参考記事に記載されているクエリをサンプルとして確認してみます。

参考手順1

まずは、こちらで紹介されているクエリから試します。
https://akazure.hatenablog.com/entry/2022/03/03/132148

VMProcess テーブルから監視したいプロセスの ID (P-***) を、変数 SampleProcessID として取得しておき、InsightsMetrics テーブル から Tags に SampleProcessID の値を含むものを取得する、というクエリの作りになっています。
例えば以下のように、sqlservr.exe のプロセスの ID を取得して、直近 5 分間での起動状況を確認できます。

  • クエリ例
Kusto Query
// https://akazure.hatenablog.com/entry/2022/03/03/132148 で紹介されているクエリ。
// 今回の例は
//  監視対象 VM      : SQL00.na.contosohotels.com
//  監視対象 Process : sqlservr.exe
// 
let SampleProcessID = toscalar (
    VMProcess
    | where Computer startswith "SQL00.na.contosohotels.com"
    | where ExecutablePath contains "sqlservr.exe"
    | top 1 by TimeGenerated
    | project Process
);
InsightsMetrics
| where Name == "Heartbeat" and Origin == "vm.azm.ms/map"
| where Computer startswith "SQL00.na.contosohotels.com"
| where isnotempty(SampleProcessID) and Tags contains SampleProcessID
| where TimeGenerated > ago(5m)
  • 実施例

なお、Linux でも同様に監視可能です。
例えば、/usr/sbin/sshd が稼働しているかを確認する例。

Kusto Query
// https://akazure.hatenablog.com/entry/2022/03/03/132148 で紹介されているクエリ。
// 今回の例は
//  監視対象 VM      : CH1-UBNTVM
//  監視対象 Process : /usr/sbin/sshd
// 
let SampleProcessID = toscalar (
    VMProcess
    | where Computer startswith "CH1-UBNTVM"
    | where ExecutablePath contains "/usr/sbin/sshd"
    | top 1 by TimeGenerated
    | project Process
);
InsightsMetrics
| where Name == "Heartbeat" and Origin == "vm.azm.ms/map"
| where Computer startswith "CH1-UBNTVM"
| where isnotempty(SampleProcessID) and Tags contains SampleProcessID
| where TimeGenerated > ago(5m)

参考手順2

つづけて、こちらで紹介されているクエリを試します。
https://blog.blue.wirednet.jp/2020/02/03/71/azure-monitor-for-vmsで仮想マシンの中のプロセス一覧を取得す/

InsightsMetrics テーブル に VMProcessテーブル を、InsightsMetrics テーブル の Tags 列から作成した Process 列をもとに結合させて一覧表をつくり、その後、最終行にて、CommandLine 列に指定した値でフィルタするつくりとなっています。
例えば、以下のクエリは、DC01.na.contosohotels.com で起動している、リモート デスクトップ サービス (termsvcs) のプロセスを監視するものです。

Kusto Query
// https://blog.blue.wirednet.jp/2020/02/03/71/azure-monitor-for-vms%e3%81%a7%e4%bb%ae%e6%83%b3%e3%83%9e%e3%82%b7%e3%83%b3%e3%81%ae%e4%b8%ad%e3%81%ae%e3%83%97%e3%83%ad%e3%82%bb%e3%82%b9%e4%b8%80%e8%a6%a7%e3%82%92%e5%8f%96%e5%be%97%e3%81%99/ で紹介されているクエリ。
// 今回の例は
//  監視対象 VM      : DC01.na.contosohotels.com
//  監視対象 Process : svchost.exe -k termsvcs
// 
let ComputerName = "DC01.na.contosohotels.com";
let ProcessName = "svchost.exe -k termsvcs";
InsightsMetrics
| where Name == "Heartbeat" and Origin == "vm.azm.ms/map"
| where Computer startswith ComputerName
| summarize arg_max(TimeGenerated, *)
| extend Process = parse_json(extractjson("$.['vm.azm.ms/processIds']", Tags))
| mvexpand Process to typeof(string)
| join kind= leftouter (VMProcess | where Computer startswith ComputerName | summarize arg_max(TimeGenerated, *) by Process) on Process
| where CommandLine matches regex ProcessName
  • 実施例

まとめ

  • Dependency Agent を利用することで、Windows / Linux ともに監視可能
  • InsightsMetrics テーブル に格納されている起動中のプロセスの ID と、VMProcessテーブル に格納されている プロセス名 を結合する kusto クエリを実行することで、プロセス監視を実現する
  • kusto クエリの参考として、参照した 2つの記事 の手順、それぞれ試してどちらも監視可能であることを確認した

参考URL

https://zenn.dev/microsoft/articles/azuremonitor-processes

Microsoft (有志)

Discussion