Сбор данных с помощью агента 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.0', port=10050)
response = agent.get('system.uname')
Использование нестандартного IP-адреса

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

agent = Getter(
    host='192.0.2.0',
    port=10050,
    source_ip='10.10.7.1'
)
Использование timeout

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

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

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

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

agent = Getter(
    host='192.0.2.0',
    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 (сначала необходимо install требуемые зависимости).
  • Импортируйте AsyncGetter вместо Getter.
  • Пишите код внутри функции async.
  • Используйте await при вызове метода get().

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

# 1. Import asyncio for asynchronous mode, and AsyncGetter from zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Define the main async function where all data requests will be executed:
async def main():
    agent = AsyncGetter(host='192.0.2.0', port=10050)

    # 3. Fetch the system.uname value from Zabbix agent (must await):
    response = await agent.get('system.uname')

    # 4. Print the value returned by Zabbix agent:
    print(response.value)

# 5. Run the async main() function using asyncio's event loop:
asyncio.run(main())