summaryrefslogtreecommitdiffstats
path: root/health/REFERENCE.md
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-07-24 09:54:23 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-07-24 09:54:44 +0000
commit836b47cb7e99a977c5a23b059ca1d0b5065d310e (patch)
tree1604da8f482d02effa033c94a84be42bc0c848c3 /health/REFERENCE.md
parentReleasing debian version 1.44.3-2. (diff)
downloadnetdata-836b47cb7e99a977c5a23b059ca1d0b5065d310e.tar.xz
netdata-836b47cb7e99a977c5a23b059ca1d0b5065d310e.zip
Merging upstream version 1.46.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'health/REFERENCE.md')
-rw-r--r--health/REFERENCE.md1387
1 files changed, 0 insertions, 1387 deletions
diff --git a/health/REFERENCE.md b/health/REFERENCE.md
deleted file mode 100644
index 7ea89529..00000000
--- a/health/REFERENCE.md
+++ /dev/null
@@ -1,1387 +0,0 @@
-# Configure alerts
-
-Netdata's health watchdog is highly configurable, with support for dynamic thresholds, hysteresis, alert templates, and
-more. You can tweak any of the existing alerts based on your infrastructure's topology or specific monitoring needs, or
-create new entities.
-
-You can use health alerts in conjunction with any of Netdata's [collectors](https://github.com/netdata/netdata/blob/master/collectors/README.md) (see
-the [supported collector list](https://github.com/netdata/netdata/blob/master/collectors/COLLECTORS.md)) to monitor the health of your systems, containers, and
-applications in real time.
-
-While you can see active alerts both on the local dashboard and Netdata Cloud, all health alerts are configured _per
-node_ via individual Netdata Agents. If you want to deploy a new alert across your
-[infrastructure](https://github.com/netdata/netdata/blob/master/docs/quickstart/infrastructure.md), you must configure each node with the same health configuration
-files.
-
-## Edit health configuration files
-
-You can configure the Agent's health watchdog service by editing files in two locations:
-
-- The `[health]` section in `netdata.conf`. By editing the daemon's behavior, you can disable health monitoring
- altogether, run health checks more or less often, and more. See
- [daemon configuration](https://github.com/netdata/netdata/blob/master/daemon/config/README.md#health-section-options) for a table of
- all the available settings, their default values, and what they control.
-
-- The individual `.conf` files in `health.d/`. These health entity files are organized by the type of metric they are
- performing calculations on or their associated collector. You should edit these files using the `edit-config`
- script. For example: `sudo ./edit-config health.d/cpu.conf`.
-
-Navigate to your [Netdata config directory](https://github.com/netdata/netdata/blob/master/docs/configure/nodes.md) and
-use `edit-config` to make changes to any of these files.
-
-### Edit individual alerts
-
-For example, to edit the `cpu.conf` health configuration file, run:
-
-```bash
-sudo ./edit-config health.d/cpu.conf
-```
-
-Each health configuration file contains one or more health _entities_, which always begin with `alarm:` or `template:`.
-For example, here is the first health entity in `health.d/cpu.conf`:
-
-```yaml
- template: 10min_cpu_usage
- on: system.cpu
- class: Utilization
- type: System
-component: CPU
- os: linux
- hosts: *
- lookup: average -10m unaligned of user,system,softirq,irq,guest
- units: %
- every: 1m
- warn: $this > (($status >= $WARNING) ? (75) : (85))
- crit: $this > (($status == $CRITICAL) ? (85) : (95))
- delay: down 15m multiplier 1.5 max 1h
- summary: CPU utilization
- info: Average cpu utilization for the last 10 minutes (excluding iowait, nice and steal)
- to: sysadmin
-```
-
-To tune this alert to trigger warning and critical alerts at a lower CPU utilization, change the `warn` and `crit` lines
-to the values of your choosing. For example:
-
-```yaml
- warn: $this > (($status >= $WARNING) ? (60) : (75))
- crit: $this > (($status == $CRITICAL) ? (75) : (85))
-```
-
-Save the file and [reload Netdata's health configuration](#reload-health-configuration) to apply your changes.
-
-## Disable or silence alerts
-
-Alerts and notifications can be disabled permanently via configuration changes, or temporarily, via the
-[health management API](https://github.com/netdata/netdata/blob/master/web/api/health/README.md). The
-available options are described below.
-
-### Disable all alerts
-
-In the `netdata.conf` `[health]` section, set `enabled` to `no`, and restart the agent.
-
-### Disable some alerts
-
-In the `netdata.conf` `[health]` section, set `enabled alarms` to a
-[simple pattern](https://github.com/netdata/netdata/edit/master/libnetdata/simple_pattern/README.md) that
-excludes one or more alerts. e.g. `enabled alarms = !oom_kill *` will load all alerts except `oom_kill`.
-
-You can also [edit the file where the alert is defined](#edit-individual-alerts), comment out its definition,
-and [reload Netdata's health configuration](#reload-health-configuration).
-
-### Silence an individual alert
-
-You can stop receiving notification for an individual alert by [changing](#edit-individual-alerts) the `to:` line to `silent`.
-
-```yaml
- to: silent
-```
-
-This action requires that you [reload Netdata's health configuration](#reload-health-configuration).
-
-### Temporarily disable alerts at runtime
-
-When you need to frequently disable all or some alerts from triggering during certain times (for instance
-when running backups) you can use the
-[health management API](https://github.com/netdata/netdata/blob/master/web/api/health/README.md).
-The API allows you to issue commands to control the health engine's behavior without changing configuration,
-or restarting the agent.
-
-### Temporarily silence notifications at runtime
-
-If you want health checks to keep running and alerts to keep getting triggered, but notifications to be
-suppressed temporarily, you can use the
-[health management API](https://github.com/netdata/netdata/blob/master/web/api/health/README.md).
-The API allows you to issue commands to control the health engine's behavior without changing configuration,
-or restarting the agent.
-
-## Write a new health entity
-
-While tuning existing alerts may work in some cases, you may need to write entirely new health entities based on how
-your systems, containers, and applications work.
-
-Read the [health entity reference](#health-entity-reference) for a full listing of the format,
-syntax, and functionality of health entities.
-
-To write a new health entity into a new file, navigate to your [Netdata config directory](https://github.com/netdata/netdata/blob/master/docs/configure/nodes.md),
-then use `touch` to create a new file in the `health.d/` directory. Use `edit-config` to start editing the file.
-
-As an example, let's create a `ram-usage.conf` file.
-
-```bash
-sudo touch health.d/ram-usage.conf
-sudo ./edit-config health.d/ram-usage.conf
-```
-
-For example, here is a health entity that triggers a warning alert when a node's RAM usage rises above 80%, and a
-critical alert above 90%:
-
-```yaml
- alarm: ram_usage
- on: system.ram
-lookup: average -1m percentage of used
- units: %
- every: 1m
- warn: $this > 80
- crit: $this > 90
- info: The percentage of RAM being used by the system.
-```
-
-Let's look into each of the lines to see how they create a working health entity.
-
-- `alarm`: The name for your new entity. The name needs to follow these requirements:
- - Any alphabet letter or number.
- - The symbols `.` and `_`.
- - Cannot be `chart name`, `dimension name`, `family name`, or `chart variable names`.
-
-- `on`: Which chart the entity listens to.
-
-- `lookup`: Which metrics the alert monitors, the duration of time to monitor, and how to process the metrics into a
- usable format.
- - `average`: Calculate the average of all the metrics collected.
- - `-1m`: Use metrics from 1 minute ago until now to calculate that average.
- - `percentage`: Clarify that we're calculating a percentage of RAM usage.
- - `of used`: Specify which dimension (`used`) on the `system.ram` chart you want to monitor with this entity.
-
-- `units`: Use percentages rather than absolute units.
-
-- `every`: How often to perform the `lookup` calculation to decide whether to trigger this alert.
-
-- `warn`/`crit`: The value at which Netdata should trigger a warning or critical alert. This example uses simple
- syntax, but most pre-configured health entities use
- [hysteresis](#special-use-of-the-conditional-operator) to avoid superfluous notifications.
-
-- `info`: A description of the alert, which will appear in the dashboard and notifications.
-
-In human-readable format:
-
-> This health entity, named **ram_usage**, watches the **system.ram** chart. It looks up the last **1 minute** of
-> metrics from the **used** dimension and calculates the **average** of all those metrics in a **percentage** format,
-> using a **% unit**. The entity performs this lookup **every minute**.
->
-> If the average RAM usage percentage over the last 1 minute is **more than 80%**, the entity triggers a warning alert.
-> If the usage is **more than 90%**, the entity triggers a critical alert.
-
-When you finish writing this new health entity, [reload Netdata's health configuration](#reload-health-configuration) to
-see it live on the local dashboard or Netdata Cloud.
-
-## Reload health configuration
-
-To make any changes to your health configuration live, you must reload Netdata's health monitoring system. To do that
-without restarting all of Netdata, run `netdatacli reload-health` or `killall -USR2 netdata`.
-
-## Health entity reference
-
-The following reference contains information about the syntax and options of _health entities_, which Netdata attaches
-to charts in order to trigger alerts.
-
-### Entity types
-
-There are two entity types: **alarms** and **templates**. They have the same format and feature set—the only difference
-is their label.
-
-**Alerts** are attached to specific charts and use the `alarm` label.
-
-**Templates** define rules that apply to all charts of a specific context, and use the `template` label. Templates help
-you apply one entity to all disks, all network interfaces, all MySQL databases, and so on.
-
-Alerts have higher precedence and will override templates.
-If the `alert` and `template` entities have the same name and are attached to the same chart, Netdata will use `alarm`.
-
-### Entity format
-
-Netdata parses the following lines. Beneath the table is an in-depth explanation of each line's purpose and syntax.
-
-- The `alarm` or `template` line must be the first line of any entity.
-- The `on` line is **always required**.
-- The `every` line is **required** if not using `lookup`.
-- Each entity **must** have at least one of the following lines: `lookup`, `calc`, `warn`, or `crit`.
-- A few lines use space-separated lists to define how the entity behaves. You can use `*` as a wildcard or prefix with
- `!` for a negative match. Order is important, too! See our [simple patterns docs](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md) for
- more examples.
-- Lines terminated by a `\` are spliced together with the next line. The backslash is removed and the following line is
- joined with the current one. No space is inserted, so you may split a line anywhere, even in the middle of a word.
- This comes in handy if your `info` line consists of several sentences.
-
-| line | required | functionality |
-|-----------------------------------------------------|-----------------|---------------------------------------------------------------------------------------|
-| [`alarm`/`template`](#alert-line-alarm-or-template) | yes | Name of the alert/template. |
-| [`on`](#alert-line-on) | yes | The chart this alert should attach to. |
-| [`class`](#alert-line-class) | no | The general alert classification. |
-| [`type`](#alert-line-type) | no | What area of the system the alert monitors. |
-| [`component`](#alert-line-component) | no | Specific component of the type of the alert. |
-| [`os`](#alert-line-os) | no | Which operating systems to run this chart. |
-| [`hosts`](#alert-line-hosts) | no | Which hostnames will run this alert. |
-| [`plugin`](#alert-line-plugin) | no | Restrict an alert or template to only a certain plugin. |
-| [`module`](#alert-line-module) | no | Restrict an alert or template to only a certain module. |
-| [`charts`](#alert-line-charts) | no | Restrict an alert or template to only certain charts. |
-| [`lookup`](#alert-line-lookup) | yes | The database lookup to find and process metrics for the chart specified through `on`. |
-| [`calc`](#alert-line-calc) | yes (see above) | A calculation to apply to the value found via `lookup` or another variable. |
-| [`every`](#alert-line-every) | no | The frequency of the alert. |
-| [`green`/`red`](#alert-lines-green-and-red) | no | Set the green and red thresholds of a chart. |
-| [`warn`/`crit`](#alert-lines-warn-and-crit) | yes (see above) | Expressions evaluating to true or false, and when true, will trigger the alert. |
-| [`to`](#alert-line-to) | no | A list of roles to send notifications to. |
-| [`exec`](#alert-line-exec) | no | The script to execute when the alert changes status. |
-| [`delay`](#alert-line-delay) | no | Optional hysteresis settings to prevent floods of notifications. |
-| [`repeat`](#alert-line-repeat) | no | The interval for sending notifications when an alert is in WARNING or CRITICAL mode. |
-| [`options`](#alert-line-options) | no | Add an option to not clear alerts. |
-| [`host labels`](#alert-line-host-labels) | no | Restrict an alert or template to a list of matching labels present on a host. |
-| [`chart labels`](#alert-line-chart-labels) | no | Restrict an alert or template to a list of matching labels present on a host. |
-| [`summary`](#alert-line-summary) | no | A brief description of the alert. |
-| [`info`](#alert-line-info) | no | A longer text field that provides more information of this alert |
-
-The `alarm` or `template` line must be the first line of any entity.
-
-#### Alert line `alarm` or `template`
-
-This line starts an alert or template based on the [entity type](#entity-types) you're interested in creating.
-
-**Alert:**
-
-```yaml
-alarm: NAME
-```
-
-**Template:**
-
-```yaml
-template: NAME
-```
-
-`NAME` can be any alpha character, with `.` (period) and `_` (underscore) as the only allowed symbols, but the names
-cannot be `chart name`, `dimension name`, `family name`, or `chart variables names`.
-
-#### Alert line `on`
-
-This line defines the chart this alert should attach to.
-
-**Alerts:**
-
-```yaml
-on: CHART
-```
-
-The value `CHART` should be the unique ID or name of the chart you're interested in, as shown on the dashboard. In the
-image below, the unique ID is `system.cpu`.
-
-![Finding the unique ID of a
-chart](https://user-images.githubusercontent.com/1153921/67443082-43b16e80-f5b8-11e9-8d33-d6ee052c6678.png)
-
-**Template:**
-
-```yaml
-on: CONTEXT
-```
-
-The value `CONTEXT` should be the context you want this template to attach to.
-
-Need to find the context? Hover over the date on any given chart and look at the tooltip. In the image below, which
-shows a disk I/O chart, the tooltip reads: `proc:/proc/diskstats, disk.io`.
-
-![Finding the context of a chart via the tooltip](https://user-images.githubusercontent.com/1153921/68882856-2b230880-06cd-11ea-923b-b28c4632d479.png)
-
-You're interested in what comes after the comma: `disk.io`. That's the name of the chart's context.
-
-If you create a template using the `disk.io` context, it will apply an alert to every disk available on your system.
-
-#### Alert line `class`
-
-This indicates the type of error (or general problem area) that the alert or template applies to. For example, `Latency` can be used for alerts that trigger on latency issues on network interfaces, web servers, or database systems. Example:
-
-```yaml
-class: Latency
-```
-
-<details>
-<summary>Netdata's stock alerts use the following `class` attributes by default:</summary>
-
-| Class |
-|-------------|
-| Errors |
-| Latency |
-| Utilization |
-| Workload |
-
-</details>
-
-`class` will default to `Unknown` if the line is missing from the alert configuration.
-
-#### Alert line `type`
-
-Type can be used to indicate the broader area of the system that the alert applies to. For example, under the general `Database` type, you can group together alerts that operate on various database systems, like `MySQL`, `CockroachDB`, `CouchDB` etc. Example:
-
-```yaml
-type: Database
-```
-
-<details>
-<summary>Netdata's stock alerts use the following `type` attributes by default, but feel free to adjust for your own requirements.</summary>
-
-| Type | Description |
-|-----------------|------------------------------------------------------------------------------------------------|
-| Ad Filtering | Services related to Ad Filtering (like pi-hole) |
-| Certificates | Certificates monitoring related |
-| Cgroups | Alerts for cpu and memory usage of control groups |
-| Computing | Alerts for shared computing applications (e.g. boinc) |
-| Containers | Container related alerts (e.g. docker instances) |
-| Database | Database systems (e.g. MySQL, PostgreSQL, etc) |
-| Data Sharing | Used to group together alerts for data sharing applications |
-| DHCP | Alerts for dhcp related services |
-| DNS | Alerts for dns related services |
-| Kubernetes | Alerts for kubernetes nodes monitoring |
-| KV Storage | Key-Value pairs services alerts (e.g. memcached) |
-| Linux | Services specific to Linux (e.g. systemd) |
-| Messaging | Alerts for message passing services (e.g. vernemq) |
-| Netdata | Internal Netdata components monitoring |
-| Other | When an alert doesn't fit in other types. |
-| Power Supply | Alerts from power supply related services (e.g. apcupsd) |
-| Search engine | Alerts for search services (e.g. elasticsearch) |
-| Storage | Class for alerts dealing with storage services (storage devices typically live under `System`) |
-| System | General system alerts (e.g. cpu, network, etc.) |
-| Virtual Machine | Virtual Machine software |
-| Web Proxy | Web proxy software (e.g. squid) |
-| Web Server | Web server software (e.g. Apache, ngnix, etc.) |
-| Windows | Alerts for monitor of windows services |
-
-</details>
-
-If an alert configuration is missing the `type` line, its value will default to `Unknown`.
-
-#### Alert line `component`
-
-Component can be used to narrow down what the previous `type` value specifies for each alert or template. Continuing from the previous example, `component` might include `MySQL`, `CockroachDB`, `MongoDB`, all under the same `Database` type. Example:
-
-```yaml
-component: MySQL
-```
-
-As with the `class` and `type` line, if `component` is missing from the configuration, its value will default to `Unknown`.
-
-#### Alert line `os`
-
-The alert or template will be used only if the operating system of the host matches this list specified in `os`. The
-value is a space-separated list.
-
-The following example enables the entity on Linux, FreeBSD, and macOS, but no other operating systems.
-
-```yaml
-os: linux freebsd macos
-```
-
-#### Alert line `hosts`
-
-The alert or template will be used only if the hostname of the host matches this space-separated list.
-
-The following example will load on systems with the hostnames `server` and `server2`, and any system with hostnames that
-begin with `database`. It _will not load_ on the host `redis3`, but will load on any _other_ systems with hostnames that
-begin with `redis`.
-
-```yaml
-hosts: server1 server2 database* !redis3 redis*
-```
-
-#### Alert line `plugin`
-
-The `plugin` line filters which plugin within the context this alert should apply to. The value is a space-separated
-list of [simple patterns](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md). For example,
-you can create a filter for an alert that applies specifically to `python.d.plugin`:
-
-```yaml
-plugin: python.d.plugin
-```
-
-The `plugin` line is best used with other options like `module`. When used alone, the `plugin` line creates a very
-inclusive filter that is unlikely to be of much use in production. See [`module`](#alert-line-module) for a
-comprehensive example using both.
-
-#### Alert line `module`
-
-The `module` line filters which module within the context this alert should apply to. The value is a space-separated
-list of [simple patterns](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md). For
-example, you can create an alert that applies only on the `isc_dhcpd` module started by `python.d.plugin`:
-
-```yaml
-plugin: python.d.plugin
-module: isc_dhcpd
-```
-
-#### Alert line `charts`
-
-The `charts` line filters which chart this alert should apply to. It is only available on entities using the
-[`template`](#alert-line-alarm-or-template) line.
-The value is a space-separated list of [simple patterns](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md). For
-example, a template that applies to `disk.svctm` (Average Service Time) context, but excludes the disk `sdb` from alerts:
-
-```yaml
-template: disk_svctm_alert
- on: disk.svctm
- charts: !*sdb* *
-```
-
-#### Alert line `lookup`
-
-This line makes a database lookup to find a value. This result of this lookup is available as `$this`.
-
-The format is:
-
-```yaml
-lookup: METHOD AFTER [at BEFORE] [every DURATION] [OPTIONS] [of DIMENSIONS] [foreach DIMENSIONS]
-```
-
-The full [database query API](https://github.com/netdata/netdata/blob/master/web/api/queries/README.md) is supported. In short:
-
-- `METHOD` is one of the available [grouping methods](https://github.com/netdata/netdata/blob/master/web/api/queries/README.md#grouping-methods) such as `average`, `min`, `max` etc.
- This is required.
-
-- `AFTER` is a relative number of seconds, but it also accepts a single letter for changing
- the units, like `-1s` = 1 second in the past, `-1m` = 1 minute in the past, `-1h` = 1 hour
- in the past, `-1d` = 1 day in the past. You need a negative number (i.e. how far in the past
- to look for the value). **This is required**.
-
-- `at BEFORE` is by default 0 and is not required. Using this you can define the end of the
- lookup. So data will be evaluated between `AFTER` and `BEFORE`.
-
-- `every DURATION` sets the updated frequency of the lookup (supports single letter units as
- above too).
-
-- `OPTIONS` is a space separated list of `percentage`, `absolute`, `min2max`, `unaligned`,
- `match-ids`, `match-names`. Check the [badges](https://github.com/netdata/netdata/blob/master/web/api/badges/README.md) documentation for more info.
-
-- `of DIMENSIONS` is optional and has to be the last parameter. Dimensions have to be separated
- by `,` or `|`. The space characters found in dimensions will be kept as-is (a few dimensions
- have spaces in their names). This accepts Netdata simple patterns _(with `words` separated by
- `,` or `|` instead of spaces)_ and the `match-ids` and `match-names` options affect the searches
- for dimensions.
-
-- `foreach DIMENSIONS` is optional and works only with [templates](#alert-line-alarm-or-template), will always be the last parameter, and uses the same `,`/`|`
- rules as the `of` parameter. Each dimension you specify in `foreach` will use the same rule
- to trigger an alert. If you set both `of` and `foreach`, Netdata will ignore the `of` parameter
- and replace it with one of the dimensions you gave to `foreach`. This option allows you to
- [use dimension templates to create dynamic alerts](#use-dimension-templates-to-create-dynamic-alerts).
-
-The result of the lookup will be available as `$this` and `$NAME` in expressions.
-The timestamps of the timeframe evaluated by the database lookup is available as variables
-`$after` and `$before` (both are unix timestamps).
-
-#### Alert line `calc`
-
-A `calc` is designed to apply some calculation to the values or variables available to the entity. The result of the
-calculation will be made available at the `$this` variable, overwriting the value from your `lookup`, to use in warning
-and critical expressions.
-
-When paired with `lookup`, `calc` will perform the calculation just after `lookup` has retrieved a value from Netdata's
-database.
-
-You can use `calc` without `lookup` if you are using [other available variables](#variables).
-
-The `calc` line uses [expressions](#expressions) for its syntax.
-
-```yaml
-calc: EXPRESSION
-```
-
-#### Alert line `every`
-
-Sets the update frequency of this alert. This is the same to the `every DURATION` given
-in the `lookup` lines.
-
-Format:
-
-```yaml
-every: DURATION
-```
-
-`DURATION` accepts `s` for seconds, `m` is minutes, `h` for hours, `d` for days.
-
-#### Alert lines `green` and `red`
-
-Set the green and red thresholds of a chart. Both are available as `$green` and `$red` in expressions. If multiple
-alerts define different thresholds, the ones defined by the first alert will be used. Eventually it will be visualized
-on the dashboard, so only one set of them is allowed If you need multiple sets of them in different alerts, use
-absolute numbers instead of `$red` and `$green`.
-
-Format:
-
-```yaml
-green: NUMBER
-red: NUMBER
-```
-
-#### Alert lines `warn` and `crit`
-
-Define the expression that triggers either a warning or critical alert. These are optional, and should evaluate to
-either true or false (or zero/non-zero).
-
-The format uses Netdata's [expressions syntax](#expressions).
-
-```yaml
-warn: EXPRESSION
-crit: EXPRESSION
-```
-
-#### Alert line `to`
-
-This will be the first script parameter that will be executed when the alert changes its status. Its meaning is left up to
-the `exec` script.
-
-The default `exec` script, `alarm-notify.sh`, uses this field as a space separated list of roles, which are then
-consulted to find the exact recipients per notification method.
-
-Format:
-
-```yaml
-to: ROLE1 ROLE2 ROLE3 ...
-```
-
-#### Alert line `exec`
-
-Script to be executed when the alert status changes.
-
-Format:
-
-```yaml
-exec: SCRIPT
-```
-
-The default `SCRIPT` is Netdata's `alarm-notify.sh`, which supports all the notifications methods Netdata supports,
-including custom hooks.
-
-#### Alert line `delay`
-
-This is used to provide optional hysteresis settings for the notifications, to defend against notification floods. These
-settings do not affect the actual alert - only the time the `exec` script is executed.
-
-Format:
-
-```yaml
-delay: [[[up U] [down D] multiplier M] max X]
-```
-
-- `up U` defines the delay to be applied to a notification for an alert that raised its status
- (i.e. CLEAR to WARNING, CLEAR to CRITICAL, WARNING to CRITICAL). For example, `up 10s`, the
- notification for this event will be sent 10 seconds after the actual event. This is used in
- hope the alert will get back to its previous state within the duration given. The default `U`
- is zero.
-
-- `down D` defines the delay to be applied to a notification for an alert that moves to lower
- state (i.e. CRITICAL to WARNING, CRITICAL to CLEAR, WARNING to CLEAR). For example, `down 1m`
- will delay the notification by 1 minute. This is used to prevent notifications for flapping
- alerts. The default `D` is zero.
-
-- `multiplier M` multiplies `U` and `D` when an alert changes state, while a notification is
- delayed. The default multiplier is `1.0`.
-
-- `max X` defines the maximum absolute notification delay an alert may get. The default `X`
- is `max(U * M, D * M)` (i.e. the max duration of `U` or `D` multiplied once with `M`).
-
- Example:
-
- `delay: up 10s down 15m multiplier 2 max 1h`
-
- The time is `00:00:00` and the status of the alert is CLEAR.
-
- | time of event | new status | delay | notification will be sent | why |
- |---------------|------------|---------------------|---------------------------|-------------------------------------------------------------------------------|
- | 00:00:01 | WARNING | `up 10s` | 00:00:11 | first state switch |
- | 00:00:05 | CLEAR | `down 15m x2` | 00:30:05 | the alert changes state while a notification is delayed, so it was multiplied |
- | 00:00:06 | WARNING | `up 10s x2 x2` | 00:00:26 | multiplied twice |
- | 00:00:07 | CLEAR | `down 15m x2 x2 x2` | 00:45:07 | multiplied 3 times. |
-
- So:
-
- - `U` and `D` are multiplied by `M` every time the alert changes state (any state, not just
- their matching one) and a delay is in place.
- - All are reset to their defaults when the alert switches state without a delay in place.
-
-#### Alert line `repeat`
-
-Defines the interval between repeating notifications for the alerts in CRITICAL or WARNING mode. This will override the
-default interval settings inherited from health settings in `netdata.conf`. The default settings for repeating
-notifications are `default repeat warning = DURATION` and `default repeat critical = DURATION` which can be found in
-health stock configuration, when one of these interval is bigger than 0, Netdata will activate the repeat notification
-for `CRITICAL`, `CLEAR` and `WARNING` messages.
-
-Format:
-
-```yaml
-repeat: [off] [warning DURATION] [critical DURATION]
-```
-
-- `off`: Turns off the repeating feature for the current alert. This is effective when the default repeat settings has
- been enabled in health configuration.
-- `warning DURATION`: Defines the interval when the alert is in WARNING state. Use `0s` to turn off the repeating
- notification for WARNING mode.
-- `critical DURATION`: Defines the interval when the alert is in CRITICAL state. Use `0s` to turn off the repeating
- notification for CRITICAL mode.
-
-#### Alert line `options`
-
-The only possible value for the `options` line is
-
-```yaml
-options: no-clear-notification
-```
-
-For some alerts we need compare two time-frames, to detect anomalies. For example, `health.d/httpcheck.conf` has an
-alert template called `web_service_slow` that compares the average http call response time over the last 3 minutes,
-compared to the average over the last hour. It triggers a warning alert when the average of the last 3 minutes is twice
-the average of the last hour. In such cases, it is easy to trigger the alert, but difficult to tell when the alert is
-cleared. As time passes, the newest window moves into the older, so the average response time of the last hour will keep
-increasing. Eventually, the comparison will find the averages in the two time-frames close enough to clear the alert.
-However, the issue was not resolved, it's just a matter of the newer data "polluting" the old. For such alerts, it's a
-good idea to tell Netdata to not clear the notification, by using the `no-clear-notification` option.
-
-#### Alert line `host labels`
-
-Defines the list of labels present on a host. See our [host labels guide](https://github.com/netdata/netdata/blob/master/docs/guides/using-host-labels.md) for
-an explanation of host labels and how to implement them.
-
-For example, let's suppose that `netdata.conf` is configured with the following labels:
-
-```yaml
-[host labels]
- installed = 20191211
- room = server
-```
-
-And more labels in `netdata.conf` for workstations:
-
-```yaml
-[host labels]
- installed = 201705
- room = workstation
-```
-
-By defining labels inside of `netdata.conf`, you can now apply labels to alerts. For example, you can add the following
-line to any alerts you'd like to apply to hosts that have the label `room = server`.
-
-```yaml
-host labels: room = server
-```
-
-The `host labels` is a space-separated list that accepts simple patterns. For example, you can create an alert
-that will be applied to all hosts installed in the last decade with the following line:
-
-```yaml
-host labels: installed = 201*
-```
-
-See our [simple patterns docs](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md) for more examples.
-
-#### Alert line `chart labels`
-
-Similar to host labels, the `chart labels` key can be used to filter if an alert will load or not for a specific chart, based on
-whether these chart labels match or not.
-
-The list of chart labels present on each chart can be obtained from http://localhost:19999/api/v1/charts?all
-
-For example, each `disk_space` chart defines a chart label called `mount_point` with each instance of this chart having
-a value there of which mount point it monitors.
-
-If you have an e.g. external disk mounted on `/mnt/disk1` and you don't wish any related disk space alerts running for
-it (but you do for all other mount points), you can add the following to the alert's configuration:
-
-```yaml
-chart labels: mount_point=!/mnt/disk1 *
-```
-
-The `chart labels` is a space-separated list that accepts simple patterns. If you use multiple different chart labels,
-then the result is an OR between them. i.e. the following:
-
-```yaml
-chart labels: mount_point=/mnt/disk1 device=sda
-```
-
-Will create the alert if the `mount_point` is `/mnt/disk1` or the `device` is `sda`. Furthermore, if a chart label name
-is specified that does not exist in the chart, the chart won't be matched.
-
-See our [simple patterns docs](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md) for more examples.
-
-#### Alert line `summary`
-
-The summary field contains a brief title of the alert. It is used as the subject for the notifications, and in
-dashboard list of alerts. An example for the `ram_available` alert is:
-
-```yaml
-summary: Available Ram
-```
-
-summary fields can contain special variables in their text that will be replaced during run-time to provide more specific
-alert information. Current variables supported are:
-
-| variable | description |
-|---------------------|-------------------------------------------------------------------|
-| ${family} | Will be replaced by the family instance for the alert (e.g. eth0) |
-| ${label:LABEL_NAME} | The variable will be replaced with the value of the chart label |
-
-For example, a summary field like the following:
-
-```yaml
-summary: 1 minute received traffic overflow for ${label:device}
-```
-
-Will be rendered on the alert acting on interface `eth0` as:
-
-```yaml
-summary: 1 minute received traffic overflow for eth0
-```
-
-> Please note that variable names are case-sensitive.
-
-#### Alert line `info`
-
-The info field can contain a small piece of text describing the alert or template. This will be rendered in
-notifications and UI elements whenever the specific alert is in focus. An example for the `ram_available` alert is:
-
-```yaml
-info: Percentage of estimated amount of RAM available for userspace processes, without causing swapping
-```
-
-info fields can contain special variables in their text that will be replaced during run-time to provide more specific
-alert information. Current variables supported are:
-
-| variable | description |
-|---------------------|-------------------------------------------------------------------|
-| ${family} | Will be replaced by the family instance for the alert (e.g. eth0) |
-| ${label:LABEL_NAME} | The variable will be replaced with the value of the chart label |
-
-For example, an info field like the following:
-
-```yaml
-info: average inbound utilization for the network interface ${family} over the last minute
-```
-
-Will be rendered on the alert acting on interface `eth0` as:
-
-```yaml
-info: average inbound utilization for the network interface eth0 over the last minute
-```
-
-An alert acting on a chart that has a chart label named e.g. `target`, with a value of `https://netdata.cloud/`,
-can be enriched as follows:
-
-```yaml
-info: average ratio of HTTP responses with unexpected status over the last 5 minutes for the site ${label:target}
-```
-
-Will become:
-
-```yaml
-info: average ratio of HTTP responses with unexpected status over the last 5 minutes for the site https://netdata.cloud/
-```
-
-> Please note that variable names are case-sensitive.
-
-## Expressions
-
-Netdata has an internal infix expression parser under `libnetdata/eval`. This parses expressions and creates an internal
-structure that allows fast execution of them.
-
-These operators are supported `+`, `-`, `*`, `/`, `<`, `==`, `<=`, `<>`, `!=`, `>`, `>=`, `&&`, `||`, `!`, `AND`, `OR`, `NOT`.
-Boolean operators result in either `1` (true) or `0` (false).
-
-The conditional evaluation operator `?` is supported too. Using this operator IF-THEN-ELSE conditional statements can be
-specified. The format is: `(condition) ? (true expression) : (false expression)`. So, Netdata will first evaluate the
-`condition` and based on the result will either evaluate `true expression` or `false expression`.
-
-Example: `($this > 0) ? ($avail * 2) : ($used / 2)`.
-
-Nested such expressions are also supported (i.e. `true expression` and `false expression` can contain conditional
-evaluations).
-
-Expressions also support the `abs()` function.
-
-Expressions can have variables. Variables start with `$`. Check below for more information.
-
-There are two special values you can use:
-
-- `nan`, for example `$this != nan` will check if the variable `this` is available. A variable can be `nan` if the
- database lookup failed. All calculations (i.e. addition, multiplication, etc.) with a `nan` result in a `nan`.
-
-- `inf`, for example `$this != inf` will check if `this` is not infinite. A value or variable can be set to infinite
- if divided by zero. All calculations (i.e. addition, multiplication, etc.) with a `inf` result in a `inf`.
-
-### Special use of the conditional operator
-
-A common (but not necessarily obvious) use of the conditional evaluation operator is to provide
-[hysteresis](https://en.wikipedia.org/wiki/Hysteresis) around the critical or warning thresholds. This usage helps to
-avoid bogus messages resulting from small variations in the value when it is varying regularly but staying close to the
-threshold value, without needing to delay sending messages at all.
-
-An example of such usage from the default CPU usage alerts bundled with Netdata is:
-
-```yaml
-warn: $this > (($status >= $WARNING) ? (75) : (85))
-crit: $this > (($status == $CRITICAL) ? (85) : (95))
-```
-
-The above say:
-
-- If the alert is currently a warning, then the threshold for being considered a warning is 75, otherwise it's 85.
-
-- If the alert is currently critical, then the threshold for being considered critical is 85, otherwise it's 95.
-
-Which in turn, results in the following behavior:
-
-- While the value is rising, it will trigger a warning when it exceeds 85, and a critical alert when it exceeds 95.
-
-- While the value is falling, it will return to a warning state when it goes below 85, and a normal state when it goes
- below 75.
-
-- If the value is constantly varying between 80 and 90, then it will trigger a warning the first time it goes above
- 85, but will remain a warning until it goes below 75 (or goes above 85).
-
-- If the value is constantly varying between 90 and 100, then it will trigger a critical alert the first time it goes
- above 95, but will remain a critical alert goes below 85 (at which point it will return to being a warning).
-
-## Variables
-
-You can find all the variables that can be used for a given chart, using
-`http://NODE:19999/api/v1/alarm_variables?chart=CHART_NAME`, replacing `NODE` with the IP address or hostname for your
-Agent dashboard. For example, [variables for the `system.cpu` chart of the
-registry](https://registry.my-netdata.io/api/v1/alarm_variables?chart=system.cpu).
-
-> If you don't know how to find the CHART_NAME, you can read about it [here](https://github.com/netdata/netdata/blob/master/web/README.md#charts).
-
-Netdata supports 3 internal indexes for variables that will be used in health monitoring.
-
-<details><summary>The variables below can be used in both chart alerts and context templates.</summary>
-
-Although the `alarm_variables` link shows you variables for a particular chart, the same variables can also be used in
-templates for charts belonging to a given [context](https://github.com/netdata/netdata/blob/master/web/README.md#contexts). The reason is that all charts of a given
-context are essentially identical, with the only difference being the family that identifies a particular hardware or software instance.
-
-</details>
-
-- **chart local variables**. All the dimensions of the chart are exposed as local variables. The value of `$this` for
- the other configured alerts of the chart also appears, under the name of each configured alert.
-
- Charts also define a few special variables:
-
- - `$last_collected_t` is the unix timestamp of the last data collection
- - `$collected_total_raw` is the sum of all the dimensions (their last collected values)
- - `$update_every` is the update frequency of the chart
- - `$green` and `$red` the threshold defined in alerts (these are per chart - the charts inherits them from the first alert that defined them)
-
- Chart dimensions define their last calculated (i.e. interpolated) value, exactly as
- shown on the charts, but also a variable with their name and suffix `_raw` that resolves
- to the last collected value - as collected and another with suffix `_last_collected_t`
- that resolves to unix timestamp the dimension was last collected (there may be dimensions
- that fail to be collected while others continue normally).
-
-- **family variables**. Families are used to group charts together. For example all `eth0`
- charts, have `family = eth0`. This index includes all local variables, but if there are
- overlapping variables, only the first are exposed.
-
-- **host variables**. All the dimensions of all charts, including all alerts, in fullname.
- Fullname is `CHART.VARIABLE`, where `CHART` is either the chart id or the chart name (both
- are supported).
-
-- **special variables\*** are:
-
- - `$this`, which is resolved to the value of the current alert.
-
- - `$status`, which is resolved to the current status of the alert (the current = the last
- status, i.e. before the current database lookup and the evaluation of the `calc` line).
- This values can be compared with `$REMOVED`, `$UNINITIALIZED`, `$UNDEFINED`, `$CLEAR`,
- `$WARNING`, `$CRITICAL`. These values are incremental, e.g. `$status > $CLEAR` works as
- expected.
-
- - `$now`, which is resolved to current unix timestamp.
-
-## Alert statuses
-
-Alerts can have the following statuses:
-
-- `REMOVED` - the alert has been deleted (this happens when a SIGUSR2 is sent to Netdata
- to reload health configuration)
-
-- `UNINITIALIZED` - the alert is not initialized yet
-
-- `UNDEFINED` - the alert failed to be calculated (i.e. the database lookup failed,
- a division by zero occurred, etc.)
-
-- `CLEAR` - the alert is not armed / raised (i.e. is OK)
-
-- `WARNING` - the warning expression resulted in true or non-zero
-
-- `CRITICAL` - the critical expression resulted in true or non-zero
-
-The external script will be called for all status changes.
-
-## Example alerts
-
-Check the `health/health.d/` directory for all alerts shipped with Netdata.
-
-Here are a few examples:
-
-### Example 1 - check server alive
-
-A simple check if an apache server is alive:
-
-```yaml
-template: apache_last_collected_secs
- on: apache.requests
- calc: $now - $last_collected_t
- every: 10s
- warn: $this > ( 5 * $update_every)
- crit: $this > (10 * $update_every)
-```
-
-The above checks that Netdata is able to collect data from apache. In detail:
-
-```yaml
-template: apache_last_collected_secs
-```
-
-The above defines a **template** named `apache_last_collected_secs`.
-The name is important since `$apache_last_collected_secs` resolves to the `calc` line.
-So, try to give something descriptive.
-
-```yaml
- on: apache.requests
-```
-
-The above applies the **template** to all charts that have `context = apache.requests`
-(i.e. all your apache servers).
-
-```yaml
- calc: $now - $last_collected_t
-```
-
-- `$now` is a standard variable that resolves to the current timestamp.
-
-- `$last_collected_t` is the last data collection timestamp of the chart.
- So this calculation gives the number of seconds passed since the last data collection.
-
-```yaml
- every: 10s
-```
-
-The alert will be evaluated every 10 seconds.
-
-```yaml
- warn: $this > ( 5 * $update_every)
- crit: $this > (10 * $update_every)
-```
-
-If these result in non-zero or true, they trigger the alert.
-
-- `$this` refers to the value of this alert (e.g. the result of the `calc` line).
- We could also use `$apache_last_collected_secs`.
-
-`$update_every` is the update frequency of the chart, in seconds.
-
-So, the warning condition checks if we have not collected data from apache for 5
-iterations and the critical condition checks for 10 iterations.
-
-### Example 2 - disk space
-
-Check if any of the disks is critically low on disk space:
-
-```yaml
-template: disk_full_percent
- on: disk.space
- calc: $used * 100 / ($avail + $used)
- every: 1m
- warn: $this > 80
- crit: $this > 95
- repeat: warning 120s critical 10s
-```
-
-`$used` and `$avail` are the `used` and `avail` chart dimensions as shown on the dashboard.
-
-So, the `calc` line finds the percentage of used space. `$this` resolves to this percentage.
-
-This is a repeating alert and if the alert becomes CRITICAL it repeats the notifications every 10 seconds. It also
-repeats notifications every 2 minutes if the alert goes into WARNING mode.
-
-### Example 3 - disk fill rate
-
-Predict if any disk will run out of space in the near future.
-
-We do this in 2 steps:
-
-Calculate the disk fill rate:
-
-```yaml
- template: disk_fill_rate
- on: disk.space
- lookup: max -1s at -30m unaligned of avail
- calc: ($this - $avail) / (30 * 60)
- every: 15s
-```
-
-In the `calc` line: `$this` is the result of the `lookup` line (i.e. the free space 30 minutes
-ago) and `$avail` is the current disk free space. So the `calc` line will either have a positive
-number of GB/second if the disk is filling up, or a negative number of GB/second if the disk is
-freeing up space.
-
-There is no `warn` or `crit` lines here. So, this template will just do the calculation and
-nothing more.
-
-Predict the hours after which the disk will run out of space:
-
-```yaml
- template: disk_full_after_hours
- on: disk.space
- calc: $avail / $disk_fill_rate / 3600
- every: 10s
- warn: $this > 0 and $this < 48
- crit: $this > 0 and $this < 24
-```
-
-The `calc` line estimates the time in hours, we will run out of disk space. Of course, only
-positive values are interesting for this check, so the warning and critical conditions check
-for positive values and that we have enough free space for 48 and 24 hours respectively.
-
-Once this alert triggers we will receive an email like this:
-
-![image](https://cloud.githubusercontent.com/assets/2662304/17839993/87872b32-6802-11e6-8e08-b2e4afef93bb.png)
-
-### Example 4 - dropped packets
-
-Check if any network interface is dropping packets:
-
-```yaml
-template: 30min_packet_drops
- on: net.drops
- lookup: sum -30m unaligned absolute
- every: 10s
- crit: $this > 0
-```
-
-The `lookup` line will calculate the sum of the all dropped packets in the last 30 minutes.
-
-The `crit` line will issue a critical alert if even a single packet has been dropped.
-
-Note that the drops chart does not exist if a network interface has never dropped a single packet.
-When Netdata detects a dropped packet, it will add the chart, and it will automatically attach this
-alert to it.
-
-### Example 5 - CPU usage
-
-Check if user or system dimension is using more than 50% of cpu:
-
-```yaml
-template: cpu_template
- on: system.cpu
- os: linux
- lookup: average -1m foreach system,user
- units: %
- every: 10s
- warn: $this > 50
- crit: $this > 80
-```
-
-The `lookup` line will calculate the average CPU usage from system and user over the last minute. Because we have
-the foreach in the `lookup` line, Netdata will create two independent alerts called `cpu_template_system`
-and `dim_template_user` that will have all the other parameters shared among them.
-
-### Example 6 - CPU usage
-
-Check if all dimensions are using more than 50% of cpu:
-
-```yaml
-template: cpu_template
- on: system.cpu
- os: linux
- lookup: average -1m foreach *
- units: %
- every: 10s
- warn: $this > 50
- crit: $this > 80
-```
-
-The `lookup` line will calculate the average of CPU usage from system and user over the last minute. In this case
-Netdata will create alerts for all dimensions of the chart.
-
-### Example 7 - Z-Score based alert
-
-Derive a "[Z Score](https://en.wikipedia.org/wiki/Standard_score)" based alert on `user` dimension of the `system.cpu` chart:
-
-```yaml
- alarm: cpu_user_mean
- on: system.cpu
-lookup: mean -60s of user
- every: 10s
-
- alarm: cpu_user_stddev
- on: system.cpu
-lookup: stddev -60s of user
- every: 10s
-
- alarm: cpu_user_zscore
- on: system.cpu
-lookup: mean -10s of user
- calc: ($this - $cpu_user_mean) / $cpu_user_stddev
- every: 10s
- warn: $this < -2 or $this > 2
- crit: $this < -3 or $this > 3
-```
-
-Since [`z = (x - mean) / stddev`](https://en.wikipedia.org/wiki/Standard_score) we create two input alerts, one for `mean` and one for `stddev` and then use them both as inputs in our final `cpu_user_zscore` alert.
-
-### Example 8 - [Anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#anomaly-rate) based CPU dimensions alert
-
-Warning if 5 minute rolling [anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#anomaly-rate) for any CPU dimension is above 5%, critical if it goes above 20%:
-
-```yaml
-template: ml_5min_cpu_dims
- on: system.cpu
- os: linux
- hosts: *
- lookup: average -5m anomaly-bit foreach *
- calc: $this
- units: %
- every: 30s
- warn: $this > (($status >= $WARNING) ? (5) : (20))
- crit: $this > (($status == $CRITICAL) ? (20) : (100))
- info: rolling 5min anomaly rate for each system.cpu dimension
-```
-
-The `lookup` line will calculate the average anomaly rate of each `system.cpu` dimension over the last 5 minues. In this case
-Netdata will create alerts for all dimensions of the chart.
-
-### Example 9 - [Anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#anomaly-rate) based CPU chart alert
-
-Warning if 5 minute rolling [anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#anomaly-rate) averaged across all CPU dimensions is above 5%, critical if it goes above 20%:
-
-```yaml
-template: ml_5min_cpu_chart
- on: system.cpu
- os: linux
- hosts: *
- lookup: average -5m anomaly-bit of *
- calc: $this
- units: %
- every: 30s
- warn: $this > (($status >= $WARNING) ? (5) : (20))
- crit: $this > (($status == $CRITICAL) ? (20) : (100))
- info: rolling 5min anomaly rate for system.cpu chart
-```
-
-The `lookup` line will calculate the average anomaly rate across all `system.cpu` dimensions over the last 5 minues. In this case
-Netdata will create one alert for the chart.
-
-### Example 10 - [Anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#anomaly-rate) based node level alert
-
-Warning if 5 minute rolling [anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#anomaly-rate) averaged across all ML enabled dimensions is above 5%, critical if it goes above 20%:
-
-```yaml
-template: ml_5min_node
- on: anomaly_detection.anomaly_rate
- os: linux
- hosts: *
- lookup: average -5m of anomaly_rate
- calc: $this
- units: %
- every: 30s
- warn: $this > (($status >= $WARNING) ? (5) : (20))
- crit: $this > (($status == $CRITICAL) ? (20) : (100))
- info: rolling 5min anomaly rate for all ML enabled dims
-```
-
-The `lookup` line will use the `anomaly_rate` dimension of the `anomaly_detection.anomaly_rate` ML chart to calculate the average [node level anomaly rate](https://github.com/netdata/netdata/blob/master/ml/README.md#node-anomaly-rate) over the last 5 minues.
-
-## Use dimension templates to create dynamic alerts
-
-In v1.18 of Netdata, we introduced **dimension templates** for alerts, which simplifies the process of
-writing [alert entities](#health-entity-reference) for
-charts with many dimensions.
-
-Dimension templates can condense many individual entities into one—no more copy-pasting one entity and changing the
-`alarm`/`template` and `lookup` lines for each dimension you'd like to monitor.
-
-### The fundamentals of `foreach`
-
-> **Note**: works only with [templates](#alert-line-alarm-or-template).
-
-Our dimension templates update creates a new `foreach` parameter to the
-existing [`lookup` line](#alert-line-lookup). This
-is where the magic happens.
-
-You use the `foreach` parameter to specify which dimensions you want to monitor with this single alert. You can separate
-them with a comma (`,`) or a pipe (`|`). You can also use
-a [Netdata simple pattern](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md) to create
-many alerts with a regex-like syntax.
-
-The `foreach` parameter _has_ to be the last parameter in your `lookup` line, and if you have both `of` and `foreach` in
-the same `lookup` line, Netdata will ignore the `of` parameter and use `foreach` instead.
-
-Let's get into some examples, so you can see how the new parameter works.
-
-> ⚠️ The following entities are examples to showcase the functionality and syntax of dimension templates. They are not
-> meant to be run as-is on production systems.
-
-### Condensing entities with `foreach`
-
-Let's say you want to monitor the `system`, `user`, and `nice` dimensions in your system's overall CPU utilization.
-Before dimension templates, you would need the following three entities:
-
-```yaml
- alarm: cpu_system
- on: system.cpu
-lookup: average -10m of system
- every: 1m
- warn: $this > 50
- crit: $this > 80
-
- alarm: cpu_user
- on: system.cpu
-lookup: average -10m of user
- every: 1m
- warn: $this > 50
- crit: $this > 80
-
- alarm: cpu_nice
- on: system.cpu
-lookup: average -10m of nice
- every: 1m
- warn: $this > 50
- crit: $this > 80
-```
-
-With dimension templates, you can condense these into a single template. Take note of the `lookup` line.
-
-```yaml
-template: cpu_template
- on: system.cpu
- lookup: average -10m foreach system,user,nice
- every: 1m
- warn: $this > 50
- crit: $this > 80
-```
-
-The `template` line specifies the naming scheme Netdata will use. You can use whatever naming scheme you'd like, with `.`
-and `_` being the only allowed symbols.
-
-The `lookup` line has changed from `of` to `foreach`, and we're now passing three dimensions.
-
-In this example, Netdata will create three alerts with the names `cpu_template_system`, `cpu_template_user`, and
-`cpu_template_nice`. Every minute, each alert will use the same database query to calculate the average CPU usage for
-the `system`, `user`, and `nice` dimensions over the last 10 minutes and send out alerts if necessary.
-
-You can find these three alerts active by clicking on the **Alerts** button in the top navigation, and then clicking on
-the **All** tab and scrolling to the **system - cpu** collapsible section.
-
-![Three new alerts created from the dimension template](https://user-images.githubusercontent.com/1153921/66218994-29523800-e67f-11e9-9bcb-9bca23e2c554.png)
-
-Let's look at some other examples of how `foreach` works, so you can best apply it in your configurations.
-
-### Using a Netdata simple pattern in `foreach`
-
-In the last example, we used `foreach system,user,nice` to create three distinct alerts using dimension templates. But
-what if you want to quickly create alerts for _all_ the dimensions of a given chart?
-
-Use a [simple pattern](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md)! One example of a simple pattern is a single wildcard
-(`*`).
-
-Instead of monitoring system CPU usage, let's monitor per-application CPU usage using the `apps.cpu` chart. Passing a
-wildcard as the simple pattern tells Netdata to create a separate alert for _every_ process on your system:
-
-```yaml
- alarm: app_cpu
- on: apps.cpu
-lookup: average -10m percentage foreach *
- every: 1m
- warn: $this > 50
- crit: $this > 80
-```
-
-This entity will now create alerts for every dimension in the `apps.cpu` chart. Given that most `apps.cpu` charts have
-10 or more dimensions, using the wildcard ensures you catch every CPU-hogging process.
-
-To learn more about how to use simple patterns with dimension templates, see
-our [simple patterns documentation](https://github.com/netdata/netdata/blob/master/libnetdata/simple_pattern/README.md).
-
-### Using `foreach` with alert templates
-
-Dimension templates also work
-with [alert templates](#alert-line-alarm-or-template).
-Alert templates help you create alerts for all the charts with a given context—for example, all the cores of your
-system's CPU.
-
-By combining the two, you can create dozens of individual alerts with a single template entity. Here's how you would
-create alerts for the `system`, `user`, and `nice` dimensions for every chart in the `cpu.cpu` context—or, in other
-words, every CPU core.
-
-```yaml
-template: cpu_template
- on: cpu.cpu
- lookup: average -10m percentage foreach system,user,nice
- every: 1m
- warn: $this > 50
- crit: $this > 80
-```
-
-On a system with a 6-core, 12-thread Ryzen 5 1600 CPU, this one entity creates alerts on the following charts and
-dimensions:
-
-- `cpu.cpu0`
- - `cpu_template_user`
- - `cpu_template_system`
- - `cpu_template_nice`
-
-- `cpu.cpu1`
- - `cpu_template_user`
- - `cpu_template_system`
- - `cpu_template_nice`
-
-- `cpu.cpu2`
- - `cpu_template_user`
- - `cpu_template_system`
- - `cpu_template_nice`
-
-- ...
-
-- `cpu.cpu11`
- - `cpu_template_user`
- - `cpu_template_system`
- - `cpu_template_nice`
-
-And how just a few of those dimension template-generated alerts look like in the Netdata dashboard.
-
-![A few of the created alerts in the Netdata dashboard](https://user-images.githubusercontent.com/1153921/66219669-708cf880-e680-11e9-8b3a-7bfe178fa28b.png)
-
-All in all, this single entity creates 36 individual alerts. Much easier than writing 36 separate entities in your
-health configuration files!
-
-## Troubleshooting
-
-You can compile Netdata with [debugging](https://github.com/netdata/netdata/blob/master/daemon/README.md#debugging) and then set in `netdata.conf`:
-
-```yaml
-[global]
- debug flags = 0x0000000000800000
-```
-
-Then check your `/var/log/netdata/debug.log`. It will show you how it works. Important: this will generate a lot of
-output in debug.log.
-
-You can find the context of charts by looking up the chart in either `http://NODE:19999/netdata.conf` or
-`http://NODE:19999/api/v1/charts`, replacing `NODE` with the IP address or hostname for your Agent dashboard.
-
-You can find how Netdata interpreted the expressions by examining the alert at
-`http://NODE:19999/api/v1/alarms?all`. For each expression, Netdata will return the expression as given in its
-config file, and the same expression with additional parentheses added to indicate the evaluation flow of the
-expression.