- 7. Вычисляемые элементы данных
- Обзор
- Настраиваемые поля
- Формула простого вычисления
- Агрегация данных
- Примеры вычисляемых элементов данных
- (1) Общий трафик на интерфейсе
- (2) Процент свободного места на диске
- (3) Процент входящего трафика
- (4) Среднее количество обработанных значений
- (5) Общий входящий трафик для узла сети
- (6) Общее дисковое пространство для группы
- (7) Средняя загрузка процессора для группы
- (8) Средняя загрузка процессора для группы и тега
- (9) Среднее количество запросов для группы
- (10) Общее количество успешных DNS-проверок
- (11) Общее количество неподдерживаемых элементов данных для группы
- (12) Статистика интерфейса для группы
- Примеры правильного/неправильного синтаксиса
7. Вычисляемые элементы данных
Обзор
Этот тип элемента данных позволяет выполнять вычисления на основе метрик, которые уже существуют. Вычисляемый элемент данных сам по себе не собирает никаких данных.
Например, вы можете:
- Подсчитать сумму двух значений.
- Вычислить среднее значение нескольких элементов данных.
- Вычислить общее значение для группы элементов данных.
Полученное значение сохраняется в базе данных Zabbix, как и для любого другого элемента данных; сохраняются как значения истории, так и тренды, и могут быть построены графики.
Вычисление основано на формуле. Синтаксис формулы общий с выражениями триггеров.
Фактически, можно упростить триггеры, перенеся сложную логику обработки данных в вычисляемый элемент данных, а затем ссылаться на вычисляемый элемент данных в триггере, используя ключ элемента данных.
Существует две возможности указать источник данных для вычислений:
- Указать элементы данных в формуле.
- Выполнить агрегацию данных на основе фильтра, который выбирает элементы данных.
Второй вариант позволяет вычислять средние значения по группам, итоговые значения и т. д.
Все вычисления выполняются сервером Zabbix; прокси и агенты в этом вообще не участвуют. Обратите внимание, что активное использование вычисляемых элементов данных с длительными периодами времени может повлиять на производительность сервера.
Настраиваемые поля
Чтобы использовать вычисляемые элементы данных, выберите тип элемента данных Calculated.

Ключ — это уникальный идентификатор элемента данных (для каждого узла сети). Вы можете создать любое имя ключа, используя поддерживаемые символы. Ключ позволяет ссылаться на вычисляемый элемент данных в триггерах.
Определение вычисления необходимо ввести в поле Formula.
Между формулой и ключом нет связи. Параметры ключа никак не используются в формуле.
В отличие от выражений триггеров, Zabbix обрабатывает вычисляемые элементы данных в соответствии с интервалом обновления элемента данных, а не при получении нового значения.
Обратите внимание: если в качестве типа информации выбрано Numeric (unsigned), а результат вычисления является значением с плавающей точкой, он усекается до целого числа.
Формула простого вычисления
Синтаксис простой формулы:
function(/host/key,<parameter1>,<parameter2>,...)
где:
| Элемент | Описание |
|---|---|
function |
Одна из поддерживаемых функций: last, min, max, avg, count и т. д. |
host |
Узел сети элемента данных, который используется для вычисления. Текущий узел сети можно не указывать (то есть как в function(//key,parameter,...)). |
key |
Ключ элемента данных, который используется для вычисления. Элементы данных, возвращающие значения с типом данных binary или JSON, не поддерживаются. Если вы измените ключ элемента данных у элемента данных, на который есть ссылка, ключ необходимо будет вручную обновить в формуле. Все элементы данных, на которые ссылаются функции истории, должны существовать и собирать данные. |
parameter(s) |
Параметры функции, если требуются. Поддерживаются суффиксы времени и суффиксы размера памяти. |
Более сложная формула может использовать комбинацию функций, операторов и скобок.
См. примеры формул вычисляемых элементов данных:
- (1) Общий трафик на интерфейсе
- (2) Процент свободного места на диске
- (3) Процент входящего трафика
- (4) Среднее количество обработанных значений
Некоторые переменные могут передаваться в формулу с помощью пользовательских макросов. Обратите внимание, что пользовательские макросы:
- будут разрешены — если используются для ссылки на параметр функции, параметр фильтра элемента данных или константу.
- не будут разрешены — если ссылаются на функцию, имя узла сети, ключ элемента данных, параметр ключа элемента данных или оператор.
Допускается сравнение со строками.
Если в кэше нет недавних данных и в функции не определен период запроса, Zabbix по умолчанию будет запрашивать исторические значения из базы данных, уходя в прошлое максимум на одну неделю.
Вычисляемый элемент данных может стать неподдерживаемым в нескольких случаях:
- элемент данных, на который есть ссылка,
- не найден
- отключен или принадлежит отключенному узлу сети
- не поддерживается (кроме функции nodata() и операторов с неизвестными значениями)
- нет данных для вычисления функции
- деление на ноль
- используется некорректный синтаксис
Агрегация данных
Агрегация данных основана на фильтре, который выбирает несколько элементов данных. Агрегация данных также является типом вычисляемого элемента данных, однако в формуле используется немного другой синтаксис.
Чтобы получить агрегированные значения, используйте одну из поддерживаемых агрегирующих функций: avg, max, min, sum и т. д.
Затем добавьте функцию foreach как единственный параметр и её фильтр элементов данных для выбора нужных элементов данных:
aggregate_function(function_foreach(/host/key?[group="host group"],timeperiod))
Функция foreach (например, avg_foreach, count_foreach и т. д.) возвращает одно агрегированное значение для каждого выбранного элемента данных.
Элементы данных выбираются с помощью фильтра элементов данных (/host/key?[group="host group"]) из истории элементов данных.
Подробнее см. в разделе функции foreach.
Если у некоторых элементов данных нет данных за запрошенный период, они игнорируются при вычислении. Если данных нет ни у одного элемента данных, функция вернёт ошибку.
В качестве альтернативы можно перечислить несколько элементов данных как параметры для агрегации:
aggregate_function(function(/host/key,parameter),function(/host2/key2,parameter),...)
Обратите внимание, что function здесь должна быть функцией history/trend.
См. примеры агрегирующих вычислений:
- (5) Общий входящий трафик для узла сети
- (6) Общее дисковое пространство для группы
- (7) Средняя загрузка процессора для группы
- (8) Средняя загрузка процессора для группы и тега
- (9) Среднее количество обработанных значений
- (10) Среднее количество запросов для группы
- (11) Общее количество успешных DNS-проверок
- (12) Общее количество неподдерживаемых элементов данных для группы
- (13) Статистика интерфейса для группы
Пользовательские макросы и макросы low-level discovery поддерживаются в:
- параметрах ключа элемента данных
- параметрах функции
- условиях фильтра (имя группы узлов сети и имя тега)
- константах выражения
Агрегирующее вычисление может стать неподдерживаемым, если:
- не найден ни один из указанных элементов данных (это может произойти, если ключ элемента данных указан неверно, ни один из элементов данных не существует или все включённые группы указаны неверно)
- отсутствуют данные для вычисления функции
Примеры вычисляемых элементов данных
(1) Общий трафик на интерфейсе
last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes])
Вычисляет общую пропускную способность на eth0.
(2) Процент свободного места на диске
100*last(//vfs.fs.size[/,free])/last(//vfs.fs.size[/,total])
Zabbix возьмет последние значения свободного и общего дискового пространства (на /) и вычислит процент в соответствии с указанной формулой.
(3) Процент входящего трафика
100*last(//net.if.in[eth0,bytes])/(last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes]))
Вычислите процент входящего трафика от общего трафика.
(4) Среднее количество обработанных значений
avg(/Zabbix server/zabbix[wcache,values],10m)
Вычисляет 10-минутное среднее количества значений, обработанных Zabbix.
(5) Общий входящий трафик для узла сети
sum(last_foreach(/host/net.if.in[*]))
Вычисляет сумму всех элементов данных, соответствующих net.if.in[*] на узле сети.
(6) Общее дисковое пространство для группы
sum(last_foreach(/*/vfs.fs.size[/,total]?[group="MySQL Servers"]))
Вычислить общее дисковое пространство для всех MySQL Servers.
(7) Средняя загрузка процессора для группы
avg(last_foreach(/*/system.cpu.load[,avg1]?[group="MySQL Servers"]))
Вычислить среднюю загрузку процессора для всех MySQL Servers.
(8) Средняя загрузка процессора для группы и тега
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 на всех узлах сети в нескольких группах узлов сети, имеющих определенные теги.
(9) Среднее количество запросов для группы
avg(avg_foreach(/*/mysql.qps?[group="MySQL Servers"],5m))
Вычисляет 5-минутное среднее количества запросов в секунду для MySQL Servers.
(10) Общее количество успешных DNS-проверок
sum(last_foreach(/*/net.dns[*,*,*]))
Вычисляет общее количество успешных DNS-проверок на всех узлах сети.
Показанная форма элемента данных — net.dns[192.0.2.0,example.com,A] — приведена в качестве примера одного из возможных ключей.
Обратите внимание, что подстановочные знаки должны соответствовать количеству параметров в ключе (здесь net.dns имеет три параметра: ip, name, type).
(11) Общее количество неподдерживаемых элементов данных для группы
sum(last_foreach(/*/zabbix[host,,items_unsupported]?[group="Zabbix servers"]))
Вычисляет общее количество неподдерживаемых элементов данных для Zabbix servers.
(12) Статистика интерфейса для группы
sum(last_foreach(/*/net.if.out[eth0,bytes]?[group="video"])) / sum(last_foreach(/*/nginx_stat.sh[active]?[group="video"]))
Вычислить статистику интерфейса для группы video.
Примеры правильного/неправильного синтаксиса
Выражения (включая вызовы функций) не могут использоваться в качестве параметров history-, trend- или foreach-функций. Однако сами эти функции могут использоваться в других (неисторических) параметрах функций.
| Выражение | Пример |
|---|---|
| Допустимо | avg(last(/host/key1),last(/host/key2)*10,last(/host/key1)*100)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)sum(/host/key, avg(10,2))sum(/host/key,last(/host/key2)) |
Обратите внимание, что в выражении вида:
sum(sum_foreach(//resptime[*],5m))/sum(count_foreach(//resptime[*],5m))
нельзя гарантировать, что обе части уравнения всегда будут иметь один и тот же набор значений. Пока вычисляется одна часть выражения, может поступить новое значение за запрошенный период, и тогда другая часть выражения будет иметь другой набор значений.