Сбор данных с агента Zabbix

Обзор

zabbix_utils позволяет собирать данные с агента Zabbix (аналогично Zabbix get).

Данные можно собирать в синхронном или асинхронном режиме:

  • В синхронном режиме ваш скрипт Python запрашивает данные и ожидает их получения, прежде чем продолжить выполнение, что подходит для простых, последовательных и предсказуемых операций.
  • В асинхронном режиме скрипт запрашивает данные, не ожидая каждого ответа, что позволяет выполнять другие операции параллельно; это более эффективно для медленных запросов или больших пакетов данных.

Примеры на этой странице ориентированы на синхронный режим, хотя асинхронный режим использует похожие подходы. Дополнительные примеры доступны в репозитории GitHub zabbix_utils.

Импорт

Чтобы использовать zabbix_utils для сбора значений элементов данных, импортируйте класс Getter в ваш Python-скрипт:

from zabbix_utils import Getter

Данные запроса

Чтобы запросить значение элемента данных:

  1. Создайте экземпляр Getter, указав IP-адрес и порт вашего агента Zabbix.
  2. Вызовите метод get() у экземпляра Getter, указав ключ элемента данных, который нужно получить.

Например, чтобы запросить данные для элемента данных system.uname:

agent = Getter(host='192.0.2.1', port=10050)
response = agent.get('system.uname')
Использование IP-адреса, отличного от значения по умолчанию

Если сервер, на котором выполняется ваш скрипт, имеет несколько IP-адресов, вы можете указать source_ip, который Getter будет использовать при подключении к агенту Zabbix:

agent = Getter(
    host='192.0.2.1',
    port=10050,
    source_ip='10.10.7.1'
)
Использование тайм-аута

Вы можете задать timeout ответа для Getter, чтобы контролировать, как долго ваш скрипт должен ждать ответа от агента Zabbix, прежде чем прекратить ожидание:

agent = Getter(
    host='192.0.2.1',
    port=10050,
    timeout=30
)
Использование шифрования

Getter не включает встроенную поддержку шифрования, но вы можете добавить ее, создав обертку с использованием сторонних библиотек:

def psk_wrapper(sock, tls):
    # ...
    # Реализация обертки TLS PSK для сокета
    # ...

agent = Getter(
    host='192.0.2.1',
    port=10050,
    socket_wrapper=psk_wrapper
)
Ответ

Ответ от агента Zabbix обрабатывается библиотекой и возвращается как объект AgentResponse:

print(response)
# {
#     "error": null,
#     "raw": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64",
#     "value": "Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64"
# }

print(response.value)
# Linux zabbix_server 5.15.0-3.60.5.1.el9uek.x86_64

print(response.error)
# None
Асинхронный режим

Асинхронный режим позволяет вашему скрипту собирать значения, не дожидаясь получения каждого из них. Это может сделать ваш скрипт более эффективным, когда ему нужно собрать много значений или когда получение некоторых значений занимает много времени.

При использовании асинхронного режима есть важные отличия по сравнению с синхронным режимом:

  • Импортируйте модуль Python asyncio (сначала необходимо установить требуемые зависимости).
  • Импортируйте AsyncGetter вместо Getter.
  • Пишите код внутри функции async.
  • Используйте await при вызове метода get().

Например, чтобы собрать одно значение с использованием асинхронного режима:

# 1. Импортируйте asyncio для асинхронного режима и AsyncGetter из zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Определите основную асинхронную функцию, в которой будут выполняться все запросы данных:
async def main():
    agent = AsyncGetter(host='192.0.2.1', port=10050)

    # 3. Получите значение system.uname от агента Zabbix (нужно использовать await):
    response = await agent.get('system.uname')

    # 4. Выведите значение, возвращенное агентом Zabbix:
    print(response.value)

# 5. Запустите асинхронную функцию main() с использованием цикла событий asyncio:
asyncio.run(main())