Azure VMのメモリ使用量などのアラート設定（LogAnalytics編）

メモリ使用量のメトリックはとれるんだけどアラートにできない、と言われて調べたら確かにできなかった。
標準で出来そうな感じですが、LogAnalyticsでアラート設定するのが一番楽そう、ということで以下を参考にした。

https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/data-sources-performance-counters

やりたいこと
----------------

VirtualMachine(VM)のメモリの使用量が xx% 超えたらアラート出したい。


前提
----------------------

- 対象のVMが存在すること

作業概要
--------------------

- LogAnalyticsワークスペースを作成
- VMにOMSエージェントを導入、ワークスペースとVMを接続
- LogAnalytics上から取得メトリックを設定
- LogAnalyticsを基にアラート設定


作業
-------------------

### LogAnalytics ワークスペースを作成

「[Log Analytics ワークスペース](https://portal.azure.com/#create/Microsoft.LogAnalyticsOMS)」で適当に作っておきます。

### VMにOMSエージェントを導入、ワークスペースとVMを接続

OMSは [Operations Management Suiteという製品](https://www.microsoft.com/ja-jp/cloud-platform/products-operations-management-suite.aspx)の略です。今回はLogAnalyticsへのデータ送信としてのAgentとして使うので、OMS自体を使うわけではない（はず）です。

対象のVirtualMachineのブレードから拡張機能として入れても良いですが、LogAnalyticsワークスペースからVMを指定して接続するほうが簡単です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/d8650231-2495-d320-5947-d28ca4399b7a.png)

LogAnalytics上の仮想マシンブレードから対象のマシンを選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/1b31ec69-b75d-e151-7873-e97ab8f55ebc.png)

接続を押してしばらく待つとワークスペースと繋がります。（VM上でAgentのインストーラが走ります）


### LogAnalyticsで取得するメトリックを設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/89813ab1-4186-91d6-3e93-bf8731e860a2.png)


LogAnalyticsワークスペース上の詳細設定ブレードからData→Linuxパフォーマンスカウンタを開き「選択したパフォーマンスカウンターを追加する」をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/b257bcd3-5625-d39a-bc13-8d7512f19cb0.png)

サンプリングの間隔などを変更したら保存。設定反映には少し時間がかかります。
また、転送量の課金が貧乏性にはそこそこ大きい(¥374.08/GB)です。サンプリング間隔やメトリック数は少し吟味したほうが良いかもしれません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/f10d696c-f6ee-76a4-1e74-6da4378f0f31.png)

3～5分ほど待ち、ログのブレードを確認します。Perfを見ると溜まっていっている様子が見えます。

### LogAnalyticsを基にアラート設定

ここまで出来たら後はアラート設定するだけです。

リソースにLogAnalyticsを選ぶ点に注意です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/027b90c3-1a52-98b4-84bf-bb1f664cdbda.png)

LogAnalyticsのCounterNameの値がメトリックとして出てくるので選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/c8627ea4-bbb7-f05e-df88-88ac2d29c59b.png)

今回はComputer(VMホスト名)単位で見たいので選びます。ちなみに1メトリックにつき「**0.1ドル*台数分**」がかかるようです。1000台で約1万円。


確認
-----------------

VM上で適当にメモリを確保します。CentOS 7はPythonが標準装備なのでこんな感じで。

```
# 400MB取り10分間スリープ
python -c 'import sys, time; x = "a" * int(sys.argv[1]); time.sleep(600)' $((1024 * 1024 * 400))
```

2つのVMのログを1個のLogAnalyticsワークスペースに集約しています。

しばらくするとメールがきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/4d34b8ac-af9d-2b82-8227-bc922176a56d.png)

アラートの条件でも制限していなかったので、2通来ています。
アラートの条件で選択するとちゃんと1通だけ来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/b73e3414-e1c4-a01c-c8e7-3d7c50e576c5.png)


しかし件名からはどこかわかりません。画像中の赤線部分だけです。気になる人はアラートを分けて作ったりしましょう。

その他
--------------------

### 自動化回り

アクショングループで対応できるようになり、比較的設定やメールアドレス変更対応等が簡単になりましたが、アラート設定周りはミスしやすいです。
幸い、コマンドやテンプレート化が可能です。（試していない）


### データ転送量を制限したい

料金はLogAnalyticsのデータ転送量に依存します。「LogAnalytics」だからとログを流すと容易に死にます。

上記の手順には書きませんでしたが、[LogAnalyticsワークスペース上から日時上限を設定できる](https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/manage-cost-storage)ので、ぜひ設定してください。小数点も0.023GBまでできます。[デフォルトは青天井のようです](https://docs.microsoft.com/en-us/azure/azure-subscription-service-limits#log-analytics-workspaces)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52527/68694578-95ea-a9fd-bf0e-a2cf178b1bcb.png)

また、日時上限設定すると[イベントログがLogAnalyticsに流れることによりアラート設定もできるようです](https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/manage-cost-storage#alert-when-daily-cap-reached)（試していない）

### 他になかったの？

仕組み的に、ホストからゲストVMのメモリやストレージ情報を取るのは難しいようです。そのためエージェントを使っているように見えます。（CPUはなんで取れるんですかね？）

- ApplicationInsightsにメトリックを送るのは？→JVM監視ならやってよいが、それ以外はオーバーキル感がある
- Zabbixとかは？→元々あるなら使っても良いかと思います
- PaaSは？（Mackerel,DataDog等）→使えるならそっちで良いかと思います

楽で簡単で最高な方法が乗り換えたいところ。

(追記) TelegrafとAzure Monitorのカスタムメトリックを使う方法を教えてもらいました。
[Azure VMのメモリ使用量などのアラート設定（Telegraf+Azure Monitor編）](https://qiita.com/fukasawah/items/c057a42aec463755bca0)