[comment]: # aside:4

[comment]: # ({ded6a8cd-ebcec779})
# Recopilar datos del agent de Zabbix

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

[comment]: # ({1640c1a8-02f6ab0d})
#### Descripción general

[zabbix\_utils](https://github.com/zabbix/python-zabbix-utils/blob/main/README.md) le permite recopilar datos del agent de Zabbix (de manera similar a [Zabbix get](/manual/concepts/get)).

Los datos se pueden recopilar en modo síncrono o asíncrono:

-   En modo síncrono, su script de Python solicita y espera los datos antes de continuar, lo que es adecuado para operaciones simples, secuenciales y predecibles.
-   En modo asíncrono, el script solicita datos sin esperar cada respuesta, lo que permite que otras operaciones continúen en paralelo; esto es más eficiente para solicitudes lentas o grandes lotes de datos.

Los ejemplos de esta página se centran en el modo síncrono, aunque el [modo asíncrono](#asynchronous-mode) sigue patrones similares.
Hay ejemplos adicionales disponibles en el repositorio de GitHub [zabbix_utils](https://github.com/zabbix/python-zabbix-utils/tree/main/examples).

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

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

Para usar zabbix\_utils para recopilar valores de item, importe la clase `Getter` en su script de Python:

```python
from zabbix_utils import Getter
```

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

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

Para solicitar el valor de un item:

1. Cree una instancia de `Getter`, especificando la dirección IP y el puerto de su agent de Zabbix.
2. Llame al método `get()` en la instancia de `Getter`, especificando la clave del item que desea recuperar.

Por ejemplo, para solicitar datos para el item `system.uname`:

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

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

[comment]: # ({fa98bb55-b5e0ad53})
##### Usar una IP no predeterminada

Si el servidor que ejecuta su script tiene varias direcciones IP, puede especificar una `source_ip` para que el `Getter` la utilice al conectarse al agent de Zabbix:

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

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

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

Puede establecer un `timeout` de respuesta para el `Getter` para controlar cuánto tiempo debe esperar su script una respuesta del agent de Zabbix antes de rendirse:

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

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

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

`Getter` no incluye soporte de cifrado incorporado, pero puede proporcionarlo creando un wrapper usando librerías de terceros:

```python
def psk_wrapper(sock, tls):
    # ...
    # Implementación del wrapper TLS PSK para el socket
    # ...

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

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

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

La respuesta del agent de Zabbix es procesada por la biblioteca y devuelta como un 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 asíncrono

El modo asíncrono permite que tu script recopile valores sin esperar a que llegue cada uno.
Esto puede hacer que tu script sea más eficiente cuando necesita recopilar muchos valores o cuando algunos valores tardan mucho en recopilarse.

Al utilizar el modo asíncrono, existen diferencias importantes en comparación con el modo síncrono:

-   Importa el módulo `asyncio` de Python (primero debes [instalar](/devel/python/install) las dependencias requeridas).
-   Importa `AsyncGetter` en lugar de `Getter`.
-   Escribe tu código dentro de una función `async`.
-   Utiliza `await` al llamar al método `get()`.

Por ejemplo, para recopilar un solo valor utilizando el modo asíncrono:

```python
# 1. Importa asyncio para el modo asíncrono y AsyncGetter desde zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Define la función principal async donde se ejecutarán todas las solicitudes de datos:
async def main():
    agent = AsyncGetter(host='192.0.2.0', port=10050)

    # 3. Obtén el valor de system.uname desde el agent de Zabbix (debes usar await):
    response = await agent.get('system.uname')

    # 4. Imprime el valor devuelto por el agent de Zabbix:
    print(response.value)

# 5. Ejecuta la función async main() utilizando el event loop de asyncio:
asyncio.run(main())
```

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