Как лучше получить время, когда зафиксировано минимальное значение элемента данных?
Нужно понять: для узла сети создан дополнительный вычисляемый элемент данных, в котором по формуле min вычисляется минимальное значение соседнего элемента за указанный промежуток времени. Как получить значение времени, когда впервые зафиксировано минимальное значение в заданном промежутке времени?
По вводным: пример: в Zabbix поступают показания значений температуры с внешнего устройства. Для отправки отчета по температуре за последние сутки/несколько часов, необходимо, в дополнение к минимальному(максимальному) значению, добавить время, когда это значение было впервые зафиксировано.
Версия Zabbix: 7.4
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В Zabbix получить само минимальное значение через
min()просто, а вот время, когда оно впервые было зафиксировано, отдельной стандартной функцией в calculated item обычно не достаётся. Для такой задачи чаще используют API, SQL к history-таблицам или отдельный preprocessing/скрипт, который ищет минимальное значение и первую дату этого значения за период.Для отчёта самый практичный путь — брать данные через Zabbix API методом
history.getза нужный интервал, затем на своей стороне находить минимум и первую временную метку. Пример логики:const values = history.map(row => ({ value: Number(row.value), clock: Number(row.clock) })); const min = Math.min(...values.map(v => v.value)); const first = values .filter(v => v.value === min) .sort((a, b) => a.clock - b.clock)[0];const values = history.map(row => ({ value: Number(row.value), clock: Number(row.clock) })); const min = Math.min(...values.map(v => v.value)); const first = values .filter(v => v.value === min) .sort((a, b) => a.clock - b.clock)[0];
Так вы получите и минимальное значение, и timestamp первого появления. Это удобнее и надёжнее, чем пытаться заставить calculated item хранить два разных значения.
Если очень хочется делать на стороне Zabbix, можно создать отдельный external script или dependent item, который возвращает JSON с минимумом и временем. Например:
{ "min": 18.4, "first_clock": 1718104200 }{ "min": 18.4, "first_clock": 1718104200 }
Потом dependent items могут разобрать JSONPath-ом отдельно значение и время. Но это уже кастомная логика.
SQL напрямую к history-таблицам возможен, но нужно учитывать тип элемента:
history,history_uint,history_float. Для float-значений это обычноhistory. Прямые запросы к БД быстрее для отчётов, но привязывают вас к структуре хранения Zabbix.Итог: для Zabbix 7.4 нормальное решение — получить history за период через API и вычислить минимум плюс первое время во внешнем отчётном скрипте. Calculated item оставьте для самого значения, а время минимума считайте отдельной логикой.