运行需pip install模块py-zabbix,pandas,xlwt,openpyxl
# -*- coding:utf-8 -*- import sys from pyzabbix import ZabbixAPI import time,datetime import pandas as pd class GetHistory(object): def __init__(self): #TODO self.zapi = ZabbixAPI('http://0.0.0.0/zabbix', user='username', password='password') def get_hostgroups(self,group_name): ''' :param group_name: 群组名称 :return: 群组id,主机id,主机信息 ''' host_param = { "output": ['groupid','name'], "filter": {"name": group_name, }, "selectHosts": ["host"] } hostgroup_result = self.zapi.do_request('hostgroup.get',host_param) groupids = hostgroup_result.get('result')[0].get('groupid') host_data = hostgroup_result.get('result')[0].get('hosts') hostids =[x.get('hostid') for x in hostgroup_result.get('result')[0].get('hosts')] return groupids,hostids,host_data def get_item(self,groupids,hostids,item_name=[]): ''' :param groupids: 群组id :param hostids: 主机id :param item_name: 监控项名称,默认[]为全部 :return: 监控项id,监控项id信息 ''' host_param = { "output": ["itemid","hostid","name"], # "output": "extend", "groupids": groupids, "hostids":hostids, "filter": { "name": item_name }, } item_result = self.zapi.do_request('item.get',host_param) itemids = [x.get('itemid') for x in item_result.get('result')] items_data = item_result.get('result') return itemids,items_data def get_history(self,time_from,time_till,itemids,items_data,host_data,host_list = [],history_state=0): ''' :param time_from: 数据开始时间戳 :param time_till: 数据结束时间戳 :param itemids: 监控项id :param items_data: 监控项id数据 :param host_data: 主机id数据 :param host_list: zabbix对应的主机名称列表,默认为所有主机 [] :param history_state: 历史数据类型0:数字浮点, :return: 主机id数据,监控项id数据,历史数据合并后的数据 ''' host_param = { "output": ["clock", "value", "itemid"], "history": history_state, "itemids": itemids, "time_from": time_from, "time_till": time_till, } history_result = self.zapi.do_request('history.get',host_param) history_data = history_result.get('result') #根据主机id合并所有主机或者指定主机组,监控项id信息 if not host_list: host_items_data = [dict(x, **y) for x in items_data for y in host_data if x.get('hostid') == y.get('hostid')] else: host_data_new = [y for x in host_list for y in host_data if x == y.get('host')] host_items_data = [dict(x, **y) for x in items_data for y in host_data_new if x.get('hostid') == y.get('hostid')] # 根据监控项id合并数据 history_host_items_data = [dict(x, **y) for x in history_data for y in host_items_data if x.get('itemid') == int(y.get('itemid'))] return history_host_items_data def toget_data(self,group_name,item_name,host_list =[]): today = datetime.date.today() # 昨天开始时间戳 yesterday_time = int(time.mktime((today - datetime.timedelta(days=1)).timetuple())) # 昨天结束时间戳 today_time = int(time.mktime(today.timetuple())) - 1 groupids, hostids, host_data = self.get_hostgroups(group_name) itemids, items_data = self.get_item(groupids,hostids,item_name) history_host_items_data = self.get_history(yesterday_time,today_time,itemids,items_data,host_data,host_list) return history_host_items_data def main(self): #TODO group_name = 'GROUP_NAME' host_list = ['HostListName',] item_name = [ # 'item_name1', 'item_name2', ] history_host_items_data = self.toget_data(group_name,item_name,host_list) # 'itemid','clock','value', 'hostid' ,'name','host' df = pd.DataFrame(history_host_items_data, columns=['clock','host', 'name', 'value']) df['clock'] = pd.to_datetime(df['clock'],unit='s') df.sort_values(by="clock", inplace=True) df.to_excel(sys.path[0] + r'\%s.xlsx'%group_name,index=False) if __name__ == '__main__': gh = GetHistory() gh.main()