[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]: # ({9f0d96ac-7e0dc385})
#### Данные запроса

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

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

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

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

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

[comment]: # ({fa98bb55-b5e0ad53})
##### Использование нестандартного IP-адреса

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

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

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

[comment]: # ({edfacd5a-6bc440d9})
##### Использование timeout

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

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

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

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

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

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

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

[comment]: # ({/941d766e-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]: # ({1d08bd49-abc52038})
##### Асинхронный режим

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

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

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

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

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

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