みち草

Azure中心にまとめる技術情報ブログ

Azure Monitor Agent + Log Analytics でプロセス毎の CPU 使用率を可視化する

はじめに

Azure Monitor Agent で Windows VM のプロセス毎の CPU 使用率を示すパフォーマンス カウンターを Log Analytics に収集して、クエリで可視化してみました。

目次

Azure Monitor エージェント構成

事前に Windows VM 1 台と Log Analytics ワークスペースをデプロイしている状態です。

データ コレクション ルールの作成

Azure Monitor エージェントで Log Analytics にデータを収集する際は、データ コレクション ルールを作成します。

どのイベント ログからどんなイベントを収集する、どのパフォーマンス カウンターを収集する、そしてそれをどこのワークスペースに送信する、というルールを定義し、それを VM に関連付けます。

これにより、以前の Azure Monitoring Agent ではできなかった、VM 毎に収集するデータを変えつつ、1 つの Log Analytics ワークスペースにデータを収集する、ということができるようになっています。

Security Center Standard が必要だったセキュリティ イベントも、特に制限なく収集できるようになったのもポイントです。

最初ちょっとわかりづらいのは、Log Analytics ワークスペースではなく、Azure Monitor から作成する、ということでしょうか。

前置きはこのくらいにして、ルールを作成します。

  • プラットフォームの種類 : ルールの対象とする OS の種類を指定できます。Custom の場合は Windows と Linux の両方を対象とします。
  • エンドポイント ID : Log Analytics ワークスペースに接続するためのエンドポイントを指定できます。カスタム ログやアクセス制限など、一部のシナリオで必要ですが、今回は不要なので で OK です。

続いては、ルールの対象とする VM の選択です。

事前にデプロイしておいた VM を指定します。

Azure Monitor Agent でのデータ収集を行う場合、対象 VM にはマネージド ID の有効化とエージェントのインストールが必要ですが、ここで選択したマシンは自動でシステム割り当てマネージド ID の有効化、エージェント インストールが行われます。

続いて、収集するデータを指定します。

今回は、パフォーマンス カウンターを指定します。

"基本" にすればよくあるパフォーマンス カウンターは収集してくれるのですが、今回の目的であるプロセス毎の CPU は収集してくれないので、 "カスタム" にします

任意のパフォーマンス カウンターを指定できるため、以下の値を追加します。

\Process(*)\% Processor Time

必要なカウンターは、OS の Performance Monitor から探しましょう。今回はこれ。

全てのプロセスについて取得したいので、インスタンス名を表すカッコ内を、* にします。

ここでもう 1 つ、以下のカウンターを追加します。

\Process(*)\ID Process

これは、インスタンス毎のプロセス ID を表すパフォーマンス カウンターです。

\Process(*)\% Processor Time はインスタンス毎の CPU 使用率を表しますが、インスタンス名は再利用されます。

そのため、インスタンス名は同じだけどプロセス ID が変わっており、実際は別プロセスになっていることがあります。

プロセス ID の変化を確認できるようにするため、こちらも取得しておきます。

こんな感じで一番最後に追加されていれば OKです。

最後に、収集したデータを送信するターゲットを指定します。

作成しておいた Log Analytics ワークスペースを選択します。

Azure Monitor メトリックにも送ることができるようですが、現在はプレビューです。

データソースを追加して、データ コレクション ルールを作成します。

作成が完了したら、データが収集されるまで、数分待ちます。

クエリでの CPU 使用率の可視化

データが収集できたら可視化しましょう。

Log Analytics ワークスペースの "ログ" から KQL を実行します。

まずはとりあえず、取得したカウンターを使って、直近 1 時間以内のプロセス毎の CPU 使用率を可視化してみます。クエリはこちら。

Perf
| where TimeGenerated > ago(1h)
| where CounterName == "% Processor Time"
| summarize avg(CounterValue) by InstanceName, bin(TimeGenerated, 1min)
| render timechart 

可視化できましたが、なんだか飛びぬけたのが 2 つありました。

Idle と _Total 、未使用値と合計値っぽく、プロセス毎の CPU を見る上では不要そうなので除外するよう、以下のクエリに変更。

Perf
| where TimeGenerated > ago(1h)
| where CounterName == "% Processor Time"
| where InstanceName != "Idle"
| where InstanceName != "_Total"
| summarize avg(CounterValue) by InstanceName, bin(TimeGenerated, 1min)
| render timechart 

これでプロセス毎の CPU 使用率を可視化できました。

クエリでのプロセス ID の可視化

同様に、プロセス ID のカウンターも可視化してみます。

さっき除外した 2 つを同様に除くと、こんな感じのクエリに。

Perf
| where TimeGenerated > ago(1h)
| where CounterName == "ID Process"
| where InstanceName != "Idle"
| where InstanceName != "_Total"
| summarize max(CounterValue) by InstanceName, bin(TimeGenerated, 1min)
| render timechart  

とても見づらいですが CPU 使用率のグラフがメインで、そこで特定プロセスの使用率の変化を確認した際にこっちの変化も見る、という感じになると思うので、 プロセス ID が変わっているかいないかがわかれば十分かと思います。

どちらのグラフも、特定のプロセスだけ見たくなったら、where 文を追加すればいいですし。

ということで、プロセス ID 変化も可視化できました。

これらのクエリは保存しておくことができるので保存していつでも呼び出せるようにするか、可視化したグラフ自体をダッシュボードや Azure ブックにピン留めして使うのがいいと思います。

終わりに

プロセス毎の CPU 使用率を可視化したい、という都合があり試したことをまとめました。

対象のカウンターさえわかれば、Azure Monitor エージェントの設定自体は非常に簡単です。

カスタム ログにも対応したので、別途そちらもまとめたいと思います。