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:

  1. Utwórz instancję Getter, podając adres IP i port swojego agenta Zabbix.
  2. Wywołaj metodę get() na instancji Getter, 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ł asyncio języka Python (najpierw musisz zainstalować wymagane zależności).
  • Zaimportuj AsyncGetter zamiast Getter.
  • Napisz kod wewnątrz funkcji async.
  • Użyj await podczas wywoływania metody get().

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