[comment]: # ({19cf85e8-bfe1a94d})
# 1. Агрегированные вычисления

[comment]: # ({/19cf85e8-bfe1a94d})

[comment]: # ({96203d1d-f8e62abe})
#### Обзор

Агрегированные вычисления — это тип [вычисляемых элементов данных](/manual/config/items/itemtypes/calculated), который позволяет собирать информацию с нескольких элементов данных Zabbix сервером, и затем вычислять совокупность, в зависимости от использованной функции агрегирования.

Агрегированные вычисления не требуют наличия какого-либо агента, запущенного на наблюдаемом узле сети.

[comment]: # ({/96203d1d-f8e62abe})

[comment]: # ({ab0c22a1-63d83a0c})
#### Синтаксис

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

```default
функция_агрегации(функция_foreach(/узел_сети/ключ?[group="узел сети"],период_времени))
```

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

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

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

```default
функция_агрегации(функция(/узел_сети/ключ,параметр),функция(/узел_сети2/ключ2,параметр),...)
```

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

::: noteclassic
Если в результате агрегации получится значение числа с плавающей точкой, оно будет обрезаться до целого числа, если типом информации вычисляемого элемента данных выбрано *Числовой (целое положительное)*.
:::

Пользовательские макросы и макросы низкоуровневого обнаружения поддерживаются в:

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

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

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

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

[comment]: # ({3bbe172c-3bbe172c})
#### Примеры использования

Примеры ключей для агрегированных вычислений.

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

[comment]: # ({1306478c-874bcf94})
##### Пример 1

Общий размер дискового пространства в группе узлов сети «MySQL Servers».

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

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

[comment]: # ({5c3dc788-3182672a})
##### Пример 2

Сумма последних значений на узле сети всех элементов данных, совпадающих с net.if.in\[\*\].

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

[comment]: # ({/5c3dc788-3182672a})

[comment]: # ({beca1bb5-cdf2da8b})
##### Пример 3

Средняя загрузка процессора в группе узлов сети «MySQL Servers».

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

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

[comment]: # ({c12aa12c-db9c8fce})
##### Пример 4

Усреднение за 5 минут количества запросов в секунду по группе узлов сети «MySQL Servers».

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

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

[comment]: # ({c083097e-0233edd3})
##### Пример 5

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

```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")]))
```

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

[comment]: # ({0a45c034-30448f5d})
##### Пример 6

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

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

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

[comment]: # ({dd370fd1-3e9404a6})
##### Пример 7

Общее количество неподдерживаемых элементов данных в группе узлов сети «Zabbix servers».

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

##### Пример 8

Сумма последних числовых результатов DNS проверок по всем узлам сети.
Примером одного из возможных ключей элемента данных может являться `net.dns[192.0.2.1,example.com,A]`.

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

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

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

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

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

|Выражение|Пример|
|-|---------|
|Допустимое|`avg(last(/host/key1),last(/host/key2)*10,last(/host/key1)*100)`<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>`sum(/host/key, avg(10,2))`<br>`sum(/host/key,last(/host/key2))`|

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

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

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

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