Azure Log Analytics で Azure VM のパフォーマンスを分析する。

駆け出しアーキテクトのやまぱんです。
この記事は [Microsoft Azure Tech Advent Calendar 2022](https://qiita.com/advent-calendar/2022/microsoft-azure-tech) の 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 エージェントを用いることをオススメします**。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/agents-overview


:::note info
Log Analytics エージェント：レガシーエージェント (2024 年 8 月以降はサポートされません。)
Azure Monitor エージェント：モダンエージェント
:::

なお現在インストールされている VM エージェントの拡張機能は Azure Portal 下記のように確認することが可能です。
 **手順："Azure Portal" → "仮想マシン" → 対象の Azure VM → ”拡張機能とアプリケーション”**

>**Windows の場合**
+ AzureMonitorWindowsAgent → Azure Monitor エージェント：モダンエージェント
+ MicrosoftMonitoringAgent → Log Analytics エージェント：レガシーエージェント
![2022-12-23_02h22_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/e3e91829-c79d-90da-b686-2e55562f36d7.png)

>**Linux の場合**
+ AzureMonitorLinuxAgent → Azure Monitor エージェント：モダンエージェント
+ OmsAgentForLinux → Log Analytics エージェント：レガシーエージェント
![2022-12-23_02h28_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2cce57c3-1145-df04-35af-a4e14c7dc33b.png)

### 環境構築
#### Log Analytics エージェント(レガシーエージェント)での設定
参考までにレガシーエージェントでの設定方法も記載しておきます。

:::note warn
**上述した通り、こちらの設定方法はサポートが切れることが決定しています。**
:::

レガシーエージェントでの設定方法は Log Analytics ワークスペースから行うことが可能です。
"Azure Portal" → "Log Analytics ワークスペース" → "仮想マシン" より、 Azure VM の一覧が表示されるので分析対象としたい Azure VM を選択し、"接続" を押下することで設定完了です。数分で完了します。
また、他にも設定方法はあるので、気になるかたは後述の Docs を確認してください。


対象の Azure VM が稼働している場合は、数分で Log Analytics ワークスペースよりパフォーマンス情報を確認することが可能です。

![2022-12-23_02h45_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/8095c188-9833-2fc4-429c-758670136628.png)

・Log Analytics エージェント(レガシーエージェント)の概要
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/log-analytics-agent


#### Azure Monitor エージェント(モダンエージェント)での設定
つぎに Azure Monitor エージェントでの設定方法です。
 **手順：”Azure Portal” → ”モニター” → ""データ収集ルール"" → "[作成]をクリック"**
![2022-12-23_02h56_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/72fcdd1b-b836-82c9-5a7d-cb067070f5aa.png)

・Azure Monitor エージェント(モダンエージェント) の概要
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/agents-overview

##### 設定内容例 (Windows の場合)
下記のようにウィザードに従って設定を進めます。
![2022-12-23_03h03_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/b7a89831-2af7-c150-b9a8-ca4870950326.png)


・Windowsの場合はイベントログ、Linux の場合は syslog も取得することが可能です。

:::note warn
[プラットフォームの種類] : [カスタム] について
後述の Docs ([データ収集ルールを作成する](https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/data-collection-rule-azure-monitor-agent?tabs=portal#create-a-data-collection-rule)) 内で下記のように記載がありますが、今回私が検証したところ、[カスタム]を利用した場合でも仕様上、Winodows と Linux を同一のデータ収集ルール内で設定している場合、デフォルトでは Winodws 用のパフォーマンスカウンターのみしか設定がされないため、Linux 用のパフォーマンスカウンターが欠損してしまい、一部のパフォーマンス情報が取得できませんでした。(メモリ使用率が取得できませんでした。)
今回の**解決策としては、Windows / Linux 向けのデータ収集ルールをそれぞれ作成することで解決しました。**
> "[プラットフォームの種類] により、このルールを適用できるリソースの種類を指定します。 [カスタム] オプションにより、Windows と Linux の両方の種類が許可されます。" 
:::

なので、今回下記のように 2 つのデータ収集ルールを作成しました。(送信先の Log Analytics ワークスペースはどちらも同じ。)
![2022-12-23_03h24_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/bdc07a7a-3c09-d3ae-deb2-4fcfef12a57b.png)

+ データ収集ルール の下記で送信先の Log Analytics ワークスペースを指定します。
![2022-12-23_03h49_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/712c32b8-56e9-4ae0-794a-b96f5ca63f3a.png)


公式詳細手順は下記にあります。
・データ収集ルールを作成する - 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

:::note info
収集対象の OS 種別 (Windows / Linux) によってデータ収集ルールを分ける。
:::

##### Log Analytics ワークスペースで確認する
設定が完了すれば、拡張機能 (それぞれのエージェント) がインストールされ、 Log Analytics で性能情報が取得できるはずです。
"Log Analytics" → "ログ" からクエリを実行することができます
無事に Log Analytics でLinux も Winodws もログの収集ができていることが分かります。１分程度のラグがあるがほぼリアルタイム。(PowerShellの方はJSTでクエリの結果はUTCなので 9:00 の表記差を考慮するとほぼリアルタイム)
![2022-12-23_03h34_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/2e45123b-fae8-f7c9-4cac-b5c5cb0d6612.png)
画面ショットの通り、Linux と Windows では Object Name や InsatanceName が異なることがあります。
それを使ってLinux とWindows を分けて抽出することが可能です。

+ また、出力した結果は CSV やエクセルファイルとしてエクスポートすることが可能です。
![2022-12-23_03h42_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/1ea879d4-d213-8b1f-6c65-f36a6ec9cd48.png)


### 参考クエリ
以下に参考クエリをメモしておきます。
要件に合わせてクエリを記述する際の参考になれば幸いです。

:::note info
性能情報のテーブルは Perf です。
:::

* 性能情報のテーブルは Perf 
![2022-12-23_04h41_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/eae46dd1-7f6a-cbcc-1098-305f93a045fe.png)
これをベースに目的別に抽出します。

* 参考 Docs

https://learn.microsoft.com/ja-jp/sharepoint/dev/general-development/keyword-query-language-kql-syntax-reference



#### 1.合計 CPU 使用率 (30秒ごと)
**ObjectName** で分けます。
##### Windows
```qml:KQL
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
```qml:KQL
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" が入っていること**を利用します。
```qml:KQL
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
```qml:KQL
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
```qml:KQL
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 します。
```qml:KQL
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
```qml:KQL
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 =="/" でマウントポイントをルートディレクトリに指定してる。
```qml:KQL
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 つを合わせて出す。
```qml:KQL
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 収集をした場合はそれぞれ下記のテーブルから取得できます。

* イベントログ : Event
![2022-12-23_13h53_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/91f25299-ce91-f5d3-6ae9-4c7a536685cf.png)


* syslog : Syslog
![2022-12-23_13h54_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/cdfc91e4-83ff-4672-cab6-737fdab68b30.png)


### その他クエリ参考 Docs
https://learn.microsoft.com/ja-jp/azure/azure-monitor/alerts/alerts-log-query