执行 watch API

编辑

强制执行已存储的 watch。

请求

编辑

POST _watcher/watch/<watch_id>/_execute

POST _watcher/watch/_execute

前提条件

编辑
  • 您必须具有 manage_watcher 集群权限才能使用此 API。有关更多信息,请参见 安全权限

描述

编辑

此 API 可用于强制执行 watch,而无需依赖其触发逻辑,或出于调试目的模拟 watch 执行。

出于测试和调试目的,您还可以对 watch 的运行方式进行精细控制。您可以不执行所有操作就执行 watch,或者通过模拟它们来执行。您还可以通过忽略 watch 条件来强制执行,并控制执行后是否将 watch 记录写入 watch 历史记录。

内联 watch 执行

编辑

您可以使用 Execute API 执行尚未注册的 watch,方法是内联指定 watch 定义。这对于在将 watch 添加到 Watcher 之前测试和调试 watch 非常有用。

路径参数

编辑
<watch_id>
(可选,字符串) watch 的标识符。

查询参数

编辑
debug
(可选,布尔值) 定义 watch 是否在调试模式下运行。默认值为 false

请求体

编辑

此 API 支持以下字段

名称 必需 默认值 描述

trigger_data

此结构被解析为触发事件的数据,将在 watch 执行期间使用

ignore_condition

false

设置为 true 时,watch 执行使用 始终条件。这也可以指定为 HTTP 参数。

alternative_input

null

如果存在,则 watch 使用此对象作为有效负载,而不是执行其自身的输入。

action_modes

null

确定如何在 watch 执行期间处理 watch 操作。有关更多信息,请参见 操作执行模式

record_execution

false

设置为 true 时,表示 watch 执行结果的 watch 记录将持久保存到当前时间的 .watcher-history 索引中。此外,watch 的状态也会更新,可能会限制后续执行。这也可以指定为 HTTP 参数。

watch

null

如果存在,则使用此 watch,而不是请求中指定的 watch。此 watch 不会持久保存到索引中,并且无法设置 record_execution。

操作执行模式

编辑

操作模式定义在 watch 执行期间如何处理操作。操作可以关联五种可能的模式

名称 描述

simulate

模拟操作执行。每种操作类型都定义了自己的模拟操作模式。例如,email 操作 创建本来会发送的电子邮件,但实际上并不发送它。在此模式下,如果 watch 的当前状态指示应限制操作,则该操作可能会被限制。

force_simulate

类似于 simulate 模式,只是即使 watch 的当前状态指示应限制操作,也不会限制该操作。

execute

执行操作,就像 watch 由其自身的触发器触发一样。如果 watch 的当前状态指示应限制执行,则执行可能会被限制。

force_execute

类似于 execute 模式,只是即使 watch 的当前状态指示应限制操作,也不会限制该操作。

skip

跳过操作,不执行或模拟。有效地强制限制操作。

安全集成

编辑

在集群上启用 Elasticsearch 安全功能后,watch 将使用存储 watch 的用户的权限执行。如果您的用户被允许读取索引 a,但不能读取索引 b,则在执行 watch 时将应用完全相同的规则集。

使用执行 watch API 时,将使用调用 API 的用户的授权数据作为基础,而不是存储 watch 的用户信息。

示例

编辑

以下示例执行 my_watch watch

resp = client.watcher.execute_watch(
    id="my_watch",
)
print(resp)
const response = await client.watcher.executeWatch({
  id: "my_watch",
});
console.log(response);
POST _watcher/watch/my_watch/_execute

以下示例显示了执行 my-watch watch 的综合示例

resp = client.watcher.execute_watch(
    id="my_watch",
    trigger_data={
        "triggered_time": "now",
        "scheduled_time": "now"
    },
    alternative_input={
        "foo": "bar"
    },
    ignore_condition=True,
    action_modes={
        "my-action": "force_simulate"
    },
    record_execution=True,
)
print(resp)
const response = await client.watcher.executeWatch({
  id: "my_watch",
  trigger_data: {
    triggered_time: "now",
    scheduled_time: "now",
  },
  alternative_input: {
    foo: "bar",
  },
  ignore_condition: true,
  action_modes: {
    "my-action": "force_simulate",
  },
  record_execution: true,
});
console.log(response);
POST _watcher/watch/my_watch/_execute
{
  "trigger_data" : { 
     "triggered_time" : "now",
     "scheduled_time" : "now"
  },
  "alternative_input" : { 
    "foo" : "bar"
  },
  "ignore_condition" : true, 
  "action_modes" : {
    "my-action" : "force_simulate" 
  },
  "record_execution" : true 
}

提供了触发时间和计划时间。

忽略 watch 定义的输入,而是将提供的输入用作执行有效负载。

忽略 watch 定义的条件,并假设其计算结果为 true

强制模拟 my-action。强制模拟意味着忽略限制,并由 Watcher 模拟 watch,而不是正常执行。

watch 的执行会在 watch 历史记录中创建一个 watch 记录,并且 watch 的限制状态可能会相应更新。

这是一个输出示例

{
  "_id": "my_watch_0-2015-06-02T23:17:55.124Z", 
  "watch_record": { 
    "@timestamp": "2015-06-02T23:17:55.124Z",
    "watch_id": "my_watch",
    "node": "my_node",
    "messages": [],
    "trigger_event": {
      "type": "manual",
      "triggered_time": "2015-06-02T23:17:55.124Z",
      "manual": {
        "schedule": {
          "scheduled_time": "2015-06-02T23:17:55.124Z"
        }
      }
    },
    "state": "executed",
    "status": {
      "version": 1,
      "execution_state": "executed",
      "state": {
        "active": true,
        "timestamp": "2015-06-02T23:17:55.111Z"
      },
      "last_checked": "2015-06-02T23:17:55.124Z",
      "last_met_condition": "2015-06-02T23:17:55.124Z",
      "actions": {
        "test_index": {
          "ack": {
            "timestamp": "2015-06-02T23:17:55.124Z",
            "state": "ackable"
          },
          "last_execution": {
            "timestamp": "2015-06-02T23:17:55.124Z",
            "successful": true
          },
          "last_successful_execution": {
            "timestamp": "2015-06-02T23:17:55.124Z",
            "successful": true
          }
        }
      }
    },
    "input": {
      "simple": {
        "payload": {
          "send": "yes"
        }
      }
    },
    "condition": {
      "always": {}
    },
    "result": { 
      "execution_time": "2015-06-02T23:17:55.124Z",
      "execution_duration": 12608,
      "input": {
        "type": "simple",
        "payload": {
          "foo": "bar"
        },
        "status": "success"
      },
      "condition": {
        "type": "always",
        "met": true,
        "status": "success"
      },
      "actions": [
        {
          "id": "test_index",
          "index": {
            "response": {
              "index": "test",
              "version": 1,
              "created": true,
              "result": "created",
              "id": "AVSHKzPa9zx62AzUzFXY"
            }
          },
          "status": "success",
          "type": "index"
        }
      ]
    },
    "user": "test_admin" 
  }
}

watch 记录的 ID,如同它存储在 .watcher-history 索引中一样。

watch 记录文档,如同它存储在 .watcher-history 索引中一样。

watch 执行结果。

用于执行 watch 的用户。

您可以通过将模式名称与操作 ID 关联来为每个操作设置不同的执行模式

resp = client.watcher.execute_watch(
    id="my_watch",
    action_modes={
        "action1": "force_simulate",
        "action2": "skip"
    },
)
print(resp)
const response = await client.watcher.executeWatch({
  id: "my_watch",
  action_modes: {
    action1: "force_simulate",
    action2: "skip",
  },
});
console.log(response);
POST _watcher/watch/my_watch/_execute
{
  "action_modes" : {
    "action1" : "force_simulate",
    "action2" : "skip"
  }
}

您还可以使用 _all 作为操作 ID,将单个执行模式与 watch 中的所有操作关联

resp = client.watcher.execute_watch(
    id="my_watch",
    action_modes={
        "_all": "force_execute"
    },
)
print(resp)
const response = await client.watcher.executeWatch({
  id: "my_watch",
  action_modes: {
    _all: "force_execute",
  },
});
console.log(response);
POST _watcher/watch/my_watch/_execute
{
  "action_modes" : {
    "_all" : "force_execute"
  }
}

以下示例演示如何内联执行 watch

resp = client.watcher.execute_watch(
    watch={
        "trigger": {
            "schedule": {
                "interval": "10s"
            }
        },
        "input": {
            "search": {
                "request": {
                    "indices": [
                        "logs"
                    ],
                    "body": {
                        "query": {
                            "match": {
                                "message": "error"
                            }
                        }
                    }
                }
            }
        },
        "condition": {
            "compare": {
                "ctx.payload.hits.total": {
                    "gt": 0
                }
            }
        },
        "actions": {
            "log_error": {
                "logging": {
                    "text": "Found {{ctx.payload.hits.total}} errors in the logs"
                }
            }
        }
    },
)
print(resp)
const response = await client.watcher.executeWatch({
  watch: {
    trigger: {
      schedule: {
        interval: "10s",
      },
    },
    input: {
      search: {
        request: {
          indices: ["logs"],
          body: {
            query: {
              match: {
                message: "error",
              },
            },
          },
        },
      },
    },
    condition: {
      compare: {
        "ctx.payload.hits.total": {
          gt: 0,
        },
      },
    },
    actions: {
      log_error: {
        logging: {
          text: "Found {{ctx.payload.hits.total}} errors in the logs",
        },
      },
    },
  },
});
console.log(response);
POST _watcher/watch/_execute
{
  "watch" : {
    "trigger" : { "schedule" : { "interval" : "10s" } },
    "input" : {
      "search" : {
        "request" : {
          "indices" : [ "logs" ],
          "body" : {
            "query" : {
              "match" : { "message": "error" }
            }
          }
        }
      }
    },
    "condition" : {
      "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
    },
    "actions" : {
      "log_error" : {
        "logging" : {
          "text" : "Found {{ctx.payload.hits.total}} errors in the logs"
        }
      }
    }
  }
}

内联 watch 时,此 API 的所有其他设置仍然适用。在以下代码段中,虽然内联 watch 定义了 compare 条件,但在执行期间将忽略此条件

resp = client.watcher.execute_watch(
    ignore_condition=True,
    watch={
        "trigger": {
            "schedule": {
                "interval": "10s"
            }
        },
        "input": {
            "search": {
                "request": {
                    "indices": [
                        "logs"
                    ],
                    "body": {
                        "query": {
                            "match": {
                                "message": "error"
                            }
                        }
                    }
                }
            }
        },
        "condition": {
            "compare": {
                "ctx.payload.hits.total": {
                    "gt": 0
                }
            }
        },
        "actions": {
            "log_error": {
                "logging": {
                    "text": "Found {{ctx.payload.hits.total}} errors in the logs"
                }
            }
        }
    },
)
print(resp)
const response = await client.watcher.executeWatch({
  ignore_condition: true,
  watch: {
    trigger: {
      schedule: {
        interval: "10s",
      },
    },
    input: {
      search: {
        request: {
          indices: ["logs"],
          body: {
            query: {
              match: {
                message: "error",
              },
            },
          },
        },
      },
    },
    condition: {
      compare: {
        "ctx.payload.hits.total": {
          gt: 0,
        },
      },
    },
    actions: {
      log_error: {
        logging: {
          text: "Found {{ctx.payload.hits.total}} errors in the logs",
        },
      },
    },
  },
});
console.log(response);
POST _watcher/watch/_execute
{
  "ignore_condition" : true,
  "watch" : {
    "trigger" : { "schedule" : { "interval" : "10s" } },
    "input" : {
      "search" : {
        "request" : {
          "indices" : [ "logs" ],
          "body" : {
            "query" : {
              "match" : { "message": "error" }
            }
          }
        }
      }
    },
    "condition" : {
      "compare" : { "ctx.payload.hits.total" : { "gt" : 0 }}
    },
    "actions" : {
      "log_error" : {
        "logging" : {
          "text" : "Found {{ctx.payload.hits.total}} errors in the logs"
        }
      }
    }
  }
}