【OpenSearch】アラート機能を使って直近5分間で発生したエラー件数をSlackに通知する

# はじめに
![slack_notification_thumbnail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515612/c0cfb085-ea07-facc-17b3-3520463766e8.png)
今回作成するアラート通知のイメージ

アプリケーションから出力されるログを OpenSearch を使って収集しています。エラーログが発生した際、Slack に通知を飛ばす仕組みを OpenSearch のアラート機能を使って組んでみました。今回はその手順を書いていきたいと思います。

## 執筆環境
OpenSearch：v 2.15.0

※本記事の内容は 2024/12 時点のものとなっています。OpenSearch の仕様変更等により、手順や画面のレイアウト等が記事の内容と異なる場合があるのでご了承ください。

# 手順
## 1. Slack に Incoming Webhook を追加する（Slack）
![incoming_webhook_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515612/59da41d1-dfaa-79a5-fda2-3a626be45626.png)


Slackのマーケットプレイス画面（`https://<ワークスペース名>.slack.com/marketplace`）にて「Incoming Webhook」と検索して追加してください。

「Slackに追加」を押すとIncoming Webhookインテグレーション追加画面が開くので、そこで通知を飛ばしたいチャンネルを選択して「Incoming Webhookインテグレーションの追加」をクリックすれば追加できます。

設定画面では説明ラベルや通知時の名前を設定できるので、適宜編集してください。

## 2. チャンネルを作成する（OpenSearch）
![opensearch_channel_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515612/cee0d82c-0cb9-c26e-c620-840be671ceb3.png)

OpenSearch のダッシュボードにアクセスし、チャンネル作成画面（`<OpenSearch DashboardsのURL>/app/notifications-dashboards`）を開きます。
そこで「Create channel」をクリックしてチャンネル作成を作成してください。

名前と説明部分は任意で大丈夫です。
Channel type は「Slack」を選択し、Slack webhook URL には手順1で作成した Incoming Webhook インテグレーションの Webhook URL を入力してください。

「Send test message」を押すと、Incoming Webhook にて指定したチャンネルにテスト通知を飛ばすことができます。「Create」を押せばチャンネルが作成されます。

## 3. モニターを作成する（OpenSearch）
![opensearch_monitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515612/ffb2657c-c056-c26f-ad8a-549137a09a43.png)

[OpenSearch Documentation - Monitors](https://opensearch.org/docs/latest/observing-your-data/alerting/monitors/)

`<OpenSearch DashboardsのURL>/app/alerting#/monitors` にアクセスしてモニター作成画面を開きます。

ここでは「5分ごとにモニターし、1件以上エラーログが発生した場合にエラーログの件数を Slack に通知する」モニターの作成を例に挙げたいと思います。
以下のように設定してモニターを作成してください（目的に応じて適宜異なるものを選択しても大丈夫です）。

### Monitor details
**Monitor name：**
任意のモニター名

**Monitor type：**
Per query monitor

**Monitor defining method：**
Extraction query editor

**Schedule：**
Frequency：By interval
Run every：5 Minuites

### Select data
**Select clusters：**
クラスター（最初から選択されていると思います）

**Indexes：**
監視対象のログのインデックスを指定

**Time field：**
時間フィールド（`@timestamp` など）を選択する

### Query
アラート対象とするログを取得するためのクエリを入力してください。

例：level が 400以上で、発生時刻が直近5分以内のログを対象とする場合
```sql
{
    "size": 0,
    "query": {
        "bool": {
            "must": [
                {
                    "range": {
                        "level": {
                            "from": "400",
                            "to": null,
                            "include_lower": true,
                            "include_upper": true,
                            "boost": 1
                        }
                    }
                },
                {
                    "range": {
                        "@timestamp": {
                            "from": "now-5m",
                            "to": "now",
                            "include_lower": true,
                            "include_upper": true,
                            "format": "epoch_millis",
                            "boost": 1
                        }
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1
        }
    }
}
```

### Triggers
「Add Trigger」をクリックしてトリガー設定画面を開き、以下設定してください。

**Trigger name：**
任意のトリガー名

**Severity level：**
任意の重大度レベルを指定（トリガーごとに重要度を管理できます）

**Trigger condition：**
トリガーを発火させる条件

例：「クエリで引っかかったログが1件以上ある」という条件の場合
```
ctx.results[0].hits.total.value > 0
```

**Action：**
- Action name：任意のアクション名
- Channels：先ほど作成したチャンネルを指定
- Message subject：Slack に通知するメッセージの件名
- Message：メッセージ内容

メッセージ内容の例：
```
直近5分間のエラー件数： {{ctx.results.0.hits.total.value}} 件
```

メッセージ内では以下の値も使用可能です。
[OpenSearch Documentation - Trigger variables](https://opensearch.org/docs/latest/observing-your-data/alerting/triggers/#trigger-variables)
```
// 例
モニター名： {{ctx.monitor.name}}
トリガー名： {{ctx.trigger.name}}
重大度： {{ctx.trigger.severity}}
アラートがトリガーされた期間の開始： {{ctx.periodStart}}
アラートがトリガーされた期間の終了： {{ctx.periodEnd}}
```

<br>
上記モニターを保存すれば、目的のログが発生する度に以下のようなアラート通知が Slack に飛ぶようになります。

![slack_notification_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515612/2c07937c-e50e-de6c-06f6-0a37ee7fa5ad.png)


# おわりに
クエリやトリガーの設定を変えることで好きな形のアラートを作成することができます。ぜひ目的に合ったアラートを作成してみてください。