通过 Elasticsearch Watcher 发送预警消息到飞书

主要参考这篇博客,原文是发送消息到钉钉,发送到飞书也是类似的。

  • trigger 控制监视的时间间隔
  • input 指定查询条件
    查询条件的写法请参考官方文档
  • condition 指定阈值
  • actions 定义达到阈值后的行为,这里是 webhook
    请求的内容参考飞书机器人的使用文档

这是一个监控 5 分钟内某个关键字出现次数的监视脚本:

{
  "trigger": {
    "schedule": {
      "interval": "5m"
    }
  },
  "input": {
    "search": {
      "request": {
        "search_type": "query_then_fetch",
        "indices": [
          "log_*"
        ],
        "types": [],
        "body": {
          "size": 0,
          "query": {
            "bool": {
              "must": [
                {
                  "match": "TokenNotExist"
                },
                {
                  "range": {
                    "@dtTime": {
                      "gte": "now-5m",
                      "lte": "now",
                      "format": "epoch_millis"
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }
  },
  "condition": {
    "compare": {
      "ctx.payload.hits.total": {
        "gte": 10
      }
    }
  },
  "actions": {
    "my_webhook": {
      "webhook": {
        "scheme": "https",
        "host": "open.feishu.cn",
        "port": 443,
        "method": "post",
        "path": "/open-apis/bot/v2/hook/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "params": {},
        "headers": {
          "Content-Type": "application/json"
        },
        "body": "{\"msg_type\": \"text\",\"content\": {\"text\": \"TokenNotExist gte 10 in 5 minutes\"}}"
      }
    }
  }
}
  

ES 使用的阿里云上的实例,创建 Watcher 时报了如下错误:

Watcher: Error 400 Bad Request: no handler found for uri [/_xpack/watcher/watch/token_not_exist_warning] and method [GET]

在阿里云的帮助文档上看到如下注意事项:

如果在执行以上命令时,出现 No handler found for uri [/_xpack/watcher/watch/log_error_watch_2] and method [PUT] 异常,表示您购买的阿里云 Elasticsearch 实例未开启 X-Pack Watcher 功能,请开启后再执行以上命令。具体步骤,请参见配置 YML 参数

在 ES 实例的 ES 集群配置 页面可以修改这个配置,不过看提示修改后需要重启。因为是生产环境一直在用,怕影响使用,就暂时没有继续下去。

开启 Watcher:

开启后,可使用 X-Pack 的 Watcher 功能。请注意定时清理 .watcher-history* 索引,避免占用大量磁盘空间。
对应的 YML 文件的配置项为 xpack.watcher.enabled,默认为 false