执行 watch API
编辑执行 watch API
编辑强制执行已存储的 watch。
描述
编辑此 API 可用于强制执行 watch,而无需依赖其触发逻辑,或出于调试目的模拟 watch 执行。
出于测试和调试目的,您还可以对 watch 的运行方式进行精细控制。您可以不执行所有操作就执行 watch,或者通过模拟它们来执行。您还可以通过忽略 watch 条件来强制执行,并控制执行后是否将 watch 记录写入 watch 历史记录。
内联 watch 执行
编辑您可以使用 Execute API 执行尚未注册的 watch,方法是内联指定 watch 定义。这对于在将 watch 添加到 Watcher 之前测试和调试 watch 非常有用。
路径参数
编辑-
<watch_id>
- (可选,字符串) watch 的标识符。
查询参数
编辑-
debug
- (可选,布尔值) 定义 watch 是否在调试模式下运行。默认值为
false
。
请求体
编辑此 API 支持以下字段
名称 | 必需 | 默认值 | 描述 |
---|---|---|---|
|
否 |
此结构被解析为触发事件的数据,将在 watch 执行期间使用 |
|
|
否 |
false |
设置为 |
|
否 |
null |
如果存在,则 watch 使用此对象作为有效负载,而不是执行其自身的输入。 |
|
否 |
null |
确定如何在 watch 执行期间处理 watch 操作。有关更多信息,请参见 操作执行模式。 |
|
否 |
false |
设置为 |
|
否 |
null |
如果存在,则使用此 watch,而不是请求中指定的 watch。此 watch 不会持久保存到索引中,并且无法设置 record_execution。 |
操作执行模式
编辑操作模式定义在 watch 执行期间如何处理操作。操作可以关联五种可能的模式
名称 | 描述 |
---|---|
|
模拟操作执行。每种操作类型都定义了自己的模拟操作模式。例如, |
|
类似于 |
|
执行操作,就像 watch 由其自身的触发器触发一样。如果 watch 的当前状态指示应限制执行,则执行可能会被限制。 |
|
类似于 |
|
跳过操作,不执行或模拟。有效地强制限制操作。 |
安全集成
编辑在集群上启用 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 定义的条件,并假设其计算结果为 |
|
强制模拟 |
|
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,如同它存储在 |
|
watch 记录文档,如同它存储在 |
|
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" } } } } }