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 usar 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:
- Cree una instancia de
Getter, especificando la dirección IP y el puerto de su agent de Zabbix. - Llame al método
get()en la instancia deGetter, especificando la clave del item que desea recuperar.
Por ejemplo, para solicitar datos para el 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
asynciode Python (primero debes instalar las dependencias requeridas). - Importa
AsyncGetteren lugar deGetter. - Escribe tu código dentro de una función
async. - Usa
awaital llamar al métodoget().
Por ejemplo, para recopilar un solo valor utilizando 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())