Zbieranie danych z agenta Zabbix
Przegląd
zabbix_utils umożliwia zbieranie danych z Zabbix agent (podobnie jak Zabbix get).
Dane mogą być zbierane w trybie synchronicznym lub asynchronicznym:
- W trybie synchronicznym skrypt Python wysyła żądanie i czeka na dane przed kontynuowaniem działania, co jest odpowiednie dla prostych, sekwencyjnych i przewidywalnych operacji.
- W trybie asynchronicznym skrypt wysyła żądania bez oczekiwania na każdą odpowiedź, umożliwiając równoległe wykonywanie innych operacji; jest to bardziej wydajne w przypadku wolnych żądań lub dużych partii danych.
Przykłady na tej stronie koncentrują się na trybie synchronicznym, chociaż tryb asynchroniczny opiera się na podobnych wzorcach. Dodatkowe przykłady są dostępne w repozytorium GitHub zabbix_utils.
Import
Aby używać zabbix_utils do zbierania wartości pozycji, zaimportuj klasę Getter w swoim skrypcie Python:
from zabbix_utils import Getter
Dane żądania
Aby zażądać wartości pozycji:
- Utwórz instancję
Getter, określając adres IP i port swojego agenta Zabbix. - Wywołaj metodę
get()na instancjiGetter, określając klucz pozycji, którą chcesz pobrać.
Na przykład, aby zażądać danych dla pozycji system.uname:
agent = Getter(host='192.0.2.1', port=10050)
response = agent.get('system.uname')
Używanie niestandardowego IP
Jeśli serwer, na którym uruchamiany jest skrypt, ma wiele adresów IP, możesz określić source_ip, którego Getter ma używać podczas łączenia się z agentem Zabbix:
agent = Getter(
host='192.0.2.1',
port=10050,
source_ip='10.10.7.1'
)
Używanie timeoutu
Możesz ustawić timeout odpowiedzi dla Getter, aby kontrolować, jak długo skrypt ma czekać na odpowiedź od agent przed rezygnacją:
agent = Getter(
host='192.0.2.1',
port=10050,
timeout=30
)
Używanie szyfrowania
Getter nie zawiera wbudowanej obsługi szyfrowania, ale można ją zapewnić, tworząc wrapper z użyciem bibliotek firm trzecich:
def psk_wrapper(sock, tls):
# ...
# Implementation of TLS PSK wrapper for the socket
# ...
agent = Getter(
host='192.0.2.1',
port=10050,
socket_wrapper=psk_wrapper
)
Odpowiedź
Odpowiedź z Zabbix agent jest przetwarzana przez bibliotekę i zwracana jako obiekt 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
Tryb asynchroniczny
Tryb asynchroniczny pozwala skryptowi zbierać wartości bez czekania na nadejście każdej z nich. Może to zwiększyć wydajność skryptu, gdy musi on zebrać wiele wartości lub gdy niektóre wartości są zbierane przez dłuższy czas.
Podczas korzystania z trybu asynchronicznego występują ważne różnice w porównaniu z trybem synchronicznym:
- Zaimportuj moduł Python
asyncio(najpierw musisz zainstalować wymagane zależności). - Zaimportuj
AsyncGetterzamiastGetter. - Napisz kod wewnątrz funkcji
async. - Użyj
awaitpodczas wywoływania metodyget().
Na przykład, aby zebrać pojedynczą wartość przy użyciu trybu asynchronicznego:
# 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.1', 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())