[comment]: # aside:4

[comment]: # ({ded6a8cd-ebcec779})
# Raccogliere dati da Zabbix agent

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

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

[zabbix\_utils](https://github.com/zabbix/python-zabbix-utils/blob/main/README.md) consente di raccogliere dati da Zabbix agent (in modo simile a [Zabbix get](/manual/concepts/get)).

I dati possono essere raccolti in modalità sincrona o asincrona:

-   In modalità sincrona, lo script Python richiede i dati e attende di riceverli prima di continuare, il che è adatto a operazioni semplici, sequenziali e prevedibili.
-   In modalità asincrona, lo script richiede i dati senza attendere ogni risposta, consentendo ad altre operazioni di procedere in parallelo; questo è più efficiente per richieste lente o grandi quantità di dati.

Gli esempi in questa pagina si concentrano sulla modalità sincrona, sebbene la [modalità asincrona](#asynchronous-mode) segua schemi simili.
Ulteriori esempi sono disponibili nel repository GitHub [zabbix_utils](https://github.com/zabbix/python-zabbix-utils/tree/main/examples).

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

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

Per utilizzare zabbix\_utils per raccogliere i valori degli item, importa la classe `Getter` nel tuo script Python:

```python
from zabbix_utils import Getter
```

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

[comment]: # ({9f0d96ac-7e0dc385})
#### Dati della richiesta

Per richiedere il valore di un item:

1. Creare un'istanza di `Getter`, specificando l'indirizzo IP e la porta del proprio agent Zabbix.
2. Chiamare il metodo `get()` sull'istanza `Getter`, specificando la chiave dell'item che si desidera recuperare.

Ad esempio, per richiedere i dati dell'item `system.uname`:

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

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

[comment]: # ({fa98bb55-b5e0ad53})
##### Utilizzo di un IP non predefinito

Se il server che esegue lo script dispone di più indirizzi IP, è possibile specificare un `source_ip` che il `Getter` utilizzerà durante la connessione a Zabbix agent:

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

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

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

Puoi impostare un `timeout` di risposta per `Getter` per controllare per quanto tempo il tuo script deve attendere una risposta da Zabbix agent prima di rinunciare:

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

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

[comment]: # ({941d766e-6a0fc829})
##### Utilizzo della crittografia

`Getter` non include il supporto integrato per la crittografia, ma è possibile fornirlo creando un wrapper tramite librerie di terze parti:

```python
def psk_wrapper(sock, tls):
    # ...
    # Implementazione del wrapper TLS PSK per il socket
    # ...

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

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

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

La risposta di Zabbix agent viene elaborata dalla libreria e restituita come oggetto `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})
##### Modalità asincrona

La modalità asincrona consente al tuo script di raccogliere valori senza attendere che ciascuno arrivi.
Questo può rendere il tuo script più efficiente quando deve raccogliere molti valori o quando alcuni valori richiedono molto tempo per essere raccolti.

Quando si utilizza la modalità asincrona, ci sono differenze importanti rispetto alla modalità sincrona:

-   Importa il modulo `asyncio` di Python (devi prima [installare](/devel/python/install) le dipendenze richieste).
-   Importa `AsyncGetter` invece di `Getter`.
-   Scrivi il tuo codice all'interno di una funzione `async`.
-   Usa `await` quando chiami il metodo `get()`.

Ad esempio, per raccogliere un singolo valore utilizzando la modalità asincrona:

```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})
