Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Руководство [8.17] ›Watcher

Действия Watcher

Когда условие наблюдения выполняется, его действия выполняются, если оно не ограничивается по скорости. Наблюдение может выполнять несколько действий. Действия выполняются по одному за раз, и каждое действие выполняется независимо. Любые ошибки, возникшие во время выполнения действия, записываются в результат действия и в истории наблюдения.

Если для наблюдения не определены действия, никакие действия не выполняются. Однако watch_record всё равно записывается в историю наблюдения.

Действия имеют доступ к полезной нагрузке в контексте выполнения. Они могут использовать её для поддержки своего выполнения любым необходимым образом. Например, полезная нагрузка может служить моделью для тела электронного письма с шаблоном.

Watcher поддерживает следующие действия:

  • email
  • webhook
  • index
  • logging
  • slack
  • pagerduty
  • jira

Подтверждение и ограничение скорости

Во время выполнения наблюдения, после выполнения условия, принимается решение для каждого настроенного действия, следует ли ограничить его скорость. Основная цель ограничения скорости действия — предотвратить слишком много выполнений одного и того же действия для одного и того же наблюдения.

Например, предположим, что у вас есть наблюдение, которое обнаруживает ошибки в записях журнала приложения. Наблюдение запускается каждые пять минут и ищет ошибки за последний час. В этом случае, если ошибки есть, в течение некоторого времени наблюдение проверяется, и его действия выполняются несколько раз, основанные на тех же ошибках. В результате администратор системы получает несколько уведомлений об одной и той же проблеме, что может быть раздражающим.

Для решения этой проблемы Watcher поддерживает ограничение скорости по времени. Вы можете определить период ограничения скорости как часть конфигурации действия, чтобы ограничить частоту выполнения действия. Когда вы устанавливаете период ограничения скорости, Watcher предотвращает повторное выполнение действия, если оно уже было выполнено в течение периода ограничения скорости (now - throttling period).

Следующий фрагмент кода демонстрирует наблюдение для описанного выше сценария — ассоциацию периода ограничения скорости с действием email_administrator:

resp = client.watcher.put_watch(
    id="error_logs_alert",
    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
            }
        }
    },
    actions={
        "email_administrator": {
            "throttle_period": "15m",
            "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"
            }
        }
    },
)
print(resp)
const response = await client.watcher.putWatch({
  id: "error_logs_alert",
  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,
      },
    },
  },
  actions: {
    email_administrator: {
      throttle_period: "15m",
      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",
      },
    },
  },
});
console.log(response);
PUT _watcher/watch/error_logs_alert
{
  "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 }}
  },
  "actions" : {
    "email_administrator" : {
      "throttle_period": "15m", 
      "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"
      }
    }
  }
}

Между последующими выполнениями действия email_administrator будет по крайней мере 15 минут.

См. действие электронной почты для получения дополнительной информации.

Вы также можете определить период ограничения скорости на уровне наблюдения. Период ограничения скорости на уровне наблюдения служит значением по умолчанию для всех действий, определённых в наблюдении:

resp = client.watcher.put_watch(
    id="log_event_watch",
    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
            }
        }
    },
    throttle_period="15m",
    actions={
        "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"
            }
        },
        "notify_pager": {
            "webhook": {
                "method": "POST",
                "host": "pager.service.domain",
                "port": 1234,
                "path": "/{{watch_id}}",
                "body": "Encountered {{ctx.payload.hits.total}} errors"
            }
        }
    },
)
print(resp)
const response = await client.watcher.putWatch({
  id: "log_event_watch",
  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,
      },
    },
  },
  throttle_period: "15m",
  actions: {
    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",
      },
    },
    notify_pager: {
      webhook: {
        method: "POST",
        host: "pager.service.domain",
        port: 1234,
        path: "/{{watch_id}}",
        body: "Encountered {{ctx.payload.hits.total}} errors",
      },
    },
  },
});
console.log(response);
PUT _watcher/watch/log_event_watch
{
  "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 }}
  },
  "throttle_period" : "15m", 
  "actions" : {
    "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"
      }
    },
    "notify_pager" : {
      "webhook" : {
        "method" : "POST",
        "host" : "pager.service.domain",
        "port" : 1234,
        "path" : "/{{watch_id}}",
        "body" : "Encountered {{ctx.payload.hits.total}} errors"
      }
    }
  }
}

Между последующими выполнениями действий будет по крайней мере 15 минут (применяется к действиям email_administrator и notify_pager)

Если вы не определите период ограничения скорости на уровне действия или наблюдения, применяется глобальное значение по умолчанию. Изначально оно установлено в 5 секунд. Чтобы изменить глобальное значение по умолчанию, настройте параметр xpack.watcher.execution.default_throttle_period в elasticsearch.yml:

xpack.watcher.execution.default_throttle_period: 15m

Watcher также поддерживает ограничение скорости на основе подтверждения. Вы можете подтвердить наблюдение с помощью API подтверждения наблюдения, чтобы предотвратить повторное выполнение действий наблюдения, пока условие наблюдения остается true. Это по сути означает "Я получил уведомление и обрабатываю его, пожалуйста, не уведомляйте меня об этой ошибке снова". Подтверждённое действие наблюдения остаётся в состоянии acked, пока условие наблюдения не примет значение false. В этом случае состояние действия меняется на awaits_successful_execution.

Для подтверждения действия используйте API подтверждения наблюдения:

resp = client.watcher.ack_watch(
    watch_id="<id>",
    action_id="<action_ids>",
)
print(resp)
const response = await client.watcher.ackWatch({
  watch_id: "<id>",
  action_id: "<action_ids>",
});
console.log(response);
POST _watcher/watch/<id>/_ack/<action_ids>

Где <id> — идентификатор наблюдения, а <action_ids> — список идентификаторов действий, которые вы хотите подтвердить, разделённых запятыми. Чтобы подтвердить все действия, опустите параметр actions.

На следующей диаграмме показано принятие решений об ограничении скорости для каждого действия наблюдения во время его выполнения:

action throttling

Использование SSL/TLS с OpenJDK

Поскольку каждый поставщик может выбрать, как упаковать OpenJDK, может случиться, что даже при одинаковой версии, распределение OpenJDK содержит разные части под разными дистрибутивами Linux.

Это может привести к проблемам с любым действием или вводом, использующим TLS, такими как jira, pagerduty, slack или webhook, из-за отсутствия сертификатов CA. Если вы столкнулись с ошибками TLS при написании наблюдений, которые подключаются к конечным точкам TLS, попробуйте обновить до последнего доступного дистрибутива OpenJDK для вашей платформы, и если это не поможет, попробуйте обновить до Oracle JDK.

© 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/8.17/actions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API