|
| 1 | +--- |
| 2 | +navigation_title: Action policy reference |
| 3 | +applies_to: |
| 4 | + stack: unavailable |
| 5 | + serverless: preview |
| 6 | +products: |
| 7 | + - id: kibana |
| 8 | +description: "Grouping modes, frequency options, dispatch outcomes, and matcher field reference for action policies in the experimental alerting features." |
| 9 | +--- |
| 10 | + |
| 11 | +# Action policy reference [action-policy-reference] |
| 12 | + |
| 13 | + |
| 14 | +Action policies are part of the experimental alerting features in Kibana. Use this page when building action policies. Below, you will find details about valid matcher fields, grouping modes and frequency options, dispatch outcome, and more. For step-by-step guidance, refer to [Create and configure an action policy](create-configure-action-policy.md). |
| 15 | + |
| 16 | +## Matcher fields [matcher-fields] |
| 17 | + |
| 18 | +Use these fields in the **Matcher** expression to filter which episodes a policy applies to. Combine them with standard KQL operators, for example `data.severity: "critical" AND episode_status: "active"`. |
| 19 | + |
| 20 | +| Field | Description | Example | |
| 21 | +|---|---|---| |
| 22 | +| `episode_status` | Current lifecycle status of the episode. Accepted values: `active`, `inactive`, `pending`, `recovering`. | `episode_status: "active"` | |
| 23 | +| `data.*` | Dynamic payload fields sent by the rule. Available fields depend on the rule type and configuration. | `data.severity: "critical"` or `data.host.name: "web-01"` | |
| 24 | +| `rule.id` | Unique identifier for the rule that generated the episode. | `rule.id: "rule-001"` | |
| 25 | +| `rule.name` | Display name of the rule. | `rule.name: "High CPU"` | |
| 26 | +| `rule.labels` | Key-value labels attached to the rule. Use dot notation to target a specific label key. | `rule.labels.env: "production"` | |
| 27 | + |
| 28 | +<!--[CONTENT NEEDED for M2: M2 adds two first-class episode-level severity fields that will be directly matchable in KQL: |
| 29 | +
|
| 30 | +- `episode.severity` - The current severity of the episode (most recent evaluation). Enables matching like `episode.severity: "CRITICAL"`. |
| 31 | +- `episode.severity_max` - The highest severity seen over the episode's lifetime. Enables matching like `episode.severity_max: "CRITICAL"` to catch episodes that were once critical even if they have since de-escalated. |
| 32 | +
|
| 33 | +Add both fields to this table with examples. Update the introductory sentence to include them. Also remove or deprecate the `data.severity` example once `episode.severity` is the preferred approach, otherwise users will get conflicting guidance about which field to use for severity matching. |
| 34 | +
|
| 35 | +There is also an open M2 question about whether a severity change mid-episode (de-escalation or escalation) triggers policy re-evaluation. If it does, document the re-evaluation behavior in the frequency options section below, since it interacts with frequency limits.] |
| 36 | +--> |
| 37 | + |
| 38 | +## Dispatch per options [notification-grouping] |
| 39 | + |
| 40 | +Controls how the policy batches matching episodes before sending a notification. |
| 41 | + |
| 42 | +| Option | Description | When to use | |
| 43 | +|---|---|---| |
| 44 | +| Episode | Each episode triggers its own notification independently. Default selection. | You need per-issue visibility and want to handle each problem separately. | |
| 45 | +| Group | The policy bundles episodes that share the same value for a specified `data.*` field into one notification per unique value (a **notification group**). | A rule produces many related episodes (for example, one per service or host) and you want to reduce noise by batching them into shared notifications. | |
| 46 | +| Digest | The policy combines all matching episodes into a single notification, regardless of what they have in common. | You want a single periodic summary of everything that matched, rather than individual alerts. | |
| 47 | + |
| 48 | +## Frequency [throttle-strategies] |
| 49 | + |
| 50 | +**Frequency** controls how often the policy fires for a given episode or notification group. The available options depend on the **Dispatch per** setting. Not all options are valid for all modes. |
| 51 | + |
| 52 | +| Option | Description | When to use | |
| 53 | +|---|---|---| |
| 54 | +| On status change | Notifies when the episode status changes (for example, active → recovering). One notification per transition. | You only need to know when something breaks and when it's resolved. No reminders needed. | |
| 55 | +| On status change + repeat at interval | Notifies on status change, then resends notifications at a regular interval while the episode remains in the same status. | You want status change alerts plus periodic notifications that a problem is still unresolved, in case it has been missed or pushed aside. | |
| 56 | +| At most once every… | Caps notifications at one per episode or notification group within the chosen interval, regardless of rule frequency. | You want to limit alert volume for noisy rules without missing new or ongoing issues. | |
| 57 | +| Every evaluation | Notifies on every rule evaluation. Can be noisy. Use sparingly and only with infrequent rule schedules. | You need a full audit trail of every evaluation, or the rule runs infrequently enough that noise isn't a concern. | |
| 58 | + |
| 59 | +<!--[CONTENT NEEDED for M2: An open M2 question is whether a severity change mid-episode (escalation or de-escalation of `episode.severity`) triggers policy re-evaluation independently of episode status changes. If it does, this table needs a new strategy option or a note explaining the interaction between severity changes and the "On status change" option. Confirm the M2 decision before updating.] |
| 60 | +--> |
| 61 | + |
| 62 | +### Frequency options for Episode [frequency-when-episode-per_episode] |
| 63 | + |
| 64 | +Available frequency options when you set **Dispatch per** to **Episode**. |
| 65 | + |
| 66 | +| Option | Description | Example | |
| 67 | +|---|---|---| |
| 68 | +| On status change | Notifies once when the episode opens and once when it recovers. No repeat notifications while it remains active. Best for when you trust your ticketing or incident workflow to track ongoing issues | A host goes down at 9:00am → one notification. Recovers at 11:00am → one notification. No notifications between them. | |
| 69 | +| On status change + repeat at interval | Same as On status change, but also sends a reminder at a set interval while the episode is still active. | A host goes down at 9:00am → notification. With a 1h repeat: reminder at 10:00am, 11:00am. Recovers at 11:30am → notification. | |
| 70 | +| Every evaluation | Fires on every rule evaluation, regardless of status. Can be noisy on frequent rule schedules. Avoid in production. | A rule running every 5 minutes with one active episode produces up to 288 notifications per day. | |
| 71 | + |
| 72 | +### Frequency options for Group |
| 73 | + |
| 74 | +Available frequency options when you set **Dispatch per** to **Group**. |
| 75 | + |
| 76 | +| Option | Description | Example | |
| 77 | +|---|---|---| |
| 78 | +| At most once every… | Limits how often each notification group can notify, regardless of how many episodes match or how often the rule runs. | 10 episodes share `data.host.name: "web-01"`. With a 1h limit, you get at most one notification per hour for that notification group. | |
| 79 | +| Every evaluation | Fires on every rule evaluation for each unique value in the group-by field. Still noisy on frequent rule schedules. | A rule running every 10 minutes with 5 unique host values produces up to 6 notifications per host per hour. | |
| 80 | + |
| 81 | +### Frequency options for Digest |
| 82 | + |
| 83 | +Available frequency options when you set **Dispatch per** to **Digest**. |
| 84 | + |
| 85 | +| Option | Description | Example | |
| 86 | +|---|---|---| |
| 87 | +| Every evaluation | The only option for Digest. Fires on every rule run, bundling all matching episodes into one message. Pair with a longer rule schedule to avoid frequent summary messages. | A rule running every 30 minutes with 20 matching episodes produces one summary notification every 30 minutes containing all 20. | |
| 88 | + |
| 89 | +## Dispatch outcomes |
| 90 | + |
| 91 | +The system records each notification attempt with one of the following outcomes. To investigate delivery issues, query the `.alert-actions` data stream in Discover and filter by the `outcome` field. |
| 92 | + |
| 93 | +| Outcome | What happened | |
| 94 | +|---|---| |
| 95 | +| `dispatched` | The system sent the notification successfully. | |
| 96 | +| `throttled` | The system skipped delivery because the **frequency** interval had not elapsed. This is expected behavior, not an error. | |
| 97 | +| `suppressed` | Dispatch was blocked before the notification went out—the rule was acknowledged, snoozed, or deactivated. | |
| 98 | +| `unmatched` | No action policy matched this episode, so no workflow ran. | |
| 99 | +| `error` | An error occurred during processing. Check {{kib}} logs to identify the cause. | |
0 commit comments