Использование Zabbix API. Когда не хватает стандартных графиков

от автора

Возникла задача получить некоторую статистику из Zabbix, делюсь опытом получения данных из базы Zabbix через API средствами Python



Куски кода будут для Python 2.7

Для работы с zabbix-api есть готовая библиотека py-zabbix, документация по ней доступна тут, но примеров там не много. Официальное руководство по Zabbix API.

Итак, после стандартной установки:

pip install py-zabbix

пробуем подключиться к серверу Zabbix

from pyzabbix import ZabbixAPI z = ZabbixAPI('https://172.16.1.10', user='user1', password='pass1') answer = z.do_request('apiinfo.version') print "Version:",answer['result'] 

Формат ответа от сервера — JSON:

{u'jsonrpc': u'2.0', u'result': u'3.0.2', u'id': u'1'} 

Скрипт печатает содержимое поля result

Version: 3.0.2

Теперь можно приниматься за решение интересующей задачи. Задача — получить среднее значение Disk Idle Time со всех виртуальных машин за неделю (Пн-Пт) в рабочее время (с 10:00 до 19:00) за определенную неделю. Я не хочу заострять внимание на актуальности этих параметров, а просто поделиться опытом работы с Zabbix API на примере этой конкретной задачи.

Итак, виртуальные машины в Zabbix лежат в отдельной группе, для начала получим список доступных групп с помощью метода hostgroup.get:

#Get List of available groups groups = z.hostgroup.get(output=['itemid','name']) for group in groups:         print group['groupid'],group['name'] 

Параметром output можно определить, какие поля вернет API

38 _Local Domains 53 _Local NAS 23 _Local Servers Linux 27 _Local Servers Virtual Linux 25 _Local Servers Virtual Windows 24 _Local Servers Windows 35 _Local Switches 

Затем можно получить список хостов в конкретной группе с помощью метода host.get:

#Get List of hosts in the group hosts = z.host.get(groupids=25, output=['hostid','name']) for host in hosts:         print host['hostid'],host['name'] 

Параметр groupids определяет идентификатор группы

10197 DC1_--172.16.1.4-- 10204 DC2_--172.16.1.5-- 10637 LocalDB_--172.16.1.12-- 10686 WSUS_--172.16.1.16-- 10708 Jira_--172.16.1.24-- 

Для получения списка items по определенному хосту используется метод item.get:

#Get List of items on the host items = z.item.get(hostids=10637, output=['itemid','name']) for item in items:         print item['itemid'],item['name'] 

Результат:

525617 ICMP ping 525618 ICMP loss 525619 ICMP response time 940205 Input Microsoft Hyper-V Network Adapter #2 940206 Output Microsoft Hyper-V Network Adapter #2 990808 Disk Idle time on C: 990809 Disk Idle time on D: 

Как видно из ответа, выбранный хост имеет 2 диска, нужно вывести минимальное значение из нескольких. Для доступа к данным по items используется метод history.get. Следующий код не претендует на оптимальность, я только начал осваивать Python, но в целом с поставленной задачей скрипт справился.

Для метода history.get нужно определить следующие параметры:

  • history — тип возвращаемого значения
  • itemids — id интересующего item
  • time_from — начало временного интервала
  • time_till — конец временного интервала

Скрипт, собирающий статистику:

from pyzabbix import ZabbixAPI import time import sys z = ZabbixAPI('https://172.16.1.10', user='user1', password='pass1') groupid = 25 #Local Servers Virtual Windows hosts = z.host.get(groupids=groupid , output=['hostid','name']) #Список имен хостов host_names = [host['name'] for host in hosts] #Список идентификаторов host_ids = [host['hostid'] for host in hosts] nameindex = 0 #Константа, кол-во секунд в сутках increment = 60*60*24 for host_id in host_ids:   #параметр search позволяет найти все items, в имени которых есть заданная строка   items = z.do_request('item.get',{'hostids':[host_id],'output': ['itemid','name'],'search':{'name': 'Idle time'}})   #массив найденных дисков   disk_ids = [item['itemid'] for item in items['result']]   #длина массива соответствует кол-ву дисков   num_disks = len(disk_ids)   avg_list=[]   #цикл подсчета среднего для каждого диска   for disk in disk_ids:     #для определения временных рамок используется функция из time     #первый день, за который нужна статистика - 27 марта 2017 года, с 9:00 до 18:00     time_from = time.mktime((2017,3,27,9,0,0,0,0,0))     time_till = time.mktime((2017,3,27,18,0,0,0,0,0))     history_sum=0     history_len=0     #цикл для 5 дней с 27 по 31 марта     for day in range(0,5):       data = z.history.get(history = 0, itemids=disk, time_from=time_from, time_till=time_till)       #массив содержит список значений из истории       graph  = [float(item['value']) for item in data]       #если список не пустой, добавляем его в массив для вычисления среднего       if(len(graph)!=0):         history_sum+=sum(graph)         history_len+=len(graph)       #увеличиваем интервалы на сутки		       time_from += increment       time_till += increment       #если очередь не пустая, добавляем среднее значение по диску в список		       if(history_len!=0):         avg_list.append(history_sum/history_len)       else:         avg_list.append(0)     #если список не пустой, берем минимальное значение				     if(len(avg_list)>0):       sys.stdout.write(host_names[nameindex])       print ',',num_disks,',',min(avg_list)     nameindex+=1 

В результате получаем разделенные запятой имя хоста, кол-во винтов и min idle time

 DC1_--172.16.1.4--, 1 , 99.0758766296 DC2_--172.16.1.5--, 1 , 97.0989181683 LocalDB_--172.16.1.12--, 2 , 98.9930628704 

Благодарю за внимание.
ссылка на оригинал статьи https://habrahabr.ru/post/325876/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *