user4850501
user4850501

Reputation:

Zabbix API - Is there a way to request reduced number of 'trend' or 'history' records for a specific time range

I have been working on a project for a while which needs to convert Zabbix 'trends' and 'history' data to various types of charts, such as line chart or pie chart.

The problem is that there might be too much data (time-value pairs), especially in the case of 'history' data. Of course, I do not want to send 10,000+ points to the frontend, therefore I want to reduce the number of points, such that it still remains representative of that specific time range.

Of course, one way to solve is to implement this on server-side but, if not necessary, I do not want to burden my resources (CPU, network, etc.).

I have searched through the documentation of Zabbix API for 'history' and 'trends' but I have not found what I needed.

I would like to know if there is any way to request a reduced number of 'history' or 'trend' points from Zabbix API for a specific time period such that it is still representative regarding all the data?

Zabbix API version: 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

Upvotes: 0

Views: 836

Answers (1)

Richlv
Richlv

Reputation: 4153

This is not possible currently. You might want to vote on https://support.zabbix.com/browse/ZBXNEXT-656 .

Upvotes: 1

Related Questions