Zabbix API - 有没有办法在特定时间范围内请求减少 'trend' 或 'history' 记录的数量
Zabbix API - Is there a way to request reduced number of 'trend' or 'history' records for a specific time range
我有一段时间在做一个项目,需要将Zabbix 'trends'和'history'数据转换成各种类型的图表,例如折线图或饼图。
问题是数据(时间-值对)可能太多了,尤其是在'history'数据的情况下。当然,我不想给前端发送10,000+个点,所以我想减少点数,这样它仍然代表那个特定时间范围。
当然,一种解决方法是在服务器端实现,但如果没有必要,我不想增加资源(CPU、网络等)的负担。
我在 Zabbix API 的文档中搜索了 'history' 和 'trends',但我没有找到我需要的东西。
我想知道是否有任何方法可以在特定时间段内从 Zabbix API 请求减少 'history' 或 'trend' 点数,这样它仍然是代表所有数据?
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
目前无法做到这一点。您可能想对 https://support.zabbix.com/browse/ZBXNEXT-656 投票。
我有一段时间在做一个项目,需要将Zabbix 'trends'和'history'数据转换成各种类型的图表,例如折线图或饼图。
问题是数据(时间-值对)可能太多了,尤其是在'history'数据的情况下。当然,我不想给前端发送10,000+个点,所以我想减少点数,这样它仍然代表那个特定时间范围。
当然,一种解决方法是在服务器端实现,但如果没有必要,我不想增加资源(CPU、网络等)的负担。
我在 Zabbix API 的文档中搜索了 'history' 和 'trends',但我没有找到我需要的东西。
我想知道是否有任何方法可以在特定时间段内从 Zabbix API 请求减少 'history' 或 'trend' 点数,这样它仍然是代表所有数据?
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
目前无法做到这一点。您可能想对 https://support.zabbix.com/browse/ZBXNEXT-656 投票。