[comment]: # translation:outdated

[comment]: # ({1217d9ed-b8c65ad1})
# 14 Вычисляемый элемент данных

[comment]: # ({/1217d9ed-b8c65ad1})

[comment]: # ({b61f1d79-43ebe58c})
### Обзор

Этот тип элемента данных позволяет выполнять вычисления на основе метрик, которые уже существуют. Вычисляемый элемент данных сам по себе не собирает никаких данных.

Например, вы можете:

-   Подсчитать сумму двух значений.
-   Вычислить среднее значение нескольких элементов данных.
-   Вычислить общее значение для группы элементов данных.

Полученное значение сохраняется в базе данных Zabbix, как и для любого другого элемента данных; сохраняются как значения истории, так и тренды, и могут быть построены графики.

Вычисление основано на формуле. Синтаксис формулы общий с [выражениями триггеров](/manual/config/triggers/expression).

Фактически, можно упростить триггеры, перенеся сложную логику обработки данных в вычисляемый элемент данных, а затем ссылаться на вычисляемый элемент данных в триггере, используя ключ элемента данных.

Существует две возможности указать источник данных для вычислений:

1. Указать элементы данных в формуле.
2. Выполнить [агрегацию данных](#data-aggregations) на основе фильтра, который выбирает элементы данных.

Второй вариант позволяет вычислять средние значения по группам, итоговые значения и т. д.

Все вычисления выполняются сервером Zabbix; прокси и агенты в этом вообще не участвуют. Обратите внимание, что активное использование вычисляемых элементов данных с длительными периодами времени может повлиять на производительность сервера.

[comment]: # ({/b61f1d79-43ebe58c})

[comment]: # ({d549a268-ddc35784})
### Настраиваемые поля

Чтобы использовать вычисляемые элементы данных, выберите тип элемента данных **Calculated**.

![](../../../../../assets/en/manual/config/items/itemtypes/calculated_item.png){width="600"}

**Ключ** — это уникальный идентификатор элемента данных (для каждого узла сети). Вы можете создать любое имя ключа, используя поддерживаемые символы. Ключ позволяет ссылаться на вычисляемый элемент данных в триггерах.

Определение вычисления необходимо ввести в поле **Formula**. 

Между формулой и ключом нет связи. Параметры ключа 
никак не используются в формуле.

В отличие от выражений триггеров, Zabbix обрабатывает вычисляемые элементы данных в соответствии
с интервалом обновления элемента данных, а не при получении нового значения.

Обратите внимание: если в качестве типа информации выбрано *Numeric (unsigned)*, а результат вычисления является значением с плавающей точкой, он усекается до целого числа.

[comment]: # ({/d549a268-ddc35784})

[comment]: # ({d529721d-f105da1a})
### Формула простого вычисления 

Синтаксис простой формулы:

    function(/host/key,<parameter1>,<parameter2>,...)

где:

|Элемент|Описание|
|---|-------|
|`function`|Одна из [поддерживаемых функций](/manual/config/triggers/expression#functions): last, min, max, avg, count и т. д.|
|`host`|Узел сети элемента данных, который используется для вычисления.<br>Текущий узел сети можно не указывать (то есть как в `function(//key,parameter,...)`).|
|`key`|Ключ элемента данных, который используется для вычисления.<br>Элементы данных, возвращающие значения с [типом данных](/manual/config/items/item#configuration) binary или JSON, не поддерживаются.<br>Если вы измените ключ элемента данных у элемента данных, на который есть ссылка, ключ необходимо будет вручную обновить в формуле.<br>Все элементы данных, на которые ссылаются функции истории, должны существовать и собирать данные.|
|`parameter(s)`|Параметры функции, если требуются.<br>Поддерживаются [суффиксы времени](/manual/appendix/suffixes#time-suffixes) и [суффиксы размера памяти](/manual/appendix/suffixes#memory-size-suffixes).|

Более сложная формула может использовать комбинацию функций, операторов и скобок.

См. примеры формул вычисляемых элементов данных:

-   [(1) Общий трафик на интерфейсе](#total-traffic-on-interface)
-   [(2) Процент свободного места на диске](#percentage-of-free-disk-space)
-   [(3) Процент входящего трафика](#percentage-of-incoming-traffic)
-   [(4) Среднее количество обработанных значений](#average-number-of-processed-values)

Некоторые переменные могут передаваться в формулу с помощью [пользовательских макросов](/manual/config/macros/user_macros). 
Обратите внимание, что пользовательские макросы:

-   будут разрешены — если используются для ссылки на параметр функции, параметр фильтра элемента данных или константу. 
-   **не будут** разрешены — если ссылаются на функцию, имя узла сети, ключ элемента данных, параметр ключа элемента данных или оператор.

Допускается сравнение со строками. 

Если в кэше нет недавних данных и в функции не определен период запроса, Zabbix по умолчанию будет запрашивать исторические значения из базы данных, уходя в прошлое максимум на одну неделю.

Вычисляемый элемент данных может стать неподдерживаемым в нескольких случаях:

-   элемент данных, на который есть ссылка,
    -   не найден
    -   отключен или принадлежит отключенному узлу сети
    -   не поддерживается (кроме функции nodata() и
        [операторов](/manual/config/triggers/expression#operators) с
        неизвестными значениями)
-   нет данных для вычисления функции
-   деление на ноль
-   используется некорректный синтаксис

[comment]: # ({/d529721d-f105da1a})

[comment]: # ({69899e6b-63d83a0c})
### Агрегация данных

Агрегация данных основана на фильтре, который выбирает несколько элементов данных. Агрегация данных также является типом вычисляемого элемента данных, однако в формуле используется немного другой синтаксис.

Чтобы получить агрегированные значения, используйте одну из поддерживаемых [агрегирующих функций](/manual/config/triggers/expression/aggregate): `avg`, `max`, `min`, `sum` и т. д.
Затем добавьте функцию **foreach** как единственный параметр и её фильтр элементов данных для выбора нужных элементов данных:

```default
aggregate_function(function_foreach(/host/key?[group="host group"],timeperiod))
```

Функция **foreach** (например, *avg_foreach*, *count_foreach* и т. д.) возвращает одно агрегированное значение для каждого выбранного элемента данных.
Элементы данных выбираются с помощью фильтра элементов данных (`/host/key?[group="host group"]`) из истории элементов данных.
Подробнее см. в разделе [функции foreach](/manual/config/triggers/expression/aggregate/foreach).

Если у некоторых элементов данных нет данных за запрошенный период, они игнорируются при вычислении.
Если данных нет ни у одного элемента данных, функция вернёт ошибку.

В качестве альтернативы можно перечислить несколько элементов данных как параметры для агрегации:

```default
aggregate_function(function(/host/key,parameter),function(/host2/key2,parameter),...)
```

Обратите внимание, что `function` здесь должна быть функцией history/trend.

См. примеры агрегирующих вычислений:

-   [(5) Общий входящий трафик для узла сети](#total-incoming-traffic-for-host)
-   [(6) Общее дисковое пространство для группы](#total-disk-space-for-group)
-   [(7) Средняя загрузка процессора для группы](#average-processor-load-for-group)
-   [(8) Средняя загрузка процессора для группы и тега](#average-processor-load-for-group-and-tag)
-   [(9) Среднее количество обработанных значений](#average-number-of-processed-values)
-   [(10) Среднее количество запросов для группы](#average-number-of-queries-for-group)
-   [(11) Общее количество успешных DNS-проверок](#total-number-of-successful-dns-checks)
-   [(12) Общее количество неподдерживаемых элементов данных для группы](#total-number-of-unsupported-items-for-group)
-   [(13) Статистика интерфейса для группы](#interface-stats-for-group)

Пользовательские макросы и макросы low-level discovery поддерживаются в:

-   параметрах ключа элемента данных
-   параметрах функции
-   условиях фильтра (имя группы узлов сети и имя тега)
-   константах выражения

Агрегирующее вычисление может стать неподдерживаемым, если:

-   не найден ни один из указанных элементов данных (это может произойти, если ключ элемента данных указан неверно, ни один из элементов данных не существует или все включённые группы указаны неверно)
-   отсутствуют данные для вычисления функции

[comment]: # ({/69899e6b-63d83a0c})

[comment]: # ({fdfb8008-82c22f4f})
### Примеры вычисляемых элементов данных

[comment]: # ({/fdfb8008-82c22f4f})

[comment]: # ({a3322852-5d068733})
##### (1) Общий трафик на интерфейсе

```default
last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes])
```

Вычисляет общую пропускную способность на eth0.

[comment]: # ({/a3322852-5d068733})

[comment]: # ({3ed08673-426ab71a})
##### (2) Процент свободного места на диске

```default
100*last(//vfs.fs.size[/,free])/last(//vfs.fs.size[/,total])
```

Zabbix возьмет последние значения свободного и общего дискового пространства (на `/`) и вычислит процент в соответствии с указанной формулой.

[comment]: # ({/3ed08673-426ab71a})

[comment]: # ({0bc6aaac-f8b53af1})
##### (3) Процент входящего трафика

```default
100*last(//net.if.in[eth0,bytes])/(last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes]))
```

Вычислите процент входящего трафика от общего трафика.

[comment]: # ({/0bc6aaac-f8b53af1})

[comment]: # ({537f0855-77bcdfd9})
##### (4) Среднее количество обработанных значений

```default
avg(/Zabbix server/zabbix[wcache,values],10m)
```

Вычисляет 10-минутное среднее количества значений, обработанных
Zabbix.

[comment]: # ({/537f0855-77bcdfd9})

[comment]: # ({8d1ddbe3-3182672a})
##### (5) Общий входящий трафик для узла сети

```default
sum(last_foreach(/host/net.if.in[*]))
```

Вычисляет сумму всех элементов данных, соответствующих `net.if.in[*]` на узле сети.

[comment]: # ({/8d1ddbe3-3182672a})

[comment]: # ({e432a117-874bcf94})
##### (6) Общее дисковое пространство для группы

```default
sum(last_foreach(/*/vfs.fs.size[/,total]?[group="MySQL Servers"]))
```

Вычислить общее дисковое пространство для всех `MySQL Servers`.

[comment]: # ({/e432a117-874bcf94})

[comment]: # ({9125c3ca-cdf2da8b})
##### (7) Средняя загрузка процессора для группы

```default
avg(last_foreach(/*/system.cpu.load[,avg1]?[group="MySQL Servers"]))
```

Вычислить среднюю загрузку процессора для всех `MySQL Servers`.

[comment]: # ({/9125c3ca-cdf2da8b})

[comment]: # ({fca20d64-0233edd3})
##### (8) Средняя загрузка процессора для группы и тега

```default
avg(last_foreach(/*/system.cpu.load?[(group="Servers A" or group="Servers B" or group="Servers C") and (tag="Service:" or tag="Importance:High")]))
```

Вычислить среднюю загрузку CPU на всех узлах сети в нескольких группах узлов сети, имеющих определенные теги.

[comment]: # ({/fca20d64-0233edd3})

[comment]: # ({89b53708-db9c8fce})
##### (9) Среднее количество запросов для группы

```default
avg(avg_foreach(/*/mysql.qps?[group="MySQL Servers"],5m))
```

Вычисляет 5-минутное среднее количества запросов в секунду для `MySQL Servers`.

[comment]: # ({/89b53708-db9c8fce})

[comment]: # ({7b156968-9e0ef2e9})
##### (10) Общее количество успешных DNS-проверок

```default
sum(last_foreach(/*/net.dns[*,*,*]))
```

Вычисляет общее количество успешных DNS-проверок на всех узлах сети.
Показанная форма элемента данных — `net.dns[192.0.2.0,example.com,A]` — приведена в качестве примера одного из возможных ключей.

Обратите внимание, что подстановочные знаки должны соответствовать количеству параметров в ключе (здесь [`net.dns`](/manual/config/items/itemtypes/zabbix_agent#net.dns) имеет три параметра: ip, name, type).

[comment]: # ({/7b156968-9e0ef2e9})

[comment]: # ({ecf9b800-3e9404a6})
##### (11) Общее количество неподдерживаемых элементов данных для группы

```default
sum(last_foreach(/*/zabbix[host,,items_unsupported]?[group="Zabbix servers"]))
```

Вычисляет общее количество неподдерживаемых элементов данных для `Zabbix servers`.

[comment]: # ({/ecf9b800-3e9404a6})

[comment]: # ({b2771cd7-30448f5d})
##### (12) Статистика интерфейса для группы

```default
sum(last_foreach(/*/net.if.out[eth0,bytes]?[group="video"])) / sum(last_foreach(/*/nginx_stat.sh[active]?[group="video"])) 
```

Вычислить статистику интерфейса для группы `video`.

[comment]: # ({/b2771cd7-30448f5d})

[comment]: # ({c3fceab6-f094da29})
### Примеры правильного/неправильного синтаксиса

Выражения (включая вызовы функций) не могут использоваться в качестве параметров history-, trend- или foreach-[функций](/manual/appendix/functions).
Однако сами эти функции могут использоваться в других (неисторических) параметрах функций.

|Выражение|Пример|
|-|---------|
|Допустимо|`avg(last(/host/key1),last(/host/key2)*10,last(/host/key1)*100)`<br><br>`max(avg(avg_foreach(/*/system.cpu.load?[group="Servers A"],5m)),avg(avg_foreach(/*/system.cpu.load?[group="Servers B"],5m)),avg(avg_foreach(/*/system.cpu.load?[group="Servers C"],5m)))`|
|Недопустимо|`sum(/host/key,10+2)`<br><br>`sum(/host/key, avg(10,2))`<br><br>`sum(/host/key,last(/host/key2))`|

Обратите внимание, что в выражении вида:

```default
sum(sum_foreach(//resptime[*],5m))/sum(count_foreach(//resptime[*],5m))
```

нельзя гарантировать, что обе части уравнения всегда будут иметь один и тот же набор значений.
Пока вычисляется одна часть выражения, может поступить новое значение за запрошенный период, и тогда другая часть выражения будет иметь другой набор значений.

[comment]: # ({/c3fceab6-f094da29})
