#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も同じ感じでいけると思います。
もっとスマートな方法があればぜひ教えてください。