[[actions-slack]]
=== Slack Action

Use the `slack` action to send messages to a https://slack.com/[Slack]
team's channels or users. To send Slack messages, you need to 
<<configuring-slack, configure at least one Slack account>> in 
`elasticsearch.yml`. 

[[configuring-slack-actions]]
==== Configuring Slack Actions

You configure Slack actions in the `actions` array. Action-specific attributes
are specified using the `slack` keyword.

The following snippet shows a simple slack action definition:

[source,js]
--------------------------------------------------
"actions" : {
  "notify-slack" : {
    "transform" : { ... },
    "throttle_period" : "5m",
    "slack" : {
      "message" : {
        "to" : [ "#admins", "@chief-admin" ], <1>
        "text" : "Encountered  {{ctx.payload.hits.total}} errors in the last 5 minutes (facepalm)" <2>
      }
    }
  }
}
--------------------------------------------------
<1> The channels and users you want to send the message to.
<2> The content of the message.


[[formatting-slack-messages]]
==== Using Attachments to Format Slack Messages

In addition to sending simple text-based messages, you can use the Slack
https://api.slack.com/docs/attachments[attachment] mechanism to send formatted
messages. {watcher} leverages Slack attachments to enable you to dynamically
populate templated messages from the execution context payload.

The following snippet shows a standard message attachment:

[source,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"
          }
        ]
      }
    }
  }
}
--------------------------------------------------

[[slack-dynamic-attachment]]

To define an attachment template that is dynamically populated from the payload,
you specify `dynamic_attachments` in the watch action. For example, a dynamic
attachment could reference histogram buckets in the payload and build an
attachment per bucket.

In the following example, the watch input executes a search with a date histogram
aggregation and the Slack action:

. 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).

. Defines an attachment template that references items in the list generated by
  the transform.

[source,js]
--------------------------------------------------
"input" : {
  "search" : {
    "request" : {
      "body" : {
        "aggs" : {
          "users_per_month" : {
            "date_histogram" : {
              "field" : "@timestamp",
              "interval" : "month"
            }
          }
        }
      }
    }
  }
},
...
"actions" : {
  "notify-slack" : {
    "throttle_period" : "5m",
    "transform" : {
      "script" : {
        "inline" : "['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" <1>
          "attachment_template" : {
            "title" : "{{month}}", <2>
            "text" : "Users Count: {{count}}",
            "color" : "{{color}}"
          }
        }
      }
    }
  }
}
--------------------------------------------------
<1> The list generated by the action's transform.
<2> The parameter placeholders refer to attributes in each item of the list
    generated by the transform.

[[slack-action-attributes]]
==== Slack Action Attributes

[cols=",^,", options="header"]
|======
| Name                          |Required | Description

| `message.from`                | no      | The sender name to display in the  Slack message.
                                    Overrides the incoming webhook's configured name.

| `message.to`                  | yes     | The channels and users you want to send the message
                                    to. Channel names must start with `#` and user names
                                    must start with `@`. Accepts a string value or an
                                    array of string values.

| `message.icon`                | no      | The icon to display in the Slack messages. Overrides
                                    the incoming webhook's configured icon. Accepts a
                                    public URL to an image.

| `message.text`                | yes     | The message content.

| `message.attachments`         | no      | Slack message attachments. Message attachments enable
                                    you to create more richly-formatted messages. Specified
                                    array as defined in the
                                    https://api.slack.com/docs/attachments[Slack attachments documentation].

| `message.dynamic_attachments` | no      | Slack message attachments that can be populated
                                    dynamically based on the current watch payload. For
                                    more information, see
                                    <<slack-dynamic-attachment, Using Attachments to Format Slack Messages>>.

| `proxy.host`      | no        | -       | The proxy host to use (only in combination with `proxy.port`)

| `proxy.port`      | no        | -       | The proxy port to use (only in combination with `proxy.host`)
|======

[[configuring-slack]]
==== Configuring Slack Accounts

You configure the accounts {watcher} can use to communicate with Slack in the
`xpack.notification.slack` namespace in `elasticsearch.yml`.

You need a https://api.slack.com/incoming-webhooks[Slack webhook URL] to 
configure a Slack account. To create a webhook
URL, set up an an _Incoming Webhook Integration_ through the Slack console:

. Log in to http://slack.com[slack.com] as a team administrator.
. Go to https://my.slack.com/services/new/incoming-webhook.
. Select a default channel for the integration.
+
image::slack-add-webhook-integration.jpg[]
. Click *Add Incoming Webhook Integration*.
. Copy the generated webhook URL so you can paste it into your Slack account
  configuration in `elasticsearch.yml`.
+
image::slack-copy-webhook-url.jpg[]

To configure a Slack account, at a minimum you need to specify the account 
name and webhook URL:

[source,yaml]
--------------------------------------------------
xpack.notification.slack:
  account:
    monitoring:
      url: https://hooks.slack.com/services/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
--------------------------------------------------

You can also specify defaults for the <<slack-account-attributes, Slack
notification attributes>>:

[source,yaml]
--------------------------------------------------
xpack.notification.slack:
  account:
    monitoring:
      url: https://hooks.slack.com/services/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
      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."
--------------------------------------------------

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
<<actions-slack, slack>> action. 

[source,yaml]
--------------------------------------------------
xpack.notification.slack:
  default_account: team1
  account:
    team1:
      ...
    team2:
      ...
--------------------------------------------------
