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, podając adres IP i port swojego agenta Zabbix. - Wywołaj metodę
get()na instancjiGetter, podając klucz pozycji, którą chcesz pobrać.
Na przykład, aby zażądać danych dla pozycji system.uname:
agent = Getter(host='192.0.2.0', port=10050)
response = agent.get('system.uname')
Używanie niestandardowego adresu IP
Jeśli serwer uruchamiający skrypt ma wiele adresów IP, możesz określić source_ip, którego Getter ma używać podczas łączenia się z Zabbix agent:
agent = Getter(
host='192.0.2.0',
port=10050,
source_ip='10.10.7.1'
)
Używanie timeout
Możesz ustawić timeout odpowiedzi dla Getter, aby kontrolować, jak długo skrypt powinien czekać na odpowiedź od agent Zabbix, zanim zrezygnuje:
agent = Getter(
host='192.0.2.0',
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 zewnętrznych:
def psk_wrapper(sock, tls):
# ...
# Implementacja wrappera TLS PSK dla gniazda
# ...
agent = Getter(
host='192.0.2.0',
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 oczekiwania na nadejście każdej z nich. Może to zwiększyć wydajność skryptu, gdy musi on zebrać wiele wartości lub gdy zebranie niektórych wartości zajmuje dużo czasu.
Podczas korzystania z trybu asynchronicznego występują istotne różnice w porównaniu z trybem synchronicznym:
- Zaimportuj moduł
asynciojęzyka Python (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 pobrać 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.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())