Как получить время минимального значения в Zabbix
Руководство по получению времени минимального значения элемента данных в Zabbix 7.4. API, SQL-запросы и примеры для температурных данных.
Как получить время, когда было зафиксировано минимальное значение элемента данных в Zabbix?
В Zabbix 7.4 для узла сети создан дополнительный вычисляемый элемент данных, который с помощью функции min вычисляет минимальное значение соседнего элемента за указанный промежуток времени. Как получить значение времени, когда впервые зафиксировано минимальное значение в заданном промежутке времени?
Пример: В Zabbix поступают показания значений температуры с внешнего устройства. Для отправки отчета по температуре за последние сутки или несколько часов необходимо, в дополнение к минимальному (максимальному) значению, добавить время, когда это значение было впервые зафиксировано.
Версия Zabbix: 7.4
В Zabbix 7.4 для получения времени, когда было впервые зафиксировано минимальное значение элемента данных, необходимо использовать комбинацию API-запросов или прямые запросы к базе данных, так как функция min() по умолчанию возвращает только значение, но не метку времени.
Содержание
- Основные методы решения
- Использование API history.get
- Прямые запросы к базе данных
- Использование trend.get для сжатых данных
- Альтернативные решения через триггеры
- Пример для температурных данных
- Заключение
Основные методы решения
Чтобы получить время, когда было впервые зафиксировано минимальное значение в заданном промежутке времени, можно использовать несколько подходов:
- Получение исторических данных через API - запрос всех значений за период и поиск минимального
- Прямые запросы к базе данных - SQL-запросы для получения минимального значения с соответствующей меткой времени
- Использование trend.get - для сжатых данных трендов
- Расчет в триггерных выражениях - с помощью дополнительных функций
Использование API history.get
Основной способ получить исторические данные с метками времени - использовать метод history.get через Zabbix API:
{
"jsonrpc": "2.0",
"method": "history.get",
"params": {
"output": "extend",
"history": 0,
"itemids": "23296",
"time_from": "1732762800",
"time_till": "1732849200",
"sortfield": "clock",
"sortorder": "ASC",
"limit": "10000"
},
"auth": "ваш_токен",
"id": 1
}
После получения данных необходимо найти минимальное значение и соответствующую ему метку времени:
import zabbix_api
zapi = zabbix_api.ZabbixAPI(server="https://your-zabbix-url", user="Admin", password="zabbix")
# Получаем исторические данные
history = zapi.history.get(
itemids=[item_id],
time_from=start_time,
time_till=end_time,
output='extend',
sortfield='clock',
sortorder='ASC'
)
# Находим минимальное значение и его метку времени
min_value = None
min_timestamp = None
for record in history:
value = float(record['value'])
if min_value is None or value < min_value:
min_value = value
min_timestamp = record['clock']
print(f"Минимальное значение: {min_value}")
print(f"Время записи: {min_timestamp}")
Прямые запросы к базе данных
Для более эффективного решения можно использовать прямые запросы к базе данных Zabbix. Для MySQL запрос будет выглядеть так:
SELECT itemid, from_unixtime(clock) as time, value
FROM history
WHERE itemid = 29096
AND clock >= unix_timestamp('2024-11-28 00:00:00')
AND clock <= unix_timestamp('2024-11-28 23:59:59')
ORDER BY value ASC, clock ASC
LIMIT 1;
Для PostgreSQL:
SELECT itemid, to_timestamp(clock) as time, value
FROM history
WHERE itemid = 29096
AND clock >= extract(epoch from '2024-11-28 00:00:00')::bigint
AND clock <= extract(epoch from '2024-11-28 23:59:59')::bigint
ORDER BY value ASC, clock ASC
LIMIT 1;
Этот запрос сразу вернет минимальное значение и метку времени, когда оно было впервые зафиксировано.
Использование trend.get для сжатых данных
Для сжатых данных трендов можно использовать метод trend.get:
{
"jsonrpc": "2.0",
"method": "trend.get",
"params": {
"itemids": ["itemid"],
"time_from": "1732762800",
"time_till": "1732849200",
"output": ["itemid", "value_min", "value_avg", "value_max", "clock"],
"sortfield": "clock",
"sortorder": "ASC"
},
"auth": "ваш_токен",
"id": 1
}
Этот метод вернет минимальные значения для каждого интервала времени вместе с меткой времени начала интервала.
Альтернативные решения через триггеры
Если вам нужно получить эту информацию в контексте триггерных выражений, можно использовать дополнительные функции. Однако стандартная функция min() не предоставляет метку времени.
В качестве альтернативы можно создать вычисляемый элемент данных, который будет использовать LLD (Low Level Discovery) для создания элементов данных с временными метками.
Пример для температурных данных
Для вашей задачи с температурными данными оптимальным решением будет использовать скрипт на Python, который:
- Получает ID элемента данных температуры
- Запрашивает исторические данные за нужный период
- Находит минимальное значение и его метку времени
- Форматирует результат для отчета
import zabbix_api
from datetime import datetime
def get_min_temperature_with_timestamp(item_id, start_time, end_time):
"""
Получает минимальную температуру и время ее записи за указанный период
Args:
item_id: ID элемента данных температуры
start_time: Начало периода в формате Unix timestamp
end_time: Конец периода в формате Unix timestamp
Returns:
tuple: (минимальная_температура, метка_времени)
"""
zapi = zabbix_api.ZabbixAPI(server="https://your-zabbix-url", user="Admin", password="zabbix")
try:
# Получаем исторические данные
history = zapi.history.get(
itemids=[item_id],
time_from=start_time,
time_till=end_time,
output='extend',
sortfield='clock',
sortorder='ASC'
)
if not history:
return None, None
# Находим минимальное значение и его метку времени
min_value = None
min_timestamp = None
for record in history:
value = float(record['value'])
if min_value is None or value < min_value:
min_value = value
min_timestamp = int(record['clock'])
return min_value, min_timestamp
finally:
zapi.user.logout()
# Пример использования
item_id = "29096" # ID элемента данных температуры
start_time = int(datetime.now().timestamp()) - 86400 # 24 часа назад
end_time = int(datetime.now().timestamp()) # сейчас
min_temp, timestamp = get_min_temperature_with_timestamp(item_id, start_time, end_time)
if min_temp is not None:
print(f"Минимальная температура за последние 24 часа: {min_temp}°C")
print(f"Время записи: {datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')}")
else:
print("Данные за указанный период не найдены")
Заключение
Для получения времени, когда было впервые зафиксировано минимальное значение элемента данных в Zabbix 7.4, рекомендуется использовать следующие подходы:
- Для программной обработки - используйте API
history.getс последующим анализом данных для поиска минимального значения и соответствующей метки времени - Для быстрого получения данных - используйте прямые SQL-запросы к базе данных
- Для сжатых данных - метод
trend.getподойдет для данных, хранящихся в формате трендов - Для автоматизации отчетов - создайте скрипт на Python или другом языке, который будет автоматически собирать данные и формировать отчеты
Все эти методы позволят вам получить не только минимальное значение температуры (или другого показателя), но и точное время, когда это значение было впервые зафиксировано в системе мониторинга.