Как сгруппировать предупреждение об упругом стеке по инстансам Docker? - PullRequest
0 голосов
/ 06 мая 2018

Определенная периодическая задача должна выполняться раз в минуту. Я могу отправить оповещение, когда оно зависает, при наличии следующего условия в пороговом оповещении.

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

(Использует базовый графический интерфейс создания часов. При необходимости я могу использовать Advanced Watch JSON.)

Мое осложнение: эта задача выполняется отдельно в 2 или более экземплярах Docker, и я хочу убедиться, что ни один из них не заблокирован. (Это в гибкой среде Google AppEngine.)

Я хочу сказать: «Ключ periodicTaskLog должен появляться каждую минуту в каждом случае. В противном случае отправлять оповещение».

У меня есть поле instance_name. Имя каждого экземпляра - это произвольное значение, например "a58hgh12g2" или "h9mm48dfh", различающееся в каждом развертывании. Поэтому я не могу закодировать условие для включения этих имен как литералов.

Итак, как мне группировать таким образом?

1 Ответ

0 голосов
/ 17 мая 2018

См. Ответ здесь

{
  "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"
      }
    }
  }
}
...