Azure IaaSサーバの監視アラート


1.概要

Azure上に構築したIaaSサーバに対して、Azureの機能だけで監視アラートの設定したいと考え実装を行いましたので、その際の手順を残します。
せっかくなのでリソース監視については、昨年GAした「Azure Monitor for VMs」を使用してみました。

2.監視項目したいリソース

一般的にサーバで監視する以下の項目を監視し、閾値をトリガーにアラートを発呼します。
・CPU使用率(80%以上)
・メモリ使用率(80%以上)
・ディスク使用率(80%以上)
・サービス起動停止
・プロセス起動停止 ← わからないので諦めた
・死活

3.手順

①VMの作成(VM作成手順はそこら中にあるので省略します)
②Azure Monitor for VMsの有効化

仮想マシンのメニューから[監視]-[分析情報]を選択します。

[有効]を選択し、デプロイの完了を待ちます。

③LogAnalyticsワークスペースの作成

検索バーからloganalyticsを検索し、LogAnalyticsワークスペースを選択します。

LogAnalyticsワークスペースをデプロイします。

④LogAnalytics エージェントのインストール

LogAnalyticsのメニューから[ワークスペースのデータソース]-[仮想マシン]を選択します。

①で作成した仮想マシンを接続します。

⑤アラートの作成

検索バーからモニターを検索し、モニターを選択します。

モニターのメニューから、アラートを選択し、新しいアラート ルールを選択します。

以下を元にパラメータを選択し、アラート ルールの作成を選択します。
スコープ:③で作成したワークスペース
条件:例として15分間隔の監視アラートを作成したパラメータを以下に記載します。
アクション:メール及びWebhookを必要に応じて設定
アラート ルールの詳細:必要に応じて設定

・CPU使用率(80%以上)

検索クエリ

InsightsMetrics
| where Origin == "vm.azm.ms" 
| where Computer == "*********"
| where Namespace == "Processor" and Name == "UtilizationPercentage" 
| where Val >= 80

基準:結果の数
演算子:次の値より大きい
しきい値:14
期間(分単位):15
頻度(分単位):15

・メモリ使用率(80%以上)

検索クエリ

InsightsMetrics 
| where Origin == "vm.azm.ms" 
| where Computer == "*********"
| where Namespace == "Memory" and Name == "AvailableMB" 
| extend TotalMemory = toreal(todynamic(Tags)["vm.azm.ms/memorySizeMB"])
| extend AvailableMemoryPercentage =  ((1 - (toreal(Val) / TotalMemory)) * 100.0 )
| where AvailableMemoryPercentage >= 80

基準:結果の数
演算子:次の値より大きい
しきい値:14
期間(分単位):15
頻度(分単位):15

・ディスク使用率(Cドライブ使用率80%以上)

検索クエリ

InsightsMetrics
| where Origin == "vm.azm.ms"
| where Computer == "*********"
| where Namespace == "LogicalDisk" and Name == "FreeSpacePercentage"
| where parse_json(Tags).["vm.azm.ms/mountId"] == "C:"
| extend FreeDisk = tostring(todynamic(Tags)["vm.azm.ms/mountId"])
| summarize AggregatedValue = (100 - avg(Val)) by bin(TimeGenerated, 1m), Computer, _ResourceId, FreeDisk
| where AggregatedValue >= 80

基準:結果の数
演算子:次の値より大きい
しきい値:14
期間(分単位):15
頻度(分単位):15

・サービス起動停止(例:RDSサービス)

検索クエリ

Event
| where ( Computer has "*********")
| where ( EventLog == "System")
| where ( Source == "Service Control Manager" )
| where ( RenderedDescription has "Remote Desktop Services サービスは 停止 状態に移行しました。")

基準:結果の数
演算子:次の値より大きい
しきい値:1
期間(分単位):15
頻度(分単位):15

・死活

検索クエリ

Heartbeat
| where ( Computer has "*********")

基準:結果の数
演算子:次の値より小さい
しきい値:1
期間(分単位):15
頻度(分単位):15

"*********"は、サーバ名です。

4.最後に

LinuxOSも同じ感じでいけると思います。
もっとスマートな方法があればぜひ教えてください。