駆け出しアーキテクトのやまぱんです。
この記事は Microsoft Azure Tech Advent Calendar 2022 の 24 日目の記事です。
今回は Azure Log Analytics で Azure VM (Windows/Linux) のパフォーマンス (CPU/メモリ/ディスク) 情報を取得し分析する方法についてお伝えします。
途中ハマりポイントがあったので記しておきます!!
レガシーエージェントとモダンエージェント
まず、 Log Analytics で Azure VM のパフォーマンスを取得し分析するためには VM エージェントの拡張機能によって Azure VM のデータを収集します。
現在 拡張機能のエージェントとして、1.Log Analytics エージェント を用いる方法 と 2.Azure Monitor エージェント を用いる方法の 2 種類の方法があります。
Log Analytics エージェント は Docs ではレガシエージェントとも記載されています。
Docs では " レガシ Log Analytics エージェントは、2024 年 8 月以降はサポートされません。" と記載されており、そのため、現在構築するのであればレガシーエージェントである Log Analytics エージェント ではなく、モダンなエージェント(モダンエージェント)である Azure Monitor エージェントを用いることをオススメします。
Log Analytics エージェント:レガシーエージェント (2024 年 8 月以降はサポートされません。)
Azure Monitor エージェント:モダンエージェント
なお現在インストールされている VM エージェントの拡張機能は Azure Portal 下記のように確認することが可能です。
手順:"Azure Portal" → "仮想マシン" → 対象の Azure VM → ”拡張機能とアプリケーション”
Windows の場合
- AzureMonitorWindowsAgent → Azure Monitor エージェント:モダンエージェント
- MicrosoftMonitoringAgent → Log Analytics エージェント:レガシーエージェント
Linux の場合
- AzureMonitorLinuxAgent → Azure Monitor エージェント:モダンエージェント
- OmsAgentForLinux → Log Analytics エージェント:レガシーエージェント
環境構築
Log Analytics エージェント(レガシーエージェント)での設定
参考までにレガシーエージェントでの設定方法も記載しておきます。
上述した通り、こちらの設定方法はサポートが切れることが決定しています。
レガシーエージェントでの設定方法は Log Analytics ワークスペースから行うことが可能です。
"Azure Portal" → "Log Analytics ワークスペース" → "仮想マシン" より、 Azure VM の一覧が表示されるので分析対象としたい Azure VM を選択し、"接続" を押下することで設定完了です。数分で完了します。
また、他にも設定方法はあるので、気になるかたは後述の Docs を確認してください。
対象の Azure VM が稼働している場合は、数分で Log Analytics ワークスペースよりパフォーマンス情報を確認することが可能です。
・Log Analytics エージェント(レガシーエージェント)の概要
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/log-analytics-agent
Azure Monitor エージェント(モダンエージェント)での設定
つぎに Azure Monitor エージェントでの設定方法です。
手順:”Azure Portal” → ”モニター” → ""データ収集ルール"" → "[作成]をクリック"
・Azure Monitor エージェント(モダンエージェント) の概要
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/agents-overview
設定内容例 (Windows の場合)
・Windowsの場合はイベントログ、Linux の場合は syslog も取得することが可能です。
[プラットフォームの種類] : [カスタム] について
後述の Docs (データ収集ルールを作成する) 内で下記のように記載がありますが、今回私が検証したところ、[カスタム]を利用した場合でも仕様上、Winodows と Linux を同一のデータ収集ルール内で設定している場合、デフォルトでは Winodws 用のパフォーマンスカウンターのみしか設定がされないため、Linux 用のパフォーマンスカウンターが欠損してしまい、一部のパフォーマンス情報が取得できませんでした。(メモリ使用率が取得できませんでした。)
今回の解決策としては、Windows / Linux 向けのデータ収集ルールをそれぞれ作成することで解決しました。
"[プラットフォームの種類] により、このルールを適用できるリソースの種類を指定します。 [カスタム] オプションにより、Windows と Linux の両方の種類が許可されます。"
なので、今回下記のように 2 つのデータ収集ルールを作成しました。(送信先の Log Analytics ワークスペースはどちらも同じ。)
公式詳細手順は下記にあります。
・データ収集ルールを作成する - Azure Monitor エージェントを使用して仮想マシンからデータを収集する
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/data-collection-rule-azure-monitor-agent?tabs=portal#create-a-data-collection-rule
・インストール - Azure Monitor エージェントを管理する
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-manage?tabs=azure-portal#install
収集対象の OS 種別 (Windows / Linux) によってデータ収集ルールを分ける。
Log Analytics ワークスペースで確認する
設定が完了すれば、拡張機能 (それぞれのエージェント) がインストールされ、 Log Analytics で性能情報が取得できるはずです。
"Log Analytics" → "ログ" からクエリを実行することができます
無事に Log Analytics でLinux も Winodws もログの収集ができていることが分かります。1分程度のラグがあるがほぼリアルタイム。(PowerShellの方はJSTでクエリの結果はUTCなので 9:00 の表記差を考慮するとほぼリアルタイム)
画面ショットの通り、Linux と Windows では Object Name や InsatanceName が異なることがあります。
それを使ってLinux とWindows を分けて抽出することが可能です。
参考クエリ
以下に参考クエリをメモしておきます。
要件に合わせてクエリを記述する際の参考になれば幸いです。
性能情報のテーブルは Perf です。
1.合計 CPU 使用率 (30秒ごと)
ObjectName で分けます。
Windows
Perf //cpu usage (Windows) per 30sec
| where CounterName == "% Processor Time" and ObjectName =="Processor Information"
| summarize CpuUsage=avg(CounterValue)by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 30s)
|order by TimeGenerated desc
Linux
Perf //cpu usage (Linux) per 30sec
| where CounterName == "% Processor Time" and ObjectName =="Processor" and InstanceName =="total"
| summarize CpuUsage=avg(CounterValue)by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 30s)
|order by TimeGenerated desc
まとめて出す
Counter Name 共通、双方の対象 InsatanceName に "total" が入っていることを利用します。
Perf //cpu usage (Windows and Linux) per 30sec
| where CounterName == "% Processor Time" and InstanceName contains "total"
| summarize CpuUsage=avg(CounterValue)by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 30s)
|order by TimeGenerated desc
2.メモリ利用率 (30秒ごと)
CounterName で分けます。
Windows
Perf //Memory usage (Windows) per 30sec
| where CounterName == "% Committed Bytes In Use"
| summarize MemoryUsage=avg(CounterValue)by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 30s)
|order by TimeGenerated desc
Linux
Perf //Memory usage (Linux) per 30sec
| where CounterName == "% Used Memory"
| summarize MemoryUsage=avg(CounterValue)by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 30s)
|order by TimeGenerated desc
まとめて出す
素直に or します。
Perf //Memory usage (Windows and Linux) per 30sec
| where CounterName == "% Committed Bytes In Use" or CounterName == "% Used Memory"
| summarize MemoryUsage=avg(CounterValue)by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 30s)
|order by TimeGenerated desc
3.ディスク空き容量 (30秒ごと)
ObjectName で分けます。
ややこしいですが、"LogicalDisk" か "Logical Disk" です。
Windows
Perf //Disk Free Space (Windows) per 30sec
| where CounterName == "% Free Space" and ObjectName =="LogicalDisk"
| summarize AggregatedValue=avg(CounterValue ) by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 1m)
Linux
InstanceName =="/" でマウントポイントをルートディレクトリに指定してる。
Perf //Disk Free Space (Linux) per 30sec
| where CounterName == "% Free Space" and ObjectName =="Logical Disk" and InstanceName =="/"
| summarize AggregatedValue=avg(CounterValue ) by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 1m)
まとめて出す
Counter Name が 共通なので、or して上記 2 つを合わせて出す。
Perf //Disk Usage (Windows and Linux) per 30sec
| where CounterName == "% Free Space"
| where InstanceName =="/" or InstanceName =="_Total"
| summarize AggregatedValue=avg(CounterValue ) by Computer,ObjectName,CounterName,InstanceName, bin(TimeGenerated, 1m)
perf 以外のテーブル(イベントログや syslog)
今回はさらっと流しますが、参考までにイベントログや Syslog 収集をした場合はそれぞれ下記のテーブルから取得できます。
その他クエリ参考 Docs