Сбор данных с агента Zabbix
Обзор
zabbix_utils позволяет собирать данные с агента Zabbix (аналогично Zabbix get).
Данные можно собирать в синхронном или асинхронном режиме:
- В синхронном режиме ваш скрипт Python запрашивает данные и ожидает их получения, прежде чем продолжить выполнение, что подходит для простых, последовательных и предсказуемых операций.
- В асинхронном режиме скрипт запрашивает данные, не ожидая каждого ответа, что позволяет выполнять другие операции параллельно; это более эффективно для медленных запросов или больших пакетов данных.
Примеры на этой странице ориентированы на синхронный режим, хотя асинхронный режим использует похожие подходы. Дополнительные примеры доступны в репозитории GitHub zabbix_utils.
Импорт
Чтобы использовать zabbix_utils для сбора значений элементов данных, импортируйте класс Getter в ваш Python-скрипт:
from zabbix_utils import Getter
Данные запроса
Чтобы запросить значение элемента данных:
- Создайте экземпляр
Getter, указав IP-адрес и порт вашего агента Zabbix. - Вызовите метод
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())