Ad Widget

Collapse

API - медленная работа метода history.get

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • ilia_abr
    Junior Member
    • Mar 2022
    • 3

    #1

    API - медленная работа метода history.get

    Коллеги, добрый день!

    Есть следующая задача. Необходимо через API Zabbix получить историю работы программ с хостов за последние 24 часа.

    Пишу скрипт на Python.
    Для этого сначала выполняю метод host.get со следующими параметрами
    Code:
    {"output": ['host'],
    "selectInterfaces": ["ip"],
    "preservekeys": "true"}
    Получаю 8386 хостов за 3.2 секунды

    Далее создаю список hosts_ids с id хостов и передаю его в метод item.get чтобы получить все элементы данных для всех хостов с параметрами
    Code:
    {"hostids": hosts_ids,
    "output": ['itemid', 'name'],
    "sortfield": "name",
    "selectHosts": "name",
    "preservekeys": "true",
    "search": { "key_": "MainKey3" }
    Получаю 126255 элементов данных за 41.4 секунды

    Далее создаю список items_ids с id элементов данных и передаю его в метод history.get чтобы получить всю историю для всех элементов данных за 24 часа с параметрами
    Code:
    {"itemids": items_ids,
    "time_from": time_from,
    "time_till": time_till,
    "output": ["itemid"]}
    На этом этапе скрипт виснет и возвращает
    HTML Code:
    504 Server Error: Gateway Time-out for url: http://0.0.0.0/api_jsonrpc.php
    даже для лимита хостов limit=75

    Возможно что-то делаю не так или есть другие пути?
  • Alex_UUU
    Senior Member
    • Dec 2018
    • 541

    #2
    Хм, интересная задача. Если не секрет зачем?
    Сразу скажу, что последнее значение вытаскивается из итеммгет.
    Что сейчас у тебя получается:
    1. 8386 хостов
    2. 126255 итемов
    3. миллионы значений.
    Кстати, второй пункт можно совместить с третьим (поиск по ключу) И первый не нужен, т.к. дубль. Но все равно упираемся в количество.
    Либо напрямую через БД, либо третий пункт выполняй в цикле по первому (второй совмести с третьим)

    Comment

    • ilia_abr
      Junior Member
      • Mar 2022
      • 3

      #3
      Originally posted by Alex_UUU
      Хм, интересная задача. Если не секрет зачем?
      Сразу скажу, что последнее значение вытаскивается из итеммгет.
      Что сейчас у тебя получается:
      1. 8386 хостов
      2. 126255 итемов
      3. миллионы значений.
      Кстати, второй пункт можно совместить с третьим (поиск по ключу) И первый не нужен, т.к. дубль. Но все равно упираемся в количество.
      Либо напрямую через БД, либо третий пункт выполняй в цикле по первому (второй совмести с третьим)
      Данные необходимо агрегировать и отображать на другой платформе.
      Напрямую через БД запросы также отваливаются по таймауту.
      либо третий пункт выполняй в цикле по первому (второй совмести с третьим)
      Можно поподробнее про этот способ?

      Comment

      • Alex_UUU
        Senior Member
        • Dec 2018
        • 541

        #4
        Originally posted by ilia_abr

        Можно поподробнее про этот способ?
        Т.к. ты получил 126000 ItemID
        то делаешь цикл
        и получаешь значения для каждого ID

        Code:
        foreach $each @items_ids
        {"itemids": $each, "time_from": time_from, "time_till": time_till, "output": ["itemid"]}

        Comment

        • ilia_abr
          Junior Member
          • Mar 2022
          • 3

          #5
          Originally posted by Alex_UUU

          Т.к. ты получил 126000 ItemID
          то делаешь цикл
          и получаешь значения для каждого ID

          Code:
          foreach $each @items_ids
          {"itemids": $each, "time_from": time_from, "time_till": time_till, "output": ["itemid"]}
          Спасибо, через цикл выполнил запрос истории для каждого элемента данных и далее парсил данные.
          Для 635 хостов время составило 29 минут.
          Получилось 416468 элементов history и 15491 элементов items.
          Получается для 8386 хостов время выполнения будет значительно дольше.
          Last edited by ilia_abr; 01-04-2022, 08:27.

          Comment

          • balduser
            Junior Member
            • Oct 2022
            • 16

            #6

            По моим наблюдениям, когда запрашиваешь последнее значение элемента данных, оно может вернуться, а может и не вернуться в ответе от item.get. Кажется, у disabled хоста в ответе lastvalue будет пустое. Поэтому, когда мне нужно получить последнее значение элемента данных по многим хостам, я сперва делаю
            Code:
            "jsonrpc": "2.0",
                "method": "item.get",
                "params": {
                    "hostids": [XXX, ..., NNN],
                    "filter": {
                        "name":"Item name"
                    }
                },
                "id": 123456,
                "auth": "{{token}}"
            , а потом, если у каких-то массивов в ответе значение lastvalue пустое, прохожусь по ним циклом и запрашиваю
            Code:
            "jsonrpc": "2.0",
                "method": "history.get",
                "params": {
                    "itemids":[9844693],
                    "history":1,
                    "sortfield":"clock",
                    "sortorder": "DESC",
                    "limit":1
                },
                "id": 123,
                "auth": "{{token}}"​
            . Самый вредный параметр здесь - это history, его надо проверять, для чисел и некоторых текстовых он другой.

            Comment

            • Alex_UUU
              Senior Member
              • Dec 2018
              • 541

              #7
              Если мне нужны только последние значения элементов данных, то я все делаю через Item.get и сразу оттуда беру.
              Но есть ограничение. Если размер возвращаемого больше (сколько то там), АПИ возвращает ошибку :-( К сожалению в АПИ нет параметров получить данные от и до.

              Comment

              Working...