ZabbixAPI, извлечение информации из определенного поля в каждом хосте - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу получить процент дискового пространства, оставшегося для конкретного диска X: со всех хостов в определенной группе хостов.Я пытался работать с функцией item.get (), но это вернуло пустой список.

zapi = ZabbixApi (сервер)

for t in zapi.item.get(groups = 'Type1',filter = {'name': 'Free Disk Space on X'},)

Этот метод ^^используя метод item.get.Дает мне пустой список

Я пытался использовать метод history.get, но время его истекло

for t in groups:
  t2 += zapi.history.get(filter = {'name':'free Disk Space on E:(percentage)'},)

У кого-нибудь есть опыт работы с Zabbix Api, чтобы посоветовать мне, что я делаю неправильно?

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Отредактировано после получения более подробной информации о запросе, см. Комментарии.

Чтобы избежать тайм-аутов php, вам следует разделить ваши запросы и использовать time_from / time_till, как предложил Ян.

При использовании обнаруженных элементовимя элемента, полученное с помощью API, не будет расширять макросы, о нем есть запрос функции.

Например, если вы используете Обнаружение файловой системы Windows и на вашем сервере установлены диски C: и D: в Zabbix у вас будетдва элемента с одинаковым именем ("Free disk space on $1 (percentage)"), в то время как обнаруженный диск будет находиться в поле key_ каждого элемента, например:

vfs.fs.size[C:,pfree]
vfs.fs.size[D:,pfree]

Итак, вам нужно будет вызвать элемент getAPI-фильтрация по универсальному имени ($1), а затем получение значений истории только в том случае, если key_ содержит имя целевого диска

Я обновил образец сценария с помощью фильтра группы узлов и более подробных переменныхи вывод: отредактируйте любое ненужное поле, чтобы упростить вывод, который вам необходим.

from zabbix.api import ZabbixAPI
import re
import time
import datetime

zapi = ZabbixAPI(url=zabbixServer, user=zabbixUser, password=zabbixPass)

# Static filters, implement argparse if needed
itemFilter = {  "name" : "Free disk space on $1 (percentage)"  }
hostgroupFilter = { "name": "Some HostGroup" }
keyFilter = "C\:"

# args.f and args.t supplied from cmd line - see argparse
fromTimestamp = time.mktime(datetime.datetime.strptime(args.f, "%d/%m/%Y %H:%M").timetuple())
tillTimestamp = time.mktime(datetime.datetime.strptime(args.t, "%d/%m/%Y %H:%M").timetuple())


# Get only the host of the specified hostgroup
hostGroup = zapi.hostgroup.get(filter=hostgroupFilter,output='extend')
hosts =  zapi.host.get(groupids=hostGroup[0]['groupid'],output='extend')

for host in hosts:
    items = zapi.item.get(filter=itemFilter, host=host['host'], output='extend' )

    for item in items:
        # Check if the item key contains the target object (in your example, if in contains C:)
        if re.search(keyFilter, item['key_']):

            values = zapi.history.get(itemids=item['itemid'], time_from=fromTimestamp, time_till=tillTimestamp, history=item['value_type'])
            for historyValue in values:
                currentDate = datetime.datetime.fromtimestamp(int(historyValue['clock'])).strftime('%d/%m/%Y %H:%M:%S')
                print "{}:{}({}) - {} {} Value: {}".format(
                  host['host'],
                  item['name'],
                  item['key_'],
                  historyValue['clock'],
                  currentDate, historyValue['value'])

Пример вывода за 5 минут, группа узлов с 3 победамиСервер Dows

SRV01:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128853 28/09/2018 12:00:53 Value: 63.3960
SRV01:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128914 28/09/2018 12:01:54 Value: 63.3960
SRV01:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128974 28/09/2018 12:02:54 Value: 63.3960
SRV01:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538129034 28/09/2018 12:03:54 Value: 63.3960
SRV01:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538129094 28/09/2018 12:04:54 Value: 63.3960
SRV02:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128824 28/09/2018 12:00:24 Value: 52.2341
SRV02:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128885 28/09/2018 12:01:25 Value: 52.2341
SRV02:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128944 28/09/2018 12:02:24 Value: 52.2341
SRV02:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538129004 28/09/2018 12:03:24 Value: 52.2341
SRV02:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538129065 28/09/2018 12:04:25 Value: 52.2341
SRV03:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128828 28/09/2018 12:00:28 Value: 33.2409
SRV03:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128888 28/09/2018 12:01:28 Value: 33.2409
SRV03:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538128947 28/09/2018 12:02:27 Value: 33.2409
SRV03:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538129008 28/09/2018 12:03:28 Value: 33.2409
SRV03:Free disk space on $1 (percentage)(vfs.fs.size[C:,pfree]) - 1538129069 28/09/2018 12:04:29 Value: 33.2409
0 голосов
/ 27 сентября 2018

Вы пытаетесь получить полную историю (без ограничения времени) с помощью history.get() - это может быть много точек данных, которые должны быть предварительно обработаны API.Это действительно не очень хорошая идея, потому что вы можете достичь некоторых ограничений PHP / API - времени или памяти - это ваш текущий случай.

Используйте параметры time_from/time_till для ограничения диапазона времени history.get().Смотрите документ: https://www.zabbix.com/documentation/3.4/manual/api/reference/history/get

...