返回介绍

ES在运维监控领域的其他玩法 - watcher报警

发布于 2020-06-28 10:03:45 字数 7458 浏览 1624 评论 0 收藏 0

Watcher 产品

Watcher 也是 Elastic.co 公司的商业产品,和 Shield,Marvel 一样插件式安装即可:

  1. bin/plugin -i elasticsearch/license/latest
  2. bin/plugin -i elasticsearch/watcher/latest

Watcher 使用方面,也提供标准的 RESTful 接口,示例如下:

  1. # curl -XPUT http://127.0.0.1:9200/_watcher/watch/error_status -d'
  2. {
  3. "trigger": {
  4. "schedule" : { "cron" : "0/5 * * * * ?" }
  5. },
  6. "input" : {
  7. "search" : {
  8. "request" : {
  9. "indices" : [ "<logstash-{now/d}>", "<logstash-{now/d-1d}>" ],
  10. "body" : {
  11. "query" : {
  12. "filtered" : {
  13. "query" : { "match" : { "status" : "error" }},
  14. "filter" : { "range" : { "@timestamp" : { "from" : "now-5m" }}}
  15. }
  16. }
  17. }
  18. }
  19. }
  20. },
  21. "condition" : {
  22. "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
  23. },
  24. "transform" : {
  25. "search" : {
  26. "request" : {
  27. "indices" : [ "<logstash-{now/d}>", "<logstash-{now/d-1d}>" ],
  28. "body" : {
  29. "query" : {
  30. "filtered" : {
  31. "query" : { "match" : { "status" : "error" }},
  32. "filter" : { "range" : { "@timestamp" : { "from" : "now-5m" }}}
  33. }
  34. },
  35. "aggs" : {
  36. "topn" : {
  37. "terms" : {
  38. "field" : "userid"
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. },
  46. "actions" : {
  47. "email_admin" : {
  48. "throttle_period" : "15m",
  49. "email" : {
  50. "to" : "admin@domain",
  51. "subject" : "Found {{ctx.payload.hits.total}} Error Events at {{ctx.trigger.triggered_time}}",
  52. "priority" : "high",
  53. "body" : "Top10 users:\n{{#ctx.payload.aggregations.topn.buckets}}\t{{key}} {{doc_count}}\n{{/ctx.payload.aggregations.topn.buckets}}"
  54. }
  55. }
  56. }
  57. }'

上面这行命令,意即:

  1. 每 5 分钟,向最近两天的 logstash-yyyy.MM.dd 索引发起一次条件为最近五分钟,status 字段内容为 error 的查询请求;
  2. 对查询结果做 hits 总数大于 0 的判断;
  3. 如果为真,再请求一次上述条件下,userid 字段的 Top 10 数据集作为后续处理的来源;
  4. 如果最近 15 分钟内未发送过报警,则向 admin@domain 邮箱发送一个标题为 “Found N erroneous events at yyyy-MM-ddTHH:mm:ssZ”,内容为 “Top10 users” 列表的报警邮件。

整个请求体顺序执行。目前 trigger 只支持 scheduler 方式(但是 schedule 下有 crontab、interval、hourly、daily、weekly、monthly、yearly 等多种写法),input 支持 search 和 http 方式,actions 支持 email,logging,webhook 方式,transform 是可选项,而且可以设置在 actions 里,不同 actions 做不同的 payload 转换。

crontab 定义语法和 Linux 标准不太一致,采用的是 Quartz,文件见:http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

condition, transform 和 actions 中,默认使用 Watcher 增强版的 xmustache 模板语言(示例中的数组循环就是一例)。也可以使用固化的脚本文件,比如有 threshold_hits.groovy 的话,可以执行:

  1. "condition" : {
  2. "script" : {
  3. "file" : "threshold_hits",
  4. "params" : {
  5. "threshold" : 0
  6. }
  7. }
  8. }

Watcher 中可用的 ctx 变量包括:

  • ctx.watch_id
  • ctx.execution_time
  • ctx.trigger.triggered_time
  • ctx.trigger.scheduled_time
  • ctx.metadata.*
  • ctx.payload.*

完整的 Watcher 插件内部执行流程如下图。相信有编程能力的读者都可以用 crontab/at 配合 curl,email 工具仿造出来类似功能的 shell 脚本。

watcher报警 - 图2

注意

在 search 中,对 indices 内容可以写完整的索引名比如 syslog,也可以写通配符比如 logstash-*,也可以写时序索引动态定义方式如 <logstash-{now/d}>。而这个动态定义,Watcher 是支持根据时区来确定的,这个需要在 elasticsearch.yml 里配置一行:

  1. watcher.input.search.dynamic_indices.time_zone: '+08:00'

笔者仿照 watcher 的配置语法,开源了一个基于 Kibana 扩展的类 watcher 监控项目,本书稍后 Kibana 章节将会有详细介绍。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文