Coletar dados do agent Zabbix
Visão geral
zabbix_utils permite coletar dados do agent do Zabbix (semelhante ao Zabbix get).
Os dados podem ser coletados em modo síncrono ou assíncrono:
- No modo síncrono, seu script Python solicita e aguarda os dados antes de continuar, o que é adequado para operações simples, sequenciais e previsíveis.
- No modo assíncrono, o script solicita dados sem esperar por cada resposta, permitindo que outras operações prossigam em paralelo; isso é mais eficiente para solicitações lentas ou grandes lotes de dados.
Os exemplos nesta página focam no modo síncrono, embora o modo assíncrono siga padrões semelhantes. Exemplos adicionais estão disponíveis no repositório do GitHub zabbix_utils.
Importação
Para usar o zabbix_utils para coletar valores de item, importe a classe Getter em seu script Python:
from zabbix_utils import Getter
Solicitar dados
Para solicitar o valor de um item:
- Crie uma instância de
Getter, especificando o endereço IP e a porta do seu agent Zabbix. - Chame o método
get()na instância deGetter, especificando a chave do item que você deseja recuperar.
Por exemplo, para solicitar dados para o item system.uname:
agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
Usando IP não padrão
Se o servidor que executa seu script tiver vários endereços IP, você pode especificar um source_ip para o Getter usar ao se conectar ao agent do Zabbix:
agent = Getter(
host='192.0.2.0',
port=10050,
source_ip='10.10.7.1'
)
Usando timeout
Você pode definir um timeout de resposta para o Getter para controlar quanto tempo seu script deve aguardar por uma resposta do agent Zabbix antes de desistir:
agent = Getter(
host='192.0.2.0',
port=10050,
timeout=30
)
Usando criptografia
O Getter não inclui suporte de criptografia embutido, mas você pode fornecê-lo criando um wrapper usando bibliotecas de terceiros:
def psk_wrapper(sock, tls):
# ...
# Implementação do wrapper TLS PSK para o socket
# ...
agent = Getter(
host='192.0.2.0',
port=10050,
socket_wrapper=psk_wrapper
)
Resposta
A resposta do agent Zabbix é processada pela biblioteca e retornada como um 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 assíncrono
O modo assíncrono permite que seu script colete valores sem esperar que cada um deles chegue. Isso pode tornar seu script mais eficiente quando precisa coletar muitos valores ou quando alguns valores demoram para serem coletados.
Ao usar o modo assíncrono, há diferenças importantes em relação ao modo síncrono:
- Importe o módulo
asynciodo Python (você deve primeiro instalar as dependências necessárias). - Importe
AsyncGetterem vez deGetter. - Escreva seu código dentro de uma função
async. - Use
awaitao chamar o métodoget().
Por exemplo, para coletar um único valor usando o modo assíncrono:
# 1. Importe asyncio para o modo assíncrono e AsyncGetter de zabbix_utils:
import asyncio
from zabbix_utils import AsyncGetter
# 2. Defina a função principal async onde todas as requisições de dados serão executadas:
async def main():
agent = AsyncGetter(host='192.0.2.0', port=10050)
# 3. Busque o valor de system.uname do agent Zabbix (deve usar await):
response = await agent.get('system.uname')
# 4. Imprima o valor retornado pelo agent Zabbix:
print(response.value)
# 5. Execute a função async main() usando o event loop do asyncio:
asyncio.run(main())