首页 > 解决方案 > 如何按 Docker 实例对 Elastic Stack 警报进行分组?

问题描述

某个周期性任务应该每分钟发生一次。当阈值警报中出现以下情况时,我可以发送警报。

WHEN count() GROUPED OVER top 1 'periodicTaskLog' IS BELOW 1 FOR THE LAST 2 minutes

(这使用基本的手表创建 GUI。如果需要,我可以使用高级手表 JSON。)

我的复杂情况:此任务在 2 个或更多 Docker 实例中分别发生,我想检查它们是否被阻止。(这是在 Google AppEngine 柔性环境中。)

我想说“密钥periodicTaskLog必须在每个实例中每分钟出现一次。否则发送警报。”

我有领域instance_name。每个实例的名称都是任意值,例如 "a58hgh12g2""h9mm48dfh",在每个部署中都不同。因此,我无法将条件编码为将这些名称包含为文字。

那么,我该如何以这种方式进行分组呢?

标签: elasticsearchkibanaelastic-stack

解决方案


在这里查看答案

{
  "trigger": {
    "schedule": {
      "interval": "10s"
    }
  },
  "input": {
    "search": {
      "request": {
        "search_type": "query_then_fetch",
        "indices": [
          "packetbeat-*"
        ],
        "types": [],
        "body": {
          "size": 0,
          "query": {
            "match_all": {}
          },
          "aggs": {
            "unique_beat_names": {
              "terms": {
                "field": "ip",
                "size": 5
              },
              "aggs": {
                "response_code": {
                  "filter": {
                    "exists": {
                      "field": "dns.response_code"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "condition": {
    "script": {
      "source": "ctx.vars.missing=false;for (def beat_name : ctx.payload.aggregations.unique_beat_names.buckets){if(beat_name.doc_count == 0 || beat_name.response_code.doc_count == 0){ctx.vars.missing=true;}}return ctx.vars.missing;",
      "lang": "painless"
    }
  },
  "actions": {
    "my-logging-action": {
      "logging": {
        "level": "info",
        "text": "Oh yea"
      }
    }
  }
}

推荐阅读