[comment]: # aside:4

[comment]: # ({ded6a8cd-ebcec779})
# Coletar dados do agent Zabbix

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

[comment]: # ({1640c1a8-02f6ab0d})
#### Visão geral

[zabbix\_utils](https://github.com/zabbix/python-zabbix-utils/blob/main/README.md) permite coletar dados do agent Zabbix (semelhante ao [Zabbix get](/manual/concepts/get)).

Os dados podem ser coletados em modo síncrono ou assíncrono:

-   No modo síncrono, seu script Python solicita e aguarda os dados antes de continuar, o que é adequado para operações simples, sequenciais e previsíveis.
-   No modo assíncrono, o script solicita dados sem esperar por cada resposta, permitindo que outras operações prossigam em paralelo; isso é mais eficiente para solicitações lentas ou grandes lotes de dados.

Os exemplos nesta página focam no modo síncrono, embora o [modo assíncrono](#asynchronous-mode) siga padrões semelhantes.
Exemplos adicionais estão disponíveis no repositório do GitHub [zabbix_utils](https://github.com/zabbix/python-zabbix-utils/tree/main/examples).

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

[comment]: # ({d16d4df7-8b91e8b3})
#### Importação

Para usar o zabbix\_utils para coletar valores de item, importe a classe `Getter` em seu script Python:

```python
from zabbix_utils import Getter
```

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

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

Para solicitar o valor de um item:

1. Crie uma instância de `Getter`, especificando o endereço IP e a porta do seu agent Zabbix.
2. Chame o método `get()` na instância de `Getter`, especificando a chave do item que deseja recuperar.

Por exemplo, para solicitar dados do item `system.uname`:

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

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

[comment]: # ({fa98bb55-b5e0ad53})
##### Usando IP não padrão

Se o servidor que executa seu script tiver vários endereços IP, você pode especificar um `source_ip` para o `Getter` usar ao se conectar ao Zabbix agent:

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

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

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

Você pode definir um `timeout` de resposta para o `Getter` para controlar quanto tempo seu script deve aguardar por uma resposta do agent Zabbix antes de desistir:

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

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

[comment]: # ({941d766e-6a0fc829})
##### Usando criptografia

O `Getter` não inclui suporte de criptografia embutido, mas você pode fornecê-lo criando um wrapper usando bibliotecas de terceiros:

```python
def psk_wrapper(sock, tls):
    # ...
    # Implementação do wrapper TLS PSK para o socket
    # ...

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

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

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

A resposta do agent Zabbix é processada pela biblioteca e retornada como um objeto `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})
##### Modo assíncrono

O modo assíncrono permite que seu script colete valores sem esperar que cada um deles chegue.
Isso pode tornar seu script mais eficiente quando precisa coletar muitos valores ou quando alguns valores demoram para serem coletados.

Ao usar o modo assíncrono, há diferenças importantes em relação ao modo síncrono:

-   Importe o módulo `asyncio` do Python (você deve primeiro [instalar](/devel/python/install) as dependências necessárias).
-   Importe `AsyncGetter` em vez de `Getter`.
-   Escreva seu código dentro de uma função `async`.
-   Use `await` ao chamar o método `get()`.

Por exemplo, para coletar um único valor usando o modo assíncrono:

```python
# 1. Importe asyncio para o modo assíncrono e AsyncGetter de zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Defina a função principal async onde todas as solicitações de dados serão executadas:
async def main():
    agent = AsyncGetter(host='192.0.2.0', port=10050)

    # 3. Busque o valor de system.uname do agent Zabbix (deve usar await):
    response = await agent.get('system.uname')

    # 4. Imprima o valor retornado pelo agent Zabbix:
    print(response.value)

# 5. Execute a função async main() usando o event loop do asyncio:
asyncio.run(main())
```

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