2017-06-27 20:16:51 -04:00
|
|
|
[role="xpack"]
|
2017-03-29 12:07:55 -04:00
|
|
|
[[watcher-api-ack-watch]]
|
|
|
|
=== Ack Watch API
|
|
|
|
|
2017-09-14 16:01:47 -04:00
|
|
|
{xpack-ref}/actions.html#actions-ack-throttle[Acknowledging a watch] enables you
|
|
|
|
to manually throttle execution of the watch's actions. An action's
|
|
|
|
_acknowledgement state_ is stored in the `status.actions.<id>.ack.state`
|
|
|
|
structure.
|
|
|
|
|
Watcher: Prevent watch acknowledgement while watch is executing (elastic/x-pack-elasticsearch#4224)
When a watch is acknowledged, while it is also being executed, the
acknowledgment information can get lost. The reason for this is the
fact, that the execution writes the watch status inside of the watch
regardless, if other writes happened inbetween to make sure the
execution state is caught.
This commit checks the current executions in the execution service and
aborts the API call, if the specified watch ID can be found in those.
Note, this does not prevent this issue fully, as a watch could be
triggered, while the acknowledgement update is running, but it does
reduce the surface area of this problem. In order to properly solve
this, indexing the watch status as part of a watch would need to be
changed.
relates elastic/x-pack-elasticsearch#4003
Original commit: elastic/x-pack-elasticsearch@d7e218b2acbd18d7d894bb04ae0e550e6a093488
2018-04-04 04:15:20 -04:00
|
|
|
IMPORTANT: If the specified watch is currently being executed, this API will return
|
|
|
|
an error. The reason for this is to prevent overwriting of the watch status from a watch
|
|
|
|
execution.
|
|
|
|
|
2017-09-14 16:01:47 -04:00
|
|
|
[float]
|
|
|
|
==== Request
|
|
|
|
|
|
|
|
`PUT _xpack/watcher/watch/<watch_id>/_ack` +
|
|
|
|
|
|
|
|
`PUT _xpack/watcher/watch/<watch_id>/_ack/<action_id>`
|
|
|
|
|
|
|
|
[float]
|
|
|
|
==== Path Parameters
|
|
|
|
|
|
|
|
`action_id`::
|
|
|
|
(list) A comma-separated list of the action IDs to acknowledge. If you omit
|
|
|
|
this parameter, all of the actions of the watch are acknowledged.
|
|
|
|
|
|
|
|
`watch_id` (required)::
|
|
|
|
(string) Identifier for the watch.
|
|
|
|
|
|
|
|
[float]
|
|
|
|
==== Authorization
|
|
|
|
|
|
|
|
You must have `manage_watcher` cluster privileges to use this API. For more
|
|
|
|
information, see {xpack-ref}/security-privileges.html[Security Privileges].
|
|
|
|
|
|
|
|
|
|
|
|
[float]
|
|
|
|
==== Examples
|
2017-03-29 12:07:55 -04:00
|
|
|
|
|
|
|
To demonstrate let's create a new watch:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
PUT _xpack/watcher/watch/my_watch
|
|
|
|
{
|
|
|
|
"trigger": {
|
|
|
|
"schedule": {
|
|
|
|
"hourly": {
|
|
|
|
"minute": [ 0, 5 ]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"input": {
|
|
|
|
"simple": {
|
|
|
|
"payload": {
|
|
|
|
"send": "yes"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"condition": {
|
|
|
|
"always": {}
|
|
|
|
},
|
|
|
|
"actions": {
|
|
|
|
"test_index": {
|
|
|
|
"throttle_period": "15m",
|
|
|
|
"index": {
|
|
|
|
"index": "test",
|
|
|
|
"doc_type": "test2"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
// TESTSETUP
|
|
|
|
|
|
|
|
The current status of a watch and the state of its actions is returned with the
|
|
|
|
watch definition when you call the <<watcher-api-get-watch, Get Watch API>>:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
GET _xpack/watcher/watch/my_watch
|
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
|
|
|
|
The action state of a newly-created watch is `awaits_successful_execution`:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"found": true,
|
2018-02-20 04:09:27 -05:00
|
|
|
"_version": 1,
|
2017-03-29 12:07:55 -04:00
|
|
|
"_id": "my_watch",
|
2017-05-04 04:08:34 -04:00
|
|
|
"status": {
|
2017-03-29 12:07:55 -04:00
|
|
|
"version": 1,
|
|
|
|
"actions": {
|
|
|
|
"test_index": {
|
|
|
|
"ack": {
|
|
|
|
"timestamp": "2015-05-26T18:04:27.723Z",
|
|
|
|
"state": "awaits_successful_execution"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"state": ...
|
|
|
|
},
|
|
|
|
"watch": ...
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2017-05-04 04:08:34 -04:00
|
|
|
// TESTRESPONSE[s/"state": \.\.\./"state": "$body.status.state"/]
|
2017-03-29 12:07:55 -04:00
|
|
|
// TESTRESPONSE[s/"watch": \.\.\./"watch": "$body.watch"/]
|
2017-05-04 04:08:34 -04:00
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-26T18:04:27.723Z"/"timestamp": "$body.status.actions.test_index.ack.timestamp"/]
|
2017-03-29 12:07:55 -04:00
|
|
|
|
|
|
|
When the watch executes and the condition matches, the value of the `ack.state`
|
|
|
|
changes to `ackable`. Let's force execution of the watch and fetch it again to
|
|
|
|
check the status:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
POST _xpack/watcher/watch/my_watch/_execute
|
2017-06-13 03:57:10 -04:00
|
|
|
{
|
|
|
|
"record_execution" : true
|
|
|
|
}
|
|
|
|
|
2017-03-29 12:07:55 -04:00
|
|
|
GET _xpack/watcher/watch/my_watch
|
|
|
|
--------------------------------------------------
|
2017-06-13 03:57:10 -04:00
|
|
|
// CONSOLE
|
2017-03-29 12:07:55 -04:00
|
|
|
// TEST[continued]
|
|
|
|
|
|
|
|
and the action is now in `ackable` state:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"found": true,
|
|
|
|
"_id": "my_watch",
|
2018-02-20 04:09:27 -05:00
|
|
|
"_version": 2,
|
2017-05-04 04:08:34 -04:00
|
|
|
"status": {
|
2017-06-13 03:57:10 -04:00
|
|
|
"version": 2,
|
2017-03-29 12:07:55 -04:00
|
|
|
"actions": {
|
|
|
|
"test_index": {
|
|
|
|
"ack": {
|
|
|
|
"timestamp": "2015-05-26T18:04:27.723Z",
|
|
|
|
"state": "ackable"
|
2017-06-13 03:57:10 -04:00
|
|
|
},
|
|
|
|
"last_execution" : {
|
|
|
|
"timestamp": "2015-05-25T18:04:27.723Z",
|
|
|
|
"successful": true
|
|
|
|
},
|
|
|
|
"last_successful_execution" : {
|
|
|
|
"timestamp": "2015-05-25T18:04:27.723Z",
|
|
|
|
"successful": true
|
2017-03-29 12:07:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2017-06-13 03:57:10 -04:00
|
|
|
"state": ...,
|
2017-10-10 03:07:33 -04:00
|
|
|
"execution_state": "executed",
|
2017-06-13 03:57:10 -04:00
|
|
|
"last_checked": ...,
|
|
|
|
"last_met_condition": ...
|
2017-03-29 12:07:55 -04:00
|
|
|
},
|
|
|
|
"watch": ...
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2017-05-04 04:08:34 -04:00
|
|
|
// TESTRESPONSE[s/"state": \.\.\./"state": "$body.status.state"/]
|
2017-03-29 12:07:55 -04:00
|
|
|
// TESTRESPONSE[s/"watch": \.\.\./"watch": "$body.watch"/]
|
2017-06-13 03:57:10 -04:00
|
|
|
// TESTRESPONSE[s/"last_checked": \.\.\./"last_checked": "$body.status.last_checked"/]
|
|
|
|
// TESTRESPONSE[s/"last_met_condition": \.\.\./"last_met_condition": "$body.status.last_met_condition"/]
|
2017-05-04 04:08:34 -04:00
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-26T18:04:27.723Z"/"timestamp": "$body.status.actions.test_index.ack.timestamp"/]
|
2017-06-13 03:57:10 -04:00
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-25T18:04:27.723Z"/"timestamp": "$body.status.actions.test_index.last_execution.timestamp"/]
|
2017-03-29 12:07:55 -04:00
|
|
|
|
|
|
|
Now we can acknowledge it:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
PUT _xpack/watcher/watch/my_watch/_ack/test_index
|
|
|
|
GET _xpack/watcher/watch/my_watch
|
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
2017-06-13 03:57:10 -04:00
|
|
|
// TEST[continued]
|
2017-03-29 12:07:55 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
|
|
|
"found": true,
|
|
|
|
"_id": "my_watch",
|
2018-02-20 04:09:27 -05:00
|
|
|
"_version": 3,
|
2017-05-04 04:08:34 -04:00
|
|
|
"status": {
|
2017-06-13 03:57:10 -04:00
|
|
|
"version": 3,
|
2017-03-29 12:07:55 -04:00
|
|
|
"actions": {
|
|
|
|
"test_index": {
|
|
|
|
"ack": {
|
|
|
|
"timestamp": "2015-05-26T18:04:27.723Z",
|
2017-06-13 03:57:10 -04:00
|
|
|
"state": "acked"
|
|
|
|
},
|
|
|
|
"last_execution" : {
|
|
|
|
"timestamp": "2015-05-25T18:04:27.723Z",
|
|
|
|
"successful": true
|
|
|
|
},
|
|
|
|
"last_successful_execution" : {
|
|
|
|
"timestamp": "2015-05-25T18:04:27.723Z",
|
|
|
|
"successful": true
|
2017-03-29 12:07:55 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2017-06-13 03:57:10 -04:00
|
|
|
"state": ...,
|
2017-10-10 03:07:33 -04:00
|
|
|
"execution_state": "executed",
|
2017-06-13 03:57:10 -04:00
|
|
|
"last_checked": ...,
|
|
|
|
"last_met_condition": ...
|
2017-03-29 12:07:55 -04:00
|
|
|
},
|
|
|
|
"watch": ...
|
|
|
|
}
|
|
|
|
--------------------------------------------------
|
2017-05-04 04:08:34 -04:00
|
|
|
// TESTRESPONSE[s/"state": \.\.\./"state": "$body.status.state"/]
|
2017-03-29 12:07:55 -04:00
|
|
|
// TESTRESPONSE[s/"watch": \.\.\./"watch": "$body.watch"/]
|
2017-06-13 03:57:10 -04:00
|
|
|
// TESTRESPONSE[s/"last_checked": \.\.\./"last_checked": "$body.status.last_checked"/]
|
|
|
|
// TESTRESPONSE[s/"last_met_condition": \.\.\./"last_met_condition": "$body.status.last_met_condition"/]
|
2017-05-04 04:08:34 -04:00
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-26T18:04:27.723Z"/"timestamp": "$body.status.actions.test_index.ack.timestamp"/]
|
2017-06-13 03:57:10 -04:00
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-25T18:04:27.723Z"/"timestamp": "$body.status.actions.test_index.last_execution.timestamp"/]
|
2017-03-29 12:07:55 -04:00
|
|
|
|
|
|
|
Acknowledging an action throttles further executions of that action until its
|
|
|
|
`ack.state` is reset to `awaits_successful_execution`. This happens when the
|
|
|
|
condition of the watch is not met (the condition evaluates to `false`).
|
|
|
|
|
|
|
|
You can acknowledge multiple actions by assigning the `actions` parameter a
|
|
|
|
comma-separated list of action ids:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
POST _xpack/watcher/watch/my_watch/_ack/action1,action2
|
|
|
|
--------------------------------------------------
|
|
|
|
// CONSOLE
|
|
|
|
|
|
|
|
To acknowledge all of the actions of a watch, simply omit the `actions`
|
|
|
|
parameter:
|
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
POST _xpack/watcher/watch/my_watch/_ack
|
|
|
|
--------------------------------------------------
|
2017-06-13 03:57:10 -04:00
|
|
|
// TEST[s/^/POST _xpack\/watcher\/watch\/my_watch\/_execute\n{ "record_execution" : true }\n/]
|
2017-03-29 12:07:55 -04:00
|
|
|
// CONSOLE
|
|
|
|
|
|
|
|
|
2017-06-13 03:57:10 -04:00
|
|
|
The response looks like a get watch response, but only contains the status:
|
2017-03-29 12:07:55 -04:00
|
|
|
|
|
|
|
[source,js]
|
|
|
|
--------------------------------------------------
|
|
|
|
{
|
2017-06-13 03:57:10 -04:00
|
|
|
"status": {
|
|
|
|
"state": {
|
|
|
|
"active": true,
|
|
|
|
"timestamp": "2015-05-26T18:04:27.723Z"
|
|
|
|
},
|
|
|
|
"last_checked": "2015-05-26T18:04:27.753Z",
|
|
|
|
"last_met_condition": "2015-05-26T18:04:27.763Z",
|
|
|
|
"actions": {
|
|
|
|
"test_index": {
|
|
|
|
"ack" : {
|
|
|
|
"timestamp": "2015-05-26T18:04:27.713Z",
|
|
|
|
"state": "acked"
|
|
|
|
},
|
|
|
|
"last_execution" : {
|
|
|
|
"timestamp": "2015-05-25T18:04:27.733Z",
|
|
|
|
"successful": true
|
|
|
|
},
|
|
|
|
"last_successful_execution" : {
|
|
|
|
"timestamp": "2015-05-25T18:04:27.773Z",
|
|
|
|
"successful": true
|
|
|
|
}
|
2017-03-29 12:07:55 -04:00
|
|
|
}
|
2017-06-13 03:57:10 -04:00
|
|
|
},
|
2017-10-10 03:07:33 -04:00
|
|
|
"execution_state": "executed",
|
2017-06-13 03:57:10 -04:00
|
|
|
"version": 2
|
|
|
|
}
|
2017-03-29 12:07:55 -04:00
|
|
|
}
|
2017-06-13 03:57:10 -04:00
|
|
|
|
2017-03-29 12:07:55 -04:00
|
|
|
--------------------------------------------------
|
2017-06-13 03:57:10 -04:00
|
|
|
// TESTRESPONSE[s/"last_checked": "2015-05-26T18:04:27.753Z"/"last_checked": "$body.status.last_checked"/]
|
|
|
|
// TESTRESPONSE[s/"last_met_condition": "2015-05-26T18:04:27.763Z"/"last_met_condition": "$body.status.last_met_condition"/]
|
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-26T18:04:27.723Z"/"timestamp": "$body.status.state.timestamp"/]
|
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-26T18:04:27.713Z"/"timestamp": "$body.status.actions.test_index.ack.timestamp"/]
|
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-25T18:04:27.733Z"/"timestamp": "$body.status.actions.test_index.last_execution.timestamp"/]
|
|
|
|
// TESTRESPONSE[s/"timestamp": "2015-05-25T18:04:27.773Z"/"timestamp": "$body.status.actions.test_index.last_successful_execution.timestamp"/]
|