脱運用管理システム… xxを使わずに、Azureでアプリのログを監視する

# はじめに
Azureでシステム開発を請け負うことになりそうなのだが、
とっても高価な運用管理システムを使うのはコスト的に見合わないプロジェクトって、監視とかどうするんだっけな？と思って調べ始めたのがきっかけで、「Applicaiton Insights」というものにたどり着きました。

当初は、Spring BootアプリのLoggerからデータを飛ばせたらなと思いつつ、調査を始めたのですが、
この「Applicaiton Insights」を使えば、各種アプリのメトリクスも取得できそうなので、合わせてやってみようと思います。

最終的には、よくあるアプリの監視で、一定レベル以上のログが出力されたら、メールを生成して何か起こっているよと伝えることを目標とします。脱運用管理システムです。

# Azure Monitor
統合モニタリングサービスです。このサービスを使用することで、Azureリソースのパフォーマンス、可用性、セキュリティをリアルタイムで監視することができます。

# Application Insights
Azure上で動作するアプリの、パフォーマンスモニタリングを行うためのサービスです。

# やってみる
## Azure Insightsの設定
### Insightsを起動する
まずは、管理コンソールのAzureサービスから、以下を探して選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/1dd2be72-2221-ff89-b2b8-782ceafbf894.png)

### 作成する
左上にある、「作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/8dab0db2-bdcb-8885-03d4-6262672bc20f.png)

必要な項目を入力し、作成を進める。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/a52975ea-f7c2-0bc4-5968-c689d130a4e5.png)

デプロイが完了したら、以下の概要ページを表示する。「接続文字列」をあとで使うので、コピーして保存しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/0b7b4825-68fa-3c2e-fbb7-a705e516f803.png)


## Spring Bootアプリの設定
Application Insights Javaというライブラリを使います。ダウンロードは[こちら](https://github.com/microsoft/ApplicationInsights-Java/releases)


Spring Bootを起動する際の、JVM引数に以下のような指定をすることで、「Application Insights Java」を有効にすることができます。

```bash
java -javaagent:"path/to/applicationinsights-agent-3.5.3.jar" -jar <myapp.jar>
```
さらに、applicationinsights-agent-3.5.3.jarと、同じフォルダに、「applicationinsights.json」というファイルを作成し、そこに設定値を記載します。「connectionString」には、Insightの概要ページで保存した、「接続文字列」を張り付けてください。

```json:applicationinsights.json
{
  "connectionString": "InstrumentationKey=xxx;IngestionEndpoint=https://japaneast-1.in.applicationinsights.azure.com/;LiveEndpoint=https://japaneast.livediagnostics.monitor.azure.com/;ApplicationId=xxxxxx-xxxx-xxx-xxxx-xxxx",
  "role": {
    "name": "my cloud role name"
  }
}
```

### サンプルソース
ここまでできたら、あとは、Loggerで、ログを出力するだけ

```java
public class IndexController {

    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    @GetMapping("/")
    public String index(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        logger.error("This is Error log。これは、エラーメッセージです。");

        return "Hello world!";
    }
}
```

### 試してみる
この状態で、Spring Bootを起動し、[http://localhost:8080/](http://localhost:8080/)にアクセスすると、
Insights 側に、ログなどいろいろと出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/7842fd2c-3e80-aef3-97df-c16392f37929.png)

## Alertの設定
さて、ここまでできたら、あとはこのログを監視して、特定の条件に一致したらメールを飛ばすというのをやってみます。

### Monitorの起動

Azureサービスから、「Monitor」を選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/39b3ccb1-92d4-134f-bdeb-ba85aa6b9bc2.png)

### アクショングループの作成

メニューから「アラート」を選択し、「アクショングループ」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/162b3632-ce34-9de7-5e8f-32a69f0277a7.png)

必要な項目を入力し、「次へ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/679ecf63-cfb1-d47a-520f-7d25c4361a14.png)

通知の方法や、メールアドレスなどを設定し、次へ（以降は設定しなくてよいので、そのまま作成まで進めてOK）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/c724971d-fec1-ad3a-890f-58d4503a1b8d.png)

### アラートルールの作成

メニューから「アラート」を選択し、「アラートルール」を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/b20e627e-8fef-8e1d-5001-08d797e1430c.png)


スコープを設定します。以下の画面から「範囲の選択」を選び、対象となるInsightsを選択し、適用したのち次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/06da2d60-e8e6-3c9d-55a0-24db3e48641f.png)

次に条件を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/39763cb3-0606-fe7c-0193-ea196c15318b.png)

検索クエリは以下の通り、エラーレベルが3（Error）以上が出力された場合に動作するようにします。
```
traces
| where severityLevel >= 3 // 3はエラーレベル
| order by timestamp desc
```

次にアクションを設定。
前段で作ったアクショングループと紐づけを実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/03f3d29a-b4ad-6dd2-75d8-760465d06529.png)

詳細では、ルール名と、ルールの説明を設定して、完了。あとは作成まで進めてOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/3338dc1d-8389-1d9a-d360-1bd1485c0b42.png)

## 実行してみた結果
さて、ここまでやったら、もう一度、[http://localhost:8080/](http://localhost:8080/)にアクセスします。
しばらく放置すると、設定したメールアドレス宛に、アラートメールが送信されます。
※5分間隔なので、ちょっと待ちましょう。

こんな感じのメールを受信しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/7b31380d-81c0-7c03-5999-610823720e8a.png)

# 最後に

調べ始めてから、検証できるまで大体3時間程度。
ログの監視以外にも、レスポンスの時間などのメトリクスも取得できるし、結構いいかなと思いました。

ただAzure内部で実行しても、おそらくHTTP（HTTPS）経由でInsightsを呼ぶ気がします。なので性能面とかは若干気になりました（実際には検証してみないと何とも）

とはいえ、高価な運用管理システムを使わずにアプリのログまで監視できるというのは、小さなシステムで始めたい層にとっては意味があるかなと感じました。