7. Вычисляемые элементы данных

Обзор

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

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

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

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

Вычисление основано на формуле. Синтаксис формулы общий с выражениями триггеров.

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

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

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

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

Все вычисления выполняются сервером 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) Параметры функции, если требуются.
Поддерживаются суффиксы времени и суффиксы размера памяти.

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

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

Некоторые переменные могут передаваться в формулу с помощью пользовательских макросов. Обратите внимание, что пользовательские макросы:

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

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

Если в кэше нет недавних данных и в функции не определен период запроса, 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.

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

Пользовательские макросы и макросы 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))

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