Обнаружение аномалий это довольно обширная тема. Тут нужно учитывать множество факторов: время суток, регион, индекс и.т.д. Для начала нужно вообще разобраться, что для вас является аномалией. Для этого необходимо вручную оценить тренд, сделать визуализацию, и посмотреть в логи за то время, когда, как вам казалось, произшло что-то странное.

Поиск аномалий

Самый простой путь - это накидать небольшой дашборд с поиском и Timelion графиком по q='*'. Далее двигаясь по временной шкале можно визуально оценить те события, которые на наш взгляд кажутся странными. Потом можно исключить аномалии, которые таковыми не являются.

1hour визуализация .es(index='test-*').derivative() за последний час

Тут нам может показаться немного странным событие, которое происходило с 12:07 до 12:13. И, возможно, что это действительно аномалия, но пока рано судить.

Давайте отдалим на 12 часов.

12hours визуализация .es(index='test-*').derivative() за последние 12 часов

Теперь тут явно виднеется что-то не то в 12:55.

Посмотрим график за 24 часа.

24hours визуализация .es(index='test-*').derivative() за последние 24 часа

И у нас есть победитель! Красным кружочком я отметил показавшееся странным событие на 12-часовом графике. Но радоваться рано, теперь нужно изучить логи. Возможно, что ничего интересного не произошло, а например, просто какому-либо демону включили/выключили вывод debug-логов. Посмотрим на график с 14:30 до 15:30 и заодно изменим запрос на q='-loglevel:info AND -loglevel:debug' - нас интересуют ошибки и предупреждения, а не отладочная информация.

24hours визуализация .es(index='test-*', q='-loglevel:info AND -loglevel:debug').derivative()

И с включенным выводом отладочных сообщений, для сравнения

24hours визуализация .es(index='test-*', q='-loglevel:"info" AND -loglevel:"debug"').derivative().label(label='w/o debug'), .es(index='test-*', q='*').derivative().label(label='debug')

После этих действий можно приблизиться прямо к нужному временному промежутку и оставить только ошибки

1min визуализация с 15:13:50 по 15:13:55, q='loglevel:"error"'

Bingo! Мы нашли аномалию и ошибки. Но радоваться рано. Эти ошибки могут быть совершенно не критичными, как и оказалось в моем случае. Но по ним уже можно строить автоматизацию. Это ни в коем случае не заменяет мониторинга, но дает больше информации для предотвращения деградации какого-либо сервиса.

Автоматизация

Все, что мы делали выше – это ручное нахождение проблем. Теперь нужно сделать тоже самое, только скриптом. Мы будем делать поиск только по колличеству за час. Почему? Практически всегда ошибкам предшествуют различные предупреждения в невероятном колличестве. Да и любую логику и тюнинг можно навешивать уже потом.

Идея

Делаем запросы подобного вида:

{
  "query": { 
    "bool": { 
      "must": {
          "range":  {
            "@timestamp": {
              "gte" : "now-(X+1)h",
              "lt" :  "now-(X)h"
            }
          }
       }
    }
  },
  "size": 0
}

где X