Recopilar datos del agent de Zabbix

Descripción general

zabbix_utils le permite recopilar datos del agent de Zabbix (de manera similar a Zabbix 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 sigue patrones similares. Hay ejemplos adicionales disponibles en el repositorio de GitHub zabbix_utils.

Importar

Para utilizar zabbix_utils para recopilar valores de item, importe la clase Getter en su script de Python:

from zabbix_utils import Getter

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 del item system.uname:

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

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

agent = Getter(
    host='192.0.2.0',
    port=10050,
    timeout=30
)
Usando cifrado

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

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

La respuesta del agent de Zabbix es procesada por la biblioteca y devuelta como un objeto 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
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 las dependencias requeridas).
  • Importa AsyncGetter en lugar de Getter.
  • Escribe tu código dentro de una función async.
  • Usa await al llamar al método get().

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

# 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() usando el bucle de eventos de asyncio:
asyncio.run(main())