Raccogliere dati da Zabbix agent

Panoramica

zabbix_utils consente di raccogliere dati da Zabbix agent (in modo simile a Zabbix 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 segua schemi simili. Ulteriori esempi sono disponibili nel repository GitHub zabbix_utils.

Importazione

Per utilizzare zabbix_utils per raccogliere i valori degli item, importa la classe Getter nel tuo script Python:

from zabbix_utils import Getter

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:

agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
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:

agent = Getter(
    host='192.0.2.0',
    port=10050,
    source_ip='10.10.7.1'
)
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:

agent = Getter(
    host='192.0.2.0',
    port=10050,
    timeout=30
)
Utilizzo della crittografia

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

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
)
Risposta

La risposta di Zabbix agent viene elaborata dalla libreria e restituita come oggetto AgentResponse:

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
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 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:

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