Watcherのwebhookのbodyの設定方法について

お世話になっております。
Watcherについて、質問させて頂きます。

ご質問
①bodyの項目名(下記例だと"resion")について、以下エラーが発生します。
[x_content_parse_exception] [1:587] [script] unknown field [resion], parser not found

項目名は自由に指定できる認識ですが、違うのでしょうか。
エラーの解決策についてご教示をお願いします。

②bodyの値について、input句で取得したフィールドの値を設定したいです。
設定方法は下記で合っていますでしょうか。

お手数ですが、回答頂けますと幸いです。

{
  "trigger": {
    "schedule": {
      "interval": "1m"
    }
  },
  "input": {
    "search": {
      "request": {
        "search_type": "query_then_fetch",
        "indices": [
          "heartbeat*"
        ],
        "rest_total_hits_as_int": true,
        "body": {
          "query": {
            "match": {
              "monitor.status": "down"
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total": {
        "gt": 0
      }
    }
  },
  "actions": {
    "test": {
      "webhook": {
        "scheme": "https",
        "host": "https://XXXXXXX",
        "port": XXXX,
        "method": "post",
        "params": {},
        "headers":{},
        "body": {
                 "resion": "{{ctx.metadata.cloud.region}} ",
                 "instanceid": "{{ctx.metadata.instance.id}} " 
     }
     }
    }
  }
}

①の部分について書きます。

https://www.elastic.co/guide/en/elasticsearch/reference/current/actions-webhook.html#configuring-webook-actions

上の「Configuring webhook actions」に記載のある例を見ますと、bodyはオブジェクトではなく文字列を指定するようになっているようです。

つまり、"body": "{ \"resion\": \"何か\"}" のように書かれるのではと思います。

Microsoft TeamsのWebhookを呼び出すことでテストしましたが、以下のように書いて正常終了し、期待したメッセージが投下されました。

"actions": {
    "my-logging-action": {
      "logging": {
        "text": "There are {{ctx.payload.hits.total}} documents in your index. Threshold is 10."
      }
    },
    "test-hook": {
        "webhook": {
            "url": "https://outlook.office.com/webhook/hihimitsu/IncomingWebhook/himitsunomojiretsu",
            "method": "post",
            "params": {},
            "headers":{},
            "body": """
            {
              "text": "あいうえおmg"
            }
            """
        }
    }
  }

bodyのところの設定方法を上記のように文字列で指定してみてはどうでしょうか?

②の書き方ですが、取得した結果を含めることは可能ですが、取得した結果ごとにアクションを実行したいのか、1回のWatcherアクションを実行したいのかによっても書き方は変わるかと思います。

1つずつ通知すると、何度もWebhookを実行することとなり避けたいかな?と考えたので、今回は後者の例の書き方を示します。
通知された後のイメージは以下のようになります。

テストデータ

3件分のテストデータを作成しました。

POST forum1210/_doc/1
{
  "cloud": {
    "region": "ap-northeast-1",
    "instanceid": "instance-11111111"
  }
}
POST forum1210/_doc/2
{
  "cloud": {
    "region": "ap-northeast-1",
    "instanceid": "instance-22222222"
  }
}
POST forum1210/_doc/3
{
  "cloud": {
    "region": "us-west-2",
    "instanceid": "instance-33333333"
  }
}

Watcherの設定

ポイントは、bodyのsizeを0にしないこと。0にしていると、取得した中身が取れないので。
mustacheテンプレートの記法を使う {{#ctx.payload.hits.hits}}{{/ctx.payload.hits.hits}}の部分です。

検索クエリ部分などは本来何らかの条件を入れるべきですが、今回は1つの通知アクションで複数の検索結果の中身を含めるというサンプルにつき、match_allで省略します。

PUT _watcher/watch/forum1210
{
  "trigger": {
    "schedule": {
      "interval": "30m"
    }
  },
  "input": {
    "search": {
      "request": {
        "body": {
          "size": 10,
          "query": {
            "match_all": {}
          }
        },
        "indices": [
          "forum1210"
        ]
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total": {
        "gt": 0
      }
    }
  },
  "actions": {
    "test-hook": {
      "webhook": {
            "url": "https://outlook.office.com/webhook/himitsu/IncomingWebhook/himitsunomoji,
            "method": "post",
            "params": {},
            "headers":{},
            "body": """
            {
              "text": "{{ctx.payload.hits.total}} Errors have occured in the logs: <br>
                {{#ctx.payload.hits.hits}}
                  {{_source.cloud.region}}: {{_source.cloud.instanceid}} <br>
                {{/ctx.payload.hits.hits}}"
            }
            """
        }
    }
  }
}

ご参考になれば幸いです。

早急に回答頂きありがとうございます。
大変助かります。

下記body句の記載ですが、Watcherにコピーしたところ
エラー「Expected ' , ' instead of ' " '」が起こり保存できません。

お手数ですが、こちらのエラーの解決策も教えて頂けますと幸いです。

        "body": """
        {
          "text": "あいうえおmg"
        }
        """

KibanaのManagement/Watcherの管理画面より、条件を入力されてますでしょうか?
image

このエディタでは、 ””” を使って改行を入れた書き方がサポートされていませんので、1行で書く必要があります。

そこで、このように書いてみてください。

        ~中略~
        "params": {},
        "headers": {},
        "body": "{\"text\": \"あいうえお\"}"

image

DevToolsからWatcherを作成する場合には、先に示しました”””を使った書き方でもエラーになりません。

現象としては、以下の投稿と同一の現象かと思われます。

返信が遅くなり申し訳ありません。

①bodyの項目名のエラー
②bodyの値について、input句で取得したフィールドの値の設定

下記記載で解決しました。

"body": "{\"resion\": \"{{#ctx.payload.hits.hits}} {{_source.cloud.region}} {{/ctx.payload.hits.hits}}\",\"instanceid\": \"{{#ctx.payload.hits.hits}} {{_source.cloud.instance.id}} {{/ctx.payload.hits.hits}}\"}"

早急に回答頂きありがとうございました。
大変助かりました。

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.