github.com/outbrain/consul@v1.4.5/website/source/docs/agent/watches.html.md (about) 1 --- 2 layout: "docs" 3 page_title: "Watches" 4 sidebar_current: "docs-agent-watches" 5 description: |- 6 Watches are a way of specifying a view of data (e.g. list of nodes, KV pairs, health checks) which is monitored for updates. When an update is detected, an external handler is invoked. A handler can be any executable. As an example, you could watch the status of health checks and notify an external system when a check is critical. 7 --- 8 9 # Watches 10 11 Watches are a way of specifying a view of data (e.g. list of nodes, KV pairs, health 12 checks) which is monitored for updates. When an update is detected, an external handler 13 is invoked. A handler can be any executable or HTTP endpoint. As an example, you could watch the status 14 of health checks and notify an external system when a check is critical. 15 16 Watches are implemented using blocking queries in the [HTTP API](/api/index.html). 17 Agents automatically make the proper API calls to watch for changes 18 and inform a handler when the data view has updated. 19 20 Watches can be configured as part of the [agent's configuration](/docs/agent/options.html#watches), 21 causing them to run once the agent is initialized. Reloading the agent configuration 22 allows for adding or removing watches dynamically. 23 24 Alternatively, the [watch command](/docs/commands/watch.html) enables a watch to be 25 started outside of the agent. This can be used by an operator to inspect data in Consul 26 or to easily pipe data into processes without being tied to the agent lifecycle. 27 28 In either case, the `type` of the watch must be specified. Each type of watch 29 supports different parameters, some required and some optional. These options are specified 30 in a JSON body when using agent configuration or as CLI flags for the watch command. 31 32 ## Handlers 33 34 The watch configuration specifies the view of data to be monitored. 35 Once that view is updated, the specified handler is invoked. Handlers can be either an 36 executable or an HTTP endpoint. A handler receives JSON formatted data 37 with invocation info, following a format that depends on the type of the watch. 38 Each watch type documents the format type. Because they map directly to an HTTP 39 API, handlers should expect the input to match the format of the API. A Consul 40 index is also given, corresponding to the responses from the 41 [HTTP API](/api/index.html). 42 43 ### Executable 44 45 An executable handler reads the JSON invocation info from stdin. Additionally, 46 the `CONSUL_INDEX` environment variable will be set to the Consul index 47 Anything written to stdout is logged. 48 49 Here is an example configuration, where `handler_type` is optionally set to 50 `script`: 51 52 ```javascript 53 { 54 "type": "key", 55 "key": "foo/bar/baz", 56 "handler_type": "script", 57 "args": ["/usr/bin/my-service-handler.sh", "-redis"] 58 } 59 ``` 60 61 Prior to Consul 1.0, watches used a single `handler` field to define the command to run, and 62 would always run in a shell. In Consul 1.0, the `args` array was added so that handlers can be 63 run without a shell. The `handler` field is deprecated, and you should include the shell in 64 the `args` to run under a shell, eg. `"args": ["sh", "-c", "..."]`. 65 66 ### HTTP endpoint 67 68 An HTTP handler sends an HTTP request when a watch is invoked. The JSON invocation info is sent 69 as a payload along the request. The response also contains the Consul index as a header named 70 `X-Consul-Index`. 71 72 The HTTP handler can be configured by setting `handler_type` to `http`. Additional handler options 73 are set using `http_handler_config`. The only required parameter is the `path` field which specifies 74 the URL to the HTTP endpoint. Consul uses `POST` as the default HTTP method, but this is also configurable. 75 Other optional fields are `header`, `timeout` and `tls_skip_verify`. The watch invocation data is 76 always sent as a JSON payload. 77 78 Here is an example configuration: 79 80 ```javascript 81 { 82 "type": "key", 83 "key": "foo/bar/baz", 84 "handler_type": "http", 85 "http_handler_config": { 86 "path":"https://localhost:8000/watch", 87 "method": "POST", 88 "header": {"x-foo":["bar", "baz"]}, 89 "timeout": "10s", 90 "tls_skip_verify": false 91 } 92 } 93 ``` 94 95 ## Global Parameters 96 97 In addition to the parameters supported by each option type, there 98 are a few global parameters that all watches support: 99 100 * `datacenter` - Can be provided to override the agent's default datacenter. 101 * `token` - Can be provided to override the agent's default ACL token. 102 * `args` - The handler subprocess and arguments to invoke when the data view updates. 103 * `handler` - The handler shell command to invoke when the data view updates. 104 105 ## Watch Types 106 107 The following types are supported. Detailed documentation on each is below: 108 109 * [`key`](#key) - Watch a specific KV pair 110 * [`keyprefix`](#keyprefix) - Watch a prefix in the KV store 111 * [`services`](#services) - Watch the list of available services 112 * [`nodes`](#nodes) - Watch the list of nodes 113 * [`service`](#service)- Watch the instances of a service 114 * [`checks`](#checks) - Watch the value of health checks 115 * [`event`](#event) - Watch for custom user events 116 117 118 ### <a name="key"></a>Type: key 119 120 The "key" watch type is used to watch a specific key in the KV store. 121 It requires that the "key" parameter be specified. 122 123 This maps to the `/v1/kv/` API internally. 124 125 Here is an example configuration: 126 127 ```javascript 128 { 129 "type": "key", 130 "key": "foo/bar/baz", 131 "args": ["/usr/bin/my-service-handler.sh", "-redis"] 132 } 133 ``` 134 135 Or, using the watch command: 136 137 $ consul watch -type=key -key=foo/bar/baz /usr/bin/my-key-handler.sh 138 139 An example of the output of this command: 140 141 ```javascript 142 { 143 "Key": "foo/bar/baz", 144 "CreateIndex": 1793, 145 "ModifyIndex": 1793, 146 "LockIndex": 0, 147 "Flags": 0, 148 "Value": "aGV5", 149 "Session": "" 150 } 151 ``` 152 153 ### <a name="keyprefix"></a>Type: keyprefix 154 155 The "keyprefix" watch type is used to watch a prefix of keys in the KV store. 156 It requires that the "prefix" parameter be specified. This watch 157 returns *all* keys matching the prefix whenever *any* key matching the prefix 158 changes. 159 160 This maps to the `/v1/kv/` API internally. 161 162 Here is an example configuration: 163 164 ```javascript 165 { 166 "type": "keyprefix", 167 "prefix": "foo/", 168 "args": ["/usr/bin/my-service-handler.sh", "-redis"] 169 } 170 ``` 171 172 Or, using the watch command: 173 174 $ consul watch -type=keyprefix -prefix=foo/ /usr/bin/my-prefix-handler.sh 175 176 An example of the output of this command: 177 178 ```javascript 179 [ 180 { 181 "Key": "foo/bar", 182 "CreateIndex": 1796, 183 "ModifyIndex": 1796, 184 "LockIndex": 0, 185 "Flags": 0, 186 "Value": "TU9BUg==", 187 "Session": "" 188 }, 189 { 190 "Key": "foo/baz", 191 "CreateIndex": 1795, 192 "ModifyIndex": 1795, 193 "LockIndex": 0, 194 "Flags": 0, 195 "Value": "YXNkZg==", 196 "Session": "" 197 }, 198 { 199 "Key": "foo/test", 200 "CreateIndex": 1793, 201 "ModifyIndex": 1793, 202 "LockIndex": 0, 203 "Flags": 0, 204 "Value": "aGV5", 205 "Session": "" 206 } 207 ] 208 ``` 209 210 ### <a name="services"></a>Type: services 211 212 The "services" watch type is used to watch the list of available 213 services. It has no parameters. 214 215 This maps to the `/v1/catalog/services` API internally. 216 217 An example of the output of this command: 218 219 ```javascript 220 { 221 "consul": [], 222 "redis": [], 223 "web": [] 224 } 225 ``` 226 227 ### <a name="nodes"></a>Type: nodes 228 229 The "nodes" watch type is used to watch the list of available 230 nodes. It has no parameters. 231 232 This maps to the `/v1/catalog/nodes` API internally. 233 234 An example of the output of this command: 235 236 ```javascript 237 [ 238 { 239 "Node": "nyc1-consul-1", 240 "Address": "192.241.159.115" 241 }, 242 { 243 "Node": "nyc1-consul-2", 244 "Address": "192.241.158.205" 245 }, 246 { 247 "Node": "nyc1-consul-3", 248 "Address": "198.199.77.133" 249 }, 250 { 251 "Node": "nyc1-worker-1", 252 "Address": "162.243.162.228" 253 }, 254 { 255 "Node": "nyc1-worker-2", 256 "Address": "162.243.162.226" 257 }, 258 { 259 "Node": "nyc1-worker-3", 260 "Address": "162.243.162.229" 261 } 262 ] 263 ``` 264 265 ### <a name="service"></a>Type: service 266 267 The "service" watch type is used to monitor the providers 268 of a single service. It requires the "service" parameter 269 and optionally takes the parameters "tag" and "passingonly". 270 The "tag" parameter will filter by tag, and "passingonly" is 271 a boolean that will filter to only the instances passing all 272 health checks. 273 274 This maps to the `/v1/health/service` API internally. 275 276 Here is an example configuration: 277 278 ```javascript 279 { 280 "type": "service", 281 "service": "redis", 282 "args": ["/usr/bin/my-service-handler.sh", "-redis"] 283 } 284 ``` 285 286 Or, using the watch command: 287 288 $ consul watch -type=service -service=redis /usr/bin/my-service-handler.sh 289 290 An example of the output of this command: 291 292 ```javascript 293 [ 294 { 295 "Node": { 296 "Node": "foobar", 297 "Address": "10.1.10.12" 298 }, 299 "Service": { 300 "ID": "redis", 301 "Service": "redis", 302 "Tags": null, 303 "Port": 8000 304 }, 305 "Checks": [ 306 { 307 "Node": "foobar", 308 "CheckID": "service:redis", 309 "Name": "Service 'redis' check", 310 "Status": "passing", 311 "Notes": "", 312 "Output": "", 313 "ServiceID": "redis", 314 "ServiceName": "redis" 315 }, 316 { 317 "Node": "foobar", 318 "CheckID": "serfHealth", 319 "Name": "Serf Health Status", 320 "Status": "passing", 321 "Notes": "", 322 "Output": "", 323 "ServiceID": "", 324 "ServiceName": "" 325 } 326 ] 327 } 328 ] 329 ``` 330 331 ### <a name="checks"></a>Type: checks 332 333 The "checks" watch type is used to monitor the checks of a given 334 service or those in a specific state. It optionally takes the "service" 335 parameter to filter to a specific service or the "state" parameter to 336 filter to a specific state. By default, it will watch all checks. 337 338 This maps to the `/v1/health/state/` API if monitoring by state 339 or `/v1/health/checks/` if monitoring by service. 340 341 An example of the output of this command: 342 343 ```javascript 344 [ 345 { 346 "Node": "foobar", 347 "CheckID": "service:redis", 348 "Name": "Service 'redis' check", 349 "Status": "passing", 350 "Notes": "", 351 "Output": "", 352 "ServiceID": "redis", 353 "ServiceName": "redis" 354 } 355 ] 356 ``` 357 358 ### <a name="event"></a>Type: event 359 360 The "event" watch type is used to monitor for custom user 361 events. These are fired using the [consul event](/docs/commands/event.html) command. 362 It takes only a single optional "name" parameter which restricts 363 the watch to only events with the given name. 364 365 This maps to the `v1/event/list` API internally. 366 367 Here is an example configuration: 368 369 ```javascript 370 { 371 "type": "event", 372 "name": "web-deploy", 373 "args": ["/usr/bin/my-service-handler.sh", "-web-deploy"] 374 } 375 ``` 376 377 Or, using the watch command: 378 379 $ consul watch -type=event -name=web-deploy /usr/bin/my-deploy-handler.sh -web-deploy 380 381 An example of the output of this command: 382 383 ```javascript 384 [ 385 { 386 "ID": "f07f3fcc-4b7d-3a7c-6d1e-cf414039fcee", 387 "Name": "web-deploy", 388 "Payload": "MTYwOTAzMA==", 389 "NodeFilter": "", 390 "ServiceFilter": "", 391 "TagFilter": "", 392 "Version": 1, 393 "LTime": 18 394 }, 395 ... 396 ] 397 ``` 398 399 To fire a new `web-deploy` event the following could be used: 400 401 $ consul event -name=web-deploy 1609030