[comment]: # aside:4

[comment]: # ({ded6a8cd-ebcec779})
# Сбор данных с агента Zabbix

[comment]: # ({/ded6a8cd-ebcec779})

[comment]: # ({1640c1a8-02f6ab0d})
#### Обзор

[zabbix\_utils](https://github.com/zabbix/python-zabbix-utils/blob/main/README.md) позволяет собирать данные с агента Zabbix (аналогично [Zabbix get](/manual/concepts/get)).

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

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

Примеры на этой странице ориентированы на синхронный режим, хотя [асинхронный режим](#asynchronous-mode) использует похожие подходы.
Дополнительные примеры доступны в репозитории GitHub [zabbix_utils](https://github.com/zabbix/python-zabbix-utils/tree/main/examples).

[comment]: # ({/1640c1a8-02f6ab0d})

[comment]: # ({d16d4df7-8b91e8b3})
#### Импорт

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

```python
from zabbix_utils import Getter
```

[comment]: # ({/d16d4df7-8b91e8b3})

[comment]: # ({fc153113-7e0dc385})
#### Данные запроса

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

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

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

```python
agent = Getter(host='192.0.2.1', port=10050)
response = agent.get('system.uname')
```

[comment]: # ({/fc153113-7e0dc385})

[comment]: # ({2551b53a-b5e0ad53})
##### Использование IP-адреса, отличного от значения по умолчанию

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

```python
agent = Getter(
    host='192.0.2.1',
    port=10050,
    source_ip='10.10.7.1'
)
```

[comment]: # ({/2551b53a-b5e0ad53})

[comment]: # ({e0779036-6bc440d9})
##### Использование тайм-аута

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

```python
agent = Getter(
    host='192.0.2.1',
    port=10050,
    timeout=30
)
```

[comment]: # ({/e0779036-6bc440d9})

[comment]: # ({bd31e71c-6a0fc829})
##### Использование шифрования

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

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

agent = Getter(
    host='192.0.2.1',
    port=10050,
    socket_wrapper=psk_wrapper
)
```

[comment]: # ({/bd31e71c-6a0fc829})

[comment]: # ({4eff4d20-9556e19b})
##### Ответ

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

```python
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
```

[comment]: # ({/4eff4d20-9556e19b})

[comment]: # ({ab16eafa-abc52038})
##### Асинхронный режим

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

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

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

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

```python
# 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())
```

[comment]: # ({/ab16eafa-abc52038})
