Как работает Watcher
Вы добавляете watch, чтобы автоматически выполнять действие, когда выполняются определенные условия. Условия обычно основаны на данных, загруженных в watch, также известные как Watch Payload. Это содержимое может загружаться из разных источников — из Elasticsearch, внешнего HTTP-сервиса или даже из комбинации этих источников.
Например, вы можете настроить watch, чтобы отправлять электронное письмо системному администратору, когда поиск в данных журналов показывает слишком много ошибок 503 за последние 5 минут.
В этом разделе описываются элементы watch и принцип их работы.
Определение watch
Watch состоит из триггера, ввода, условия и действий. Действия определяют, что нужно сделать, когда выполняется условие. Кроме того, вы можете определить условия и преобразования для обработки и подготовки содержимого watch перед выполнением действий.
- Триггер
- Определяет, когда проверяется watch. У watch должен быть триггер.
- Ввод
- Загружает данные в содержимое watch. Если ввод не указан, загружается пустое содержимое.
- Условие
- Управляет выполнением действий watch. Если условие не указано, условие по умолчанию —
always. - Преобразование
- Обрабатывает содержимое watch, чтобы подготовить его к действиям. Вы можете определить преобразования на уровне watch или определить преобразования, специфичные для действий. Необязательно.
- Действия
- Указывают, что происходит, когда выполняется условие watch.
Например, следующий фрагмент кода показывает запрос создания или обновления watch, который определяет watch, ищущий события ошибок в логах:
PUT _watcher/watch/log_errors
{
"metadata" : {
"color" : "red"
},
"trigger" : {
"schedule" : {
"interval" : "5m"
}
},
"input" : {
"search" : {
"request" : {
"indices" : "log-events",
"body" : {
"size" : 0,
"query" : { "match" : { "status" : "error" } }
}
}
}
},
"condition" : {
"compare" : { "ctx.payload.hits.total" : { "gt" : 5 }}
},
"transform" : {
"search" : {
"request" : {
"indices" : "log-events",
"body" : {
"query" : { "match" : { "status" : "error" } }
}
}
}
},
"actions" : {
"my_webhook" : {
"webhook" : {
"method" : "POST",
"host" : "mylisteninghost",
"port" : 9200,
"path" : "/{{watch_id}}",
"body" : "Encountered {{ctx.payload.hits.total}} errors"
}
},
"email_administrator" : {
"email" : {
"to" : "sys.admino@host.domain",
"subject" : "Encountered {{ctx.payload.hits.total}} errors",
"body" : "Too many error in the system, see attached data",
"attachments" : {
"attached_data" : {
"data" : {
"format" : "json"
}
}
},
"priority" : "high"
}
}
}
} | Метаданные — вы можете добавить необязательные статические метаданные к watch. | |
| Триггер — этот триггер по расписанию выполняет watch каждые 5 минут. | |
| Ввод — этот ввод ищет ошибки в индексе | |
| Условие — это условие проверяет, есть ли более 5 событий ошибок (попаданий в ответ поиска). Если их больше, выполнение продолжается для всех | |
| Преобразование — если выполняется условие watch, это преобразование загружает все ошибки в содержимое watch, выполняя поиск ошибок с использованием типа поиска по умолчанию, | |
| Действия — этот watch имеет два действия. Действие |
Выполнение watch
При добавлении watch Watcher немедленно регистрирует его триггер с соответствующим движком триггеров. Watches, у которых есть триггер schedule, регистрируются в движке триггеров scheduler.
Планировщик отслеживает время и запускает watch в соответствии с их расписаниями. На каждом узле, содержащем один из .watches фрагментов, запускается планировщик, связанный с жизненным циклом watcher. Хотя все главные и вторичные фрагменты учитываются, при запуске watch watcher также гарантирует, что каждый watch запускается только на одном из этих фрагментов. Чем больше вторичных фрагментов вы добавите, тем более распределенным будет выполнение watch. Если вы добавляете или удаляете вторичные фрагменты, все watch необходимо перезагрузить. Если фрагмент перемещается, первичный и все вторичные фрагменты этого конкретного фрагмента будут перезагружены.
Поскольку watch выполняются на узле, на котором находятся фрагменты watch, вы можете создавать выделенные узлы watcher, используя фильтрацию распределения фрагментов.
Вы можете настроить узлы со свойством node.attr.role: watcher, а затем настроить индекс .watches следующим образом:
PUT .watches/_settings
{
"index.routing.allocation.include.role": "watcher"
} Когда служба Watcher остановлена, планировщик останавливается вместе с ней. Движки триггеров используют отдельный пул потоков от того, который используется для выполнения watch.
Когда watch запускается, Watcher помещает его в очередь на выполнение. Создается и добавляется документ watch_record в историю watch, а статус watch устанавливается в awaits_execution.
При запуске выполнения Watcher создает контекст выполнения watch для watch. Контекст выполнения предоставляет скрипты и шаблоны с доступом к метаданным watch, содержимому, идентификатору watch, времени выполнения и информации о триггере. Более подробную информацию см. в разделе Контекст выполнения Watch.
Во время процесса выполнения Watcher:
- Загружает данные ввода в качестве содержимого в контексте выполнения watch. Это делает данные доступными для всех последующих шагов процесса выполнения. Этот шаг контролируется вводом watch.
- Оценивает условие watch, чтобы определить, продолжать ли обработку watch. Если условие выполняется (оценивается как
true), обработка переходит к следующему шагу. Если условие не выполняется (оценивается какfalse), выполнение watch останавливается. - Применяет преобразования к содержимому watch (при необходимости).
- Выполняет действия watch, если условие выполнено и watch не заблокирован.
После завершения выполнения watch результат выполнения записывается как Запись Watch в истории watch. Запись watch включает время выполнения и продолжительность, выполнено ли условие watch и статус каждого выполненного действия.
На следующей диаграмме показан процесс выполнения watch:
Подтверждение и ограничение watch
Watcher поддерживает как ограничение по времени, так и подтверждение. Это позволяет предотвратить многократное выполнение действий для одного и того же события.
По умолчанию Watcher использует временное ограничение с периодом ограничения 5 секунд. Это означает, что если watch выполняется каждую секунду, его действия выполняются максимум один раз каждые 5 секунд, даже когда условие всегда выполняется. Вы можете настроить период ограничения на основе каждого действия или на уровне watch.
Подтверждение позволяет указать Watcher не отправлять больше уведомлений о watch, пока выполняется его условие. Как только условие оценивается как false, подтверждение очищается, и Watcher продолжает выполнять действия watch в обычном режиме.
Дополнительную информацию см. в разделе Подтверждение и ограничение.
Активное состояние watch
По умолчанию при добавлении watch он сразу же устанавливается в состояние активный, регистрируется в соответствующем движке триггеров и выполняется в соответствии с его настроенным триггером.
Вы также можете установить watch в состояние неактивный. Неактивные watch не регистрируются в движке триггеров и никогда не могут быть запущены.
Чтобы установить watch в неактивное состояние при его создании, установите параметр active в неактивный. Чтобы деактивировать существующий watch, используйте API деактивации watch. Чтобы активировать неактивный watch, используйте API активации watch.
Вы можете использовать API выполнения watch, чтобы принудительно запустить watch, даже если он неактивный.
Деактивация watch полезна в различных ситуациях. Например, если у вас есть watch, который отслеживает внешнюю систему, и вам нужно остановить эту систему на время технического обслуживания, вы можете деактивировать watch, чтобы предотвратить ложные сообщения о проблемах доступности во время окна технического обслуживания.
Деактивация watch также позволяет сохранить его для будущего использования, не удаляя его из системы.
Скрипты и шаблоны
При определении watch вы можете использовать скрипты и шаблоны. Скрипты и шаблоны могут ссылаться на элементы в контексте выполнения watch, включая содержимое watch. Контекст выполнения определяет переменные, которые можно использовать в скрипте, и заполнитель параметров в шаблоне.
Watcher использует инфраструктуру скриптов Elasticsearch, которая поддерживает встроенные и хранящиеся шаблоны и скрипты. Скрипты и шаблоны компилируются и кэшируются Elasticsearch для оптимизации периодического выполнения. Также поддерживается автоматическая загрузка. Более подробную информацию см. в разделе Скрипты и Как писать скрипты.
Контекст выполнения watch
Следующий фрагмент кода показывает основную структуру контекста выполнения watch:
{
"ctx" : {
"metadata" : { ... },
"payload" : { ... },
"watch_id" : "<id>",
"execution_time" : "20150220T00:00:10Z",
"trigger" : {
"triggered_time" : "20150220T00:00:10Z",
"scheduled_time" : "20150220T00:00:00Z"
},
"vars" : { ... }
} | Любые статические метаданные, указанные в определении наблюдения. | |
| Текущая полезная нагрузка наблюдения. | |
| Идентификатор выполняемого наблюдения. | |
| Отметка времени, показывающая, когда началось выполнение наблюдения. | |
| Информация о событии срабатывания. Для срабатывания типа | |
| Динамические переменные, которые могут быть установлены и доступны различными конструкциями во время выполнения. Эти переменные ограничены одним выполнением (т.е. они не сохраняются и не могут быть использованы между различными выполнениями одного и того же наблюдения). |
Использование скриптов
Вы можете использовать скрипты для определения условий и преобразований. По умолчанию язык сценариев — Painless.
Начиная с версии 5.0, Elasticsearch поставляется с новым языком сценариев Painless. Painless был разработан специально для использования в Elasticsearch. Помимо обширного набора функций, его главной особенностью является то, что он правильно изолирован и безопасен для использования в любой части системы (в том числе в Watcher) без необходимости включения динамического сценарирования.
Скрипты могут ссылаться на любые значения в контексте выполнения наблюдения или значения, явно переданные через параметры скрипта.
Например, если метаданные наблюдения содержат поле color (например, "metadata" : {"color": "red"}), вы можете получить доступ к его значению через переменную ctx.metadata.color. Если вы передаете параметр color в качестве части определения условия или преобразования (например, "params" : {"color": "red"}), вы можете получить доступ к его значению через переменную color.
Использование шаблонов
Шаблоны используются для определения динамического содержимого наблюдения. Во время выполнения шаблоны извлекают данные из контекста выполнения наблюдения. Например, вы можете использовать шаблон для заполнения поля subject для действия email данными, хранящимися в полезной нагрузке наблюдения. Шаблоны также могут получать доступ к значениям, явно переданным через параметры шаблона.
Вы определяете шаблоны, используя язык сценариев Mustache.
Например, следующий фрагмент демонстрирует, как шаблоны позволяют создавать динамические темы в отправленных письмах:
{
"actions" : {
"email_notification" : {
"email" : {
"subject" : "{{ctx.metadata.color}} alert"
}
}
}
} Встроенные шаблоны и скрипты
Чтобы определить встроенный шаблон или скрипт, просто укажите его непосредственно в значении поля. Например, следующий фрагмент настраивает тему действия email с помощью встроенного шаблона, который ссылается на значение color в метаданных контекста.
"actions" : {
"email_notification" : {
"email" : {
"subject" : "{{ctx.metadata.color}} alert"
}
}
}
} Для скрипта просто укажите встроенный скрипт в качестве значения поля script. Например:
"condition" : {
"script" : "return true"
} Вы также можете явно указать тип встроенного элемента, используя формальное определение объекта в качестве значения поля. Например:
"actions" : {
"email_notification" : {
"email" : {
"subject" : {
"source" : "{{ctx.metadata.color}} alert"
}
}
}
} Формальное определение объекта для скрипта будет следующим:
"condition" : {
"script" : {
"source": "return true"
}
} Сохраненные шаблоны и скрипты
Если вы сохраняете свои шаблоны и скрипты, вы можете ссылаться на них по идентификатору.
Чтобы сослаться на сохраненный скрипт или шаблон, используйте формальное определение объекта и укажите его идентификатор в поле id. Например, следующий фрагмент ссылается на шаблон email_notification_subject:
{
...
"actions" : {
"email_notification" : {
"email" : {
"subject" : {
"id" : "email_notification_subject",
"params" : {
"color" : "red"
}
}
}
}
}
}
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/how-watcher-works.html