Watcher 操作

编辑

当满足监视器的条件时,将执行其操作,除非它正在被节流。一个监视器可以执行多个操作。这些操作一次执行一个,并且每个操作独立执行。执行操作时遇到的任何故障都会记录在操作结果和监视器历史记录中。

如果未为监视器定义任何操作,则不会执行任何操作。但是,仍然会将一个 watch_record 写入监视器历史记录。

操作可以访问执行上下文中的有效负载。它们可以使用它来以任何他们需要的方式支持它们的执行。例如,有效负载可以用作模板化电子邮件正文的模型。

Watcher 支持以下操作

确认和节流

编辑

在监视器执行期间,一旦满足条件,就会针对每个配置的操作决定是否应进行节流。操作节流的主要目的是防止同一监视器对同一操作执行过多。

例如,假设您有一个监视器,用于检测应用程序日志条目中的错误。该监视器每五分钟触发一次,并搜索过去一小时内的错误。在这种情况下,如果存在错误,则会有一段时间检查监视器,并且基于相同的错误多次执行其操作。结果,系统管理员收到有关同一问题的多个通知,这可能会很烦人。

为了解决这个问题,Watcher 支持基于时间的节流。您可以定义一个节流周期作为操作配置的一部分,以限制操作的执行频率。当您设置节流周期时,如果操作已经在节流周期时间范围内(now - throttling period)执行,则 Watcher 会阻止重复执行该操作。

以下代码片段显示了上述场景的监视器 - 将节流周期与 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": "[email protected]",
                "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: "[email protected]",
        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" : "[email protected]",
        "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": "[email protected]",
                "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: "[email protected]",
        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" : "[email protected]",
        "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_administratornotify_pager 操作)

如果您未在操作或监视器级别定义节流周期,则会应用全局默认节流周期。最初,此值设置为 5 秒。要更改全局默认值,请在 elasticsearch.yml 中配置 xpack.watcher.execution.default_throttle_period 设置

xpack.watcher.execution.default_throttle_period: 15m

Watcher 还支持基于确认的节流。您可以使用 确认监视器 API 来确认监视器,以防止在监视器条件保持 true 时再次执行监视器操作。这实际上告诉 Watcher“我已收到通知并且正在处理它,请不要再次通知我有关此错误的信息”。已确认的监视器操作将保持 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> 是监视器的 ID,<action_ids> 是要确认的操作 ID 的逗号分隔列表。要确认所有操作,请省略 actions 参数。

下图说明了在执行期间为监视器的每个操作做出的节流决策

action throttling

将 SSL/TLS 与 OpenJDK 结合使用

编辑

由于每个分发者都可以自由选择如何打包 OpenJDK,因此即使是完全相同的版本,OpenJDK 分发版也可能在不同的 Linux 分发版下包含不同的部分。

这可能会导致任何使用 TLS 的操作或输入出现问题,例如 jirapagerdutyslackwebhook,因为缺少 CA 证书。如果您在编写连接到 TLS 端点的监视器时遇到 TLS 错误,您应该尝试升级到您的平台可用的最新 OpenJDK 分发版,如果这没有帮助,请尝试升级到 Oracle JDK。