2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenSearchのインデックスサイズの監視をAlerting機能で実施する

Last updated at Posted at 2025-01-11

はじめに

OpenSearchのプロビジョンドは、大きなインデックスが作成されると容量が不足して落ちることがあります。
それを検知するために、ドメインのストレージサイズが少なくなったらそれをCloudWatchで検知することはよくやります。

ただ、CloudWatchでは、プロビジョンドのOpenSearch内の個別インデックス単位でサイズを検知することはできません。
今回は、それをOpenSearchのAlerting機能で実現してみます。

前提条件

  • 東京リージョン
  • OpenSearchのバージョンは2.17
  • Channelは既に作成済み
    • typeはSNSで、SNSにはメールアドレスをサブスクリプション設定済み

やってみる

Monitorの新規作成

OpenSearchのアラートは、Monitorを作成することで実現します。
詳細は、以下のBlackBelt資料にわかりやすく載っているので読んでみてください。

AWS Black Belt Online Seminar Amazon OpenSearch Service 機能解説 – モニタリング・オブザーバビリティ編

まずはMonitorを作成していきます。
Monitorsの画面から、「Create monitor」をクリックします。

image.png

Monitor details の設定

Monitorを新規作成したら、以下のように Per cluster metrics monitor を選択します。これで、このクラスターのメトリクスに対してクエリができます。
頻度は、要件に従って設定してください。今回は、Dailyにしています。

image.png

Query の設定

次に、Queryを設定していきます。
Request typeに List indicies を設定します。こうすることで、インデックスの情報をクエリできます。
Responseの内容が全インデックスの情報です。
この中のpri.store.sizeがインデックスのサイズなので、この情報を使っていきます。

image.png

Triggers の設定

ここがポイントです。
Trigger conditionで記載した結果がtrueなら、アラートが飛びます。そのため、指定のサイズ以上のインデックスが存在するかどうかをチェックします。

具体的なコードは以下です。1行目のインデックスサイズの閾値は、適宜修正してください。
ちなみに、ここで記述できるのはPainlessと呼ばれるOpenSearch(およびElasticsearch)専用のスクリプト言語です。

def threshold = 5; // 閾値5GBに設定。適宜修正する。
def largeIndices = [];

for (int i = 0; i < ctx.results[0].indices.size(); ++i) {
    def index = ctx.results[0].indices[i];
    def sizeStr = index["store.size"];
    if (sizeStr != null) {
        def matcher = /(\d+(?:\.\d+)?)\s*([kmgtKMGT]?[bB])/.matcher(sizeStr);
        if (matcher.matches()) {
            def size = Double.parseDouble(matcher.group(1));
            def unit = matcher.group(2).toLowerCase();
            def sizeInGB = 0.0;
            
            if (unit.startsWith("k")) {
                sizeInGB = size / (1024 * 1024);
            } else if (unit.startsWith("m")) {
                sizeInGB = size / 1024;
            } else if (unit.startsWith("g")) {
                sizeInGB = size;
            } else if (unit.startsWith("t")) {
                sizeInGB = size * 1024;
            } else {
                sizeInGB = size / (1024 * 1024 * 1024);
            }
            
            if (sizeInGB >= threshold) {
                largeIndices.add([
                    "name": index["index"],
                    "size": sizeStr
                ]);
            }
        }
    }
}

ctx.results[0].largeIndices = largeIndices;
ctx.results[0].thresholdGB = threshold;
return !largeIndices.isEmpty();

returnの直前で、ctx.results[0]に変数を新規作成して値を代入しています。
これは、メールの内容に、閾値を超えたインデックス名と閾値を入れるためです。

Trigger conditionにコードを入力したら、「Preview condition response」を押してみてください。閾値以上のインデックスサイズがあれば、右のresponseにtrueが返るはずです。

image.png

Actions の設定

ここでは、アラート時のメールの内容を記載します。
Messageに以下のように記載します。

{{#ctx.results.0.largeIndices.0}}
以下のインデックスが{{ctx.results.0.thresholdGB}}GB以上のサイズに達しています:

{{/ctx.results.0.largeIndices.0}}
{{#ctx.results.0.largeIndices}}
- インデックス名: {{name}}
- サイズ: {{size}}

{{/ctx.results.0.largeIndices}}
{{^ctx.results.0.largeIndices}}
{{ctx.results.0.thresholdGB}}GB以上のサイズのインデックスは見つかりませんでした。

{{/ctx.results.0.largeIndices}}
詳細な情報はOpenSearch Dashboardsで確認してください。

{{#ctx.results.0.largeIndices}} から {{/ctx.results.0.largeIndices}} と囲うことで、for文のようにループを回すことが出来ます。largeIndiciesは1つ前のTriggerでlistとして定義しているため、閾値以上のサイズのインデックスの名前とサイズがメールに記載されます。

ここの記載方法は以下に詳細が書かれているので、ご興味ある方はご覧ください。

この状態で、Preview messageにチェックを入れると、閾値を超えるインデックスが存在する場合、以下のように表示されるはずです。

image.png

あとはMonitorを作成すれば完了です。

実際にアラートを飛ばしてみる

以下のようなメールが飛んでいます。
ただ、インデックスサイズは基本減らないので、何も処理をしないとアラートが上がり続けることに注意しましょう。

image.png

おわりに

OpenSearchのAlertingに関しては、あまり情報がないですが、やりたい要件を実装できてよかったです。
個人的に、Triggerで変数を新規作成して、それをMessageに使えるというのは知らなかったです。そんな使い方ができるとは…。OpenSearchのAlerting、侮れないですね。

ちなみに、今回は(も?)TriggerやMessageでのコーディング内容は生成AIをふんだんに使いました。なければ実装できなかったと思います。こういう情報があまりない分野では、ハルシネーションをちょくちょく起こすとは言え、特に助かりますね。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?