Zabbix API — Есть ли способ запросить уменьшенное количество записей «тренда» или «истории» для определенного временного диапазона

#zabbix

#zabbix

Вопрос:

Я некоторое время работал над проектом, которому необходимо преобразовать данные «трендов» и «истории» Zabbix в различные типы диаграмм, такие как линейная диаграмма или круговая диаграмма.

Проблема в том, что может быть слишком много данных (пар время-значение), особенно в случае данных «истории». Конечно, я не хочу отправлять более 10 000 точек во внешний интерфейс, поэтому я хочу уменьшить количество точек, чтобы оно по-прежнему оставалось репрезентативным для этого конкретного временного диапазона.

Конечно, один из способов решения — реализовать это на стороне сервера, но, если нет необходимости, я не хочу нагружать свои ресурсы (процессор, сеть и т.д.).

Я просмотрел документацию Zabbix API для «истории» и «тенденций», но я не нашел то, что мне было нужно.

Я хотел бы знать, есть ли какой-либо способ запросить уменьшенное количество точек «истории» или «тренда» у Zabbix API за определенный период времени, чтобы он оставался репрезентативным для всех данных?

Версия Zabbix API: 4.0

 from datetime import datetime
import math
import sys
import time

from pyzabbix import ZabbixAPI


def n_sized_chunks(lst, n):
    """Yield successive n-sized chunks from 'lst'."""
    for i in range(0, len(lst), n):
        yield lst[i:i n]


# The hostname at which the Zabbix web interface is available
ZABBIX_SERVER = '<zabbix-server>'
MAX_POINTS = 300

zapi = ZabbixAPI(ZABBIX_SERVER)

# Login to the Zabbix API
zapi.login('<username>', '<password>')

item_id = '<item-id>'

# Create a time range
time_till = time.mktime(datetime.now().timetuple())
time_from = time_till - 60 * 60 * 24 * 7  # 1 week

# Query item's history (integer) data
history = zapi.history.get(itemids=[item_id],
                           time_from=time_from,
                           time_till=time_till,
                           output='extend',
                           )

length = len(history)
print(f"Before: {length}")  # ~10097

###################################################################
# Can Zabbix API do the followings (or something similar) for me? #
###################################################################
if length <= MAX_POINTS:
    sys.exit(0)
chunk_size = math.ceil(length / MAX_POINTS)
x = list(map(lambda point: float(point['clock']), history))
y = list(map(lambda point: float(point['value']), history))
x_chunks = list(n_sized_chunks(lst=x, n=chunk_size))
y_chunks = list(n_sized_chunks(lst=y, n=chunk_size))
history = []
for x, y in zip(x_chunks, y_chunks):
    history.append({'clock': (x[0] x[-1])/2, 'value': sum(y)/len(y)})
######################################################################

print(f"After: {len(history)}") ## ~297
  

Ответ №1:

В настоящее время это невозможно. Возможно, вы захотите проголосовать за https://support.zabbix.com/browse/ZBXNEXT-656 .