[comment]: # translation:outdated

[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]: # ({fc153113-7e0dc385})
#### Dati della richiesta

Per richiedere il valore di un item:

1. Creare un'istanza `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.1', port=10050)
response = agent.get('system.uname')
```

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

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

Se il server su cui viene eseguito lo script ha più indirizzi IP, puoi specificare un `source_ip` da usare per `Getter` quando si connette all'agent Zabbix:

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

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

[comment]: # ({e0779036-6bc440d9})
##### Uso del timeout

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

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

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

[comment]: # ({bd31e71c-6a0fc829})
##### Uso della crittografia

`Getter` non include il supporto integrato per la crittografia, ma è possibile aggiungerlo 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.1',
    port=10050,
    socket_wrapper=psk_wrapper
)
```

[comment]: # ({/bd31e71c-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]: # ({ab16eafa-abc52038})
##### Modalità asincrona

La modalità asincrona consente allo script di raccogliere valori senza attendere l'arrivo di ciascuno di essi.
Questo può rendere lo script più efficiente quando deve raccogliere molti valori o quando alcuni valori richiedono molto tempo per essere raccolti.

Quando si usa 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 codice all'interno di una funzione `async`.
-   Usa `await` quando chiami il metodo `get()`.

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

```python
# 1. Importa asyncio per la modalità asincrona e AsyncGetter da zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter

# 2. Definisci la funzione principale async in cui verranno eseguite tutte le richieste di dati:
async def main():
    agent = AsyncGetter(host='192.0.2.1', port=10050)

    # 3. Recupera il valore system.uname da agent Zabbix (deve essere preceduto da await):
    response = await agent.get('system.uname')

    # 4. Stampa il valore restituito da agent Zabbix:
    print(response.value)

# 5. Esegui la funzione main() asincrona usando il loop di eventi di asyncio:
asyncio.run(main())
```

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