forked from elastic/built-docs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathactions-slack.html
486 lines (462 loc) · 22.5 KB
/
actions-slack.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
<!DOCTYPE html>
<html lang="en-us">
<head>
<meta charset="UTF-8">
<title>Watcher Slack Action | Elasticsearch Guide [8.10] | Elastic</title>
<meta class="elastic" name="content" content="Watcher Slack Action | Elasticsearch Guide [8.10]">
<link rel="home" href="index.html" title="Elasticsearch Guide [8.10]"/>
<link rel="up" href="actions.html" title="Watcher actions"/>
<link rel="prev" href="actions-logging.html" title="Watcher logging Action"/>
<link rel="next" href="actions-pagerduty.html" title="Watcher PagerDuty action"/>
<meta class="elastic" name="product_version" content="8.10"/>
<meta class="elastic" name="product_name" content="Elasticsearch"/>
<meta class="elastic" name="website_area" content="documentation"/>
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/8.10"/>
<meta name="DC.subject" content="Elasticsearch"/>
<meta name="DC.identifier" content="8.10"/>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://cdn.optimizely.com/js/18132920325.js"></script>
<link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
<link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
<link rel="manifest" href="/manifest.json">
<meta name="apple-mobile-web-app-title" content="Elastic">
<meta name="application-name" content="Elastic">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/mstile-144x144.png">
<meta name="theme-color" content="#ffffff">
<meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd" />
<meta name="yandex-verification" content="d8a47e95d0972434" />
<meta name="localized" content="true" />
<meta name="st:robots" content="follow,index" />
<meta property="og:image" content="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt280217a63b82a734/6202d3378b1f312528798412/elastic-logo.svg" />
<meta property="og:image:width" content="500" />
<meta property="og:image:height" content="172" />
<link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
<link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
<link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
<!-- Give IE8 a fighting chance -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<link rel="stylesheet" type="text/css" href="/guide/static/styles.css" />
</head>
<!--© 2015-2022 Elasticsearch B.V. -->
<!-- All Elastic documentation is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. -->
<!-- http://creativecommons.org/licenses/by-nc-nd/4.0/ -->
<body>
<!-- Google Tag Manager -->
<script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
<!-- End Google Tag Manager -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-12395217-16');
</script>
<!-- Google Tag Manager for GA4 -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-KNJMG2M');</script>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KNJMG2M" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager for GA4-->
<div id='elastic-nav' style="display:none;"></div>
<script src='https://www.elastic.co/elastic-nav.js'></script>
<div class="main-container">
<section id="content" >
<div class="content-wrapper">
<section id="guide" lang="en">
<div class="container-fluid">
<div class="row pb-3">
<div class="col-12 order-2 col-md-4 order-md-1 col-lg-3 h-almost-full-md sticky-top-md" id="left_col">
<!-- The TOC is appended here -->
</div>
<div class="col-12 order-1 col-md-8 order-md-2 col-lg-7 order-lg-2 guide-section" id="middle_col">
<!-- start body -->
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="/guide/">Elastic Docs</a></span>
<span class="chevron-right">›</span><span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [8.10]</a></span>
<span class="chevron-right">›</span><span class="breadcrumb-link"><a href="xpack-alerting.html">Watcher</a></span>
<span class="chevron-right">›</span><span class="breadcrumb-link"><a href="actions.html">Watcher actions</a></span>
</div>
<div class="navheader">
<span class="prev">
<a href="actions-logging.html">« Watcher logging Action</a>
</span>
<span class="next">
<a href="actions-pagerduty.html">Watcher PagerDuty action »</a>
</span>
</div>
<div class="section xpack">
<div class="titlepage"><div><div>
<h2 class="title"><a id="actions-slack"></a>Watcher Slack Action<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="https://github.com/elastic/elasticsearch/edit/8.10/docs/reference/watcher/actions/slack.asciidoc">edit</a></h2>
</div></div></div>
<p>Use the <code class="literal">slack</code> action to send messages to a <a href="https://slack.com/" class="ulink" target="_top">Slack</a>
team’s channels or users. To send Slack messages, you need to
<a class="xref" href="actions-slack.html#configuring-slack" title="Configuring Slack Accounts">configure at least one Slack account</a> in
<code class="literal">elasticsearch.yml</code>.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title"><a id="configuring-slack-actions"></a>Configuring Slack actions<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="https://github.com/elastic/elasticsearch/edit/8.10/docs/reference/watcher/actions/slack.asciidoc">edit</a></h3>
</div></div></div>
<p>You configure Slack actions in the <code class="literal">actions</code> array. Action-specific attributes
are specified using the <code class="literal">slack</code> keyword.</p>
<p>The following snippet shows a simple slack action definition:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"actions" : {
"notify-slack" : {
"transform" : { ... },
"throttle_period" : "5m",
"slack" : {
"message" : {
"to" : [ "#admins", "@chief-admin" ], <a id="CO628-1"></a><i class="conum" data-value="1"></i>
"text" : "Encountered {{ctx.payload.hits.total}} errors in the last 5 minutes (facepalm)" <a id="CO628-2"></a><i class="conum" data-value="2"></i>
}
}
}
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO628-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The channels and users you want to send the message to.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO628-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The content of the message.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title"><a id="formatting-slack-messages"></a>Using attachments to format Slack messages<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="https://github.com/elastic/elasticsearch/edit/8.10/docs/reference/watcher/actions/slack.asciidoc">edit</a></h3>
</div></div></div>
<p>In addition to sending simple text-based messages, you can use the Slack
<a href="https://api.slack.com/docs/attachments" class="ulink" target="_top">attachment</a> mechanism to send formatted
messages. Watcher leverages Slack attachments to enable you to dynamically
populate templated messages from the execution context payload.</p>
<p>The following snippet shows a standard message attachment:</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"actions" : {
"notify-slack" : {
"throttle_period" : "5m",
"slack" : {
"account" : "team1",
"message" : {
"from" : "watcher",
"to" : [ "#admins", "@chief-admin" ],
"text" : "System X Monitoring",
"attachments" : [
{
"title" : "Errors Found",
"text" : "Encountered {{ctx.payload.hits.total}} errors in the last 5 minutes (facepalm)",
"color" : "danger"
}
]
}
}
}
}</pre>
</div>
<p><a id="slack-dynamic-attachment"></a>To define an attachment template that is dynamically populated from the payload,
you specify <code class="literal">dynamic_attachments</code> in the watch action. For example, a dynamic
attachment could reference histogram buckets in the payload and build an
attachment per bucket.</p>
<p>In the following example, the watch input executes a search with a date histogram
aggregation and the Slack action:</p>
<div class="olist orderedlist">
<ol class="orderedlist">
<li class="listitem">
Transforms the payload to a list where each item in the list holds the month,
the user count for that month, and the color that represents the sentiment
associated with that count (danger or bad).
</li>
<li class="listitem">
Defines an attachment template that references items in the list generated by
the transform.
</li>
</ol>
</div>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">"input" : {
"search" : {
"request" : {
"body" : {
"aggs" : {
"users_per_month" : {
"date_histogram" : {
"field" : "@timestamp",
"interval" : "month"
}
}
}
}
}
}
},
...
"actions" : {
"notify-slack" : {
"throttle_period" : "5m",
"transform" : {
"script" : {
"source" : "['items': ctx.payload.aggregations.users_per_month.buckets.collect(bucket -> ['count': bucket.doc_count, 'name': bucket.key_as_string, 'color': bucket.doc_count < 100 ? 'danger' : 'good'])]",
"lang" : "painless"
}
},
"slack" : {
"account" : "team1",
"message" : {
"from" : "watcher",
"to" : [ "#admins", "@chief-admin" ],
"text" : "System X Monitoring",
"dynamic_attachments" : {
"list_path" : "ctx.payload.items" <a id="CO629-1"></a><i class="conum" data-value="1"></i>
"attachment_template" : {
"title" : "{{month}}", <a id="CO629-2"></a><i class="conum" data-value="2"></i>
"text" : "Users Count: {{count}}",
"color" : "{{color}}"
}
}
}
}
}
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO629-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The list generated by the action’s transform.</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO629-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>The parameter placeholders refer to attributes in each item of the list
generated by the transform.</p>
</td>
</tr>
</table>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title"><a id="slack-action-attributes"></a>Slack action attributes<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="https://github.com/elastic/elasticsearch/edit/8.10/docs/reference/watcher/actions/slack.asciidoc">edit</a></h3>
</div></div></div>
<div class="informaltable">
<table border="1" cellpadding="4px">
<colgroup>
<col class="col_1"/>
<col class="col_2"/>
<col class="col_3"/>
</colgroup>
<thead>
<tr>
<th align="left" valign="top">Name</th>
<th align="center" valign="top">Required</th>
<th align="left" valign="top">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left" valign="top"><p><code class="literal">message.from</code></p></td>
<td align="center" valign="top"><p>no</p></td>
<td align="left" valign="top"><p>The sender name to display in the Slack message.
Overrides the incoming webhook’s configured name.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">message.to</code></p></td>
<td align="center" valign="top"><p>yes</p></td>
<td align="left" valign="top"><p>The channels and users you want to send the message
to. Channel names must start with <code class="literal">#</code> and user names
must start with <code class="literal">@</code>. Accepts a string value or an
array of string values.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">message.icon</code></p></td>
<td align="center" valign="top"><p>no</p></td>
<td align="left" valign="top"><p>The icon to display in the Slack messages. Overrides
the incoming webhook’s configured icon. Accepts a
public URL to an image.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">message.text</code></p></td>
<td align="center" valign="top"><p>yes</p></td>
<td align="left" valign="top"><p>The message content.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">message.attachments</code></p></td>
<td align="center" valign="top"><p>no</p></td>
<td align="left" valign="top"><p>Slack message attachments. Message attachments enable
you to create more richly-formatted messages. Specified
array as defined in the
<a href="https://api.slack.com/docs/attachments" class="ulink" target="_top">Slack attachments documentation</a>.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">message.dynamic_attachments</code></p></td>
<td align="center" valign="top"><p>no</p></td>
<td align="left" valign="top"><p>Slack message attachments that can be populated
dynamically based on the current watch payload. For
more information, see
<a class="xref" href="actions-slack.html#slack-dynamic-attachment">Using attachments to format Slack messages</a>.</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">proxy.host</code></p></td>
<td align="center" valign="top"><p>no</p></td>
<td align="left" valign="top"><p>The proxy host to use (only in combination with <code class="literal">proxy.port</code>)</p></td>
</tr>
<tr>
<td align="left" valign="top"><p><code class="literal">proxy.port</code></p></td>
<td align="center" valign="top"><p>no</p></td>
<td align="left" valign="top"><p>The proxy port to use (only in combination with <code class="literal">proxy.host</code>)</p></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title"><a id="configuring-slack"></a>Configuring Slack Accounts<a class="edit_me" rel="nofollow" title="Edit this page on GitHub" href="https://github.com/elastic/elasticsearch/edit/8.10/docs/reference/watcher/actions/slack.asciidoc">edit</a></h3>
</div></div></div>
<p>You configure the accounts Watcher can use to communicate with Slack in the
<code class="literal">xpack.notification.slack</code> namespace in <code class="literal">elasticsearch.yml</code>.</p>
<p>You need a Slack App with the <a href="https://api.slack.com/messaging/webhooks" class="ulink" target="_top">Incoming Webhooks feature</a>
to configure a Slack account. Use the generated webhook URL to set up your Slack account in Elasticsearch.</p>
<p>To configure a Slack account, at a minimum you need to specify the account
name and webhook URL in the Elasticsearch keystore (see <a href="/guide/en/elasticsearch/reference/8.10/secure-settings.html" class="ulink" target="_top">secure settings</a>):</p>
<div class="pre_wrapper lang-shell">
<pre class="programlisting prettyprint lang-shell">bin/elasticsearch-keystore add xpack.notification.slack.account.monitoring.secure_url</pre>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>You can no longer configure Slack accounts using <code class="literal">elasticsearch.yml</code> settings.
Please use Elasticsearch’s secure <a class="xref" href="secure-settings.html" title="Secure settings">keystore</a> method instead.</p>
</div>
</div>
<p>You can specify defaults for the
<a class="xref" href="notification-settings.html#slack-account-attributes">Slack notification attributes</a>:</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">xpack.notification.slack:
account:
monitoring:
message_defaults:
from: x-pack
to: notifications
icon: http://example.com/images/watcher-icon.jpg
attachment:
fallback: "X-Pack Notification"
color: "#36a64f"
title: "X-Pack Notification"
title_link: "https://www.elastic.co/guide/en/x-pack/current/index.html"
text: "One of your watches generated this notification."
mrkdwn_in: "pretext, text"</pre>
</div>
<p>To notify multiple channels, create a webhook URL for each channel in Slack
and multiple Slack accounts in Elasticsearch (one for each webhook URL).</p>
<p>If you configure multiple Slack accounts, you either need to configure a default
account or specify which account the notification should be sent with in the
<a class="xref" href="actions-slack.html" title="Watcher Slack Action"><code class="literal">slack</code></a> action.</p>
<div class="pre_wrapper lang-yaml">
<pre class="programlisting prettyprint lang-yaml">xpack.notification.slack:
default_account: team1
account:
team1:
...
team2:
...</pre>
</div>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="actions-logging.html">« Watcher logging Action</a>
</span>
<span class="next">
<a href="actions-pagerduty.html">Watcher PagerDuty action »</a>
</span>
</div>
</div>
<!-- end body -->
</div>
<div class="col-12 order-3 col-lg-2 order-lg-3 h-almost-full-lg sticky-top-lg" id="right_col">
<div id="sticky_content">
<!-- The OTP is appended here -->
<div class="row">
<div class="col-0 col-md-4 col-lg-0" id="bottom_left_col"></div>
<div class="col-12 col-md-8 col-lg-12">
<div id="rtpcontainer">
<div class="mktg-promo" id="most-popular">
<p class="aside-heading">Most Popular</p>
<div class="pb-2">
<p class="media-type">Video</p>
<a href="https://www.elastic.co/webinars/getting-started-elasticsearch?page=docs&placement=top-video">
<p class="mb-0">Get Started with Elasticsearch</p>
</a>
</div>
<div class="pb-2">
<p class="media-type">Video</p>
<a href="https://www.elastic.co/webinars/getting-started-kibana?page=docs&placement=top-video">
<p class="mb-0">Intro to Kibana</p>
</a>
</div>
<div class="pb-2">
<p class="media-type">Video</p>
<a href="https://www.elastic.co/webinars/introduction-elk-stack?page=docs&placement=top-video">
<p class="mb-0">ELK for Logs & Metrics</p>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
<div id='elastic-footer'></div>
<script src='https://www.elastic.co/elastic-footer.js'></script>
<!-- Footer Section end-->
</section>
</div>
<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
window.initial_state = {"alternatives":{"console":{"php":{"hasAny":true},"python":{"hasAny":true},"ruby":{"hasAny":true},"go":{"hasAny":true},"js":{"hasAny":true}}}}</script>
</body>
</html>