Мониторинг объёма трафика в Zabbix

Мониторинг объёма трафика в Zabbix (входящего или исходящего).

В стандартном шаблоне Zabbix для Linux по умолчанию можно мониторить нагрузку на сетевой интерфейс, видя скорость передачи данных. Мне необходимо было замониторить объём проходящего трафика.

Я реализовал это при помощи Item с типом Calculated. Формула:

last(net.if.out[venet0])

venet0 — это интерфейс конкретно в моём случае, тут будет у всех разное, br0,ens1, например, и т.д. и т.п.

Данные получаются в байтах, в Units надо указать «B».

 

Интервал обновления выбран в 30с, т.к. нагрузка на канал в среднем постоянная, смысла собирать данные чаще смысла нет, а при бОльшем интервале увеличится погрешность.

Для этого Item надо настроить препроцессинг, т.к. данные с формулы в чистом виде это ещё не байты (которые потом Zabbix переведёт сам при необходимости в килобайты и гигабайты), а Биты.

Код JavaScript:

var num = value * 0.125 * 30;
return num

0,125 — это чтобы из бит получить байты. 30 — это значение в секундах, которое ставится для Item. Данные собираются раз в 30 секунд и фиксирует при этом не ВЕСЬ трафик за это время, а зафиксированный в конкретное время. Если посчитать, что он условно все 30 секунд был в среднем такой же, то при умножение на 30 получим объём трафика в байтах, которых был скачан или отправлен за эти 30с.

Стоит учесть как часто собираются данные с net.if.out[venet0]. По умолчанию это минута. Т.е. в таком случае, например, мониторинг объёма трафика частотой не 30с, как описано выше, а 5-10-15с будет иметь ровно такой же результат, как и 30с., если данные с интерфейса сетевой карты приходят реже, думаю это понятно.


Мониторинг объёма трафика, проходящего в сутки.

Скрин настроек Item берёт объём проходящего трафика в период времени (ключ out_traff, он описан в этой записи выше) и суммирует с уже накопленным значением (ключ out_traff_bytes_total_day), т.е. оно постоянно увеличивается.

Чтобы значение обнулялось в какой-то период, настроен препроцессинг на JavaScript со следующим кодом:

const currentDay = new Date().getUTCDate();
const ttt = Date.now();
const previousDay = new Date(ttt - 40000).getUTCDate();
var num = value;
if ( currentDay !== previousDay ) {
num = value * 0;
}
return num

Код я этот соорудил/скопипастил давно. Попробую объяснить. Суть тут вычислить дату предыдущего дня previousDay и сравнить её с currentDay. Если даты одинаковые, то ничего не происходит и данные продолжают суммироваться, Item увеличивается. Если же есть расхождение в датах, то текущее значением Item умножается на 0 (num = value * 0) и тем самым сбрасывается.

На графике это выглядит вот так:

Очевидно график показывает, что за сутки через сетевую карту прошло 95GB данных (в данном конкретном случае это исходящий трафик).

Решение скорее всего «костыльное», просто решил задокументировать, вдруг что-то эдакое пригодится.

Есть нюанс. Изначально этот Item работать не будет, т.к. out_traff_bytes_total_day значения ещё не существует и оно даже не ноль. И чтобы «запустить» Item в работу, надо в формуле сначала оставить только last(out_traff) и получить первое значение, а потом дополнить формулу как на скрине:

 

last(out_traff) +
last(out_traff_bytes_total_day)

 

Добавить комментарий