Другое

Как получить время минимального значения в Zabbix

Руководство по получению времени минимального значения элемента данных в Zabbix 7.4. API, SQL-запросы и примеры для температурных данных.

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

В Zabbix 7.4 для узла сети создан дополнительный вычисляемый элемент данных, который с помощью функции min вычисляет минимальное значение соседнего элемента за указанный промежуток времени. Как получить значение времени, когда впервые зафиксировано минимальное значение в заданном промежутке времени?

Пример: В Zabbix поступают показания значений температуры с внешнего устройства. Для отправки отчета по температуре за последние сутки или несколько часов необходимо, в дополнение к минимальному (максимальному) значению, добавить время, когда это значение было впервые зафиксировано.

Версия Zabbix: 7.4

В Zabbix 7.4 для получения времени, когда было впервые зафиксировано минимальное значение элемента данных, необходимо использовать комбинацию API-запросов или прямые запросы к базе данных, так как функция min() по умолчанию возвращает только значение, но не метку времени.

Содержание

Основные методы решения

Чтобы получить время, когда было впервые зафиксировано минимальное значение в заданном промежутке времени, можно использовать несколько подходов:

  1. Получение исторических данных через API - запрос всех значений за период и поиск минимального
  2. Прямые запросы к базе данных - SQL-запросы для получения минимального значения с соответствующей меткой времени
  3. Использование trend.get - для сжатых данных трендов
  4. Расчет в триггерных выражениях - с помощью дополнительных функций

Использование API history.get

Основной способ получить исторические данные с метками времени - использовать метод history.get через Zabbix API:

json
{
  "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
}

После получения данных необходимо найти минимальное значение и соответствующую ему метку времени:

python
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 запрос будет выглядеть так:

sql
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:

sql
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:

json
{
  "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, который:

  1. Получает ID элемента данных температуры
  2. Запрашивает исторические данные за нужный период
  3. Находит минимальное значение и его метку времени
  4. Форматирует результат для отчета
python
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, рекомендуется использовать следующие подходы:

  1. Для программной обработки - используйте API history.get с последующим анализом данных для поиска минимального значения и соответствующей метки времени
  2. Для быстрого получения данных - используйте прямые SQL-запросы к базе данных
  3. Для сжатых данных - метод trend.get подойдет для данных, хранящихся в формате трендов
  4. Для автоматизации отчетов - создайте скрипт на Python или другом языке, который будет автоматически собирать данные и формировать отчеты

Все эти методы позволят вам получить не только минимальное значение температуры (или другого показателя), но и точное время, когда это значение было впервые зафиксировано в системе мониторинга.

Авторы
Проверено модерацией
Модерация