2 Szczegóły przetwarzania wstępnego

Przegląd

Ta sekcja zawiera szczegóły dotyczące wstępnego przetwarzania wartości pozycji. Wstępne przetwarzanie wartości pozycji umożliwia definiowanie i wykonywanie reguł transformacji dla otrzymanych wartości pozycji.

Wstępne przetwarzanie jest zarządzane przez proces menedżera wstępnego przetwarzania wraz z workerami wstępnego przetwarzania, które wykonują poszczególne kroki wstępnego przetwarzania. Wszystkie wartości z wstępnym przetwarzaniem (przed Zabbix 7.4.1, wszystkie wartości), otrzymywane od różnych zbieraczy danych, przechodzą przez menedżera wstępnego przetwarzania przed dodaniem do pamięci podręcznej historii. Do komunikacji IPC opartej na gniazdach używany jest kanał między zbieraczami danych (pollery, trappery itp.) a procesem wstępnego przetwarzania. Kroki wstępnego przetwarzania wykonuje albo serwer Zabbix, albo proxy Zabbix (dla pozycji monitorowanych przez proxy).

Przetwarzanie wartości pozycji

Aby zobrazować przepływ danych od źródła danych do bazy danych Zabbix, możemy użyć następującego uproszczonego diagramu:

Powyższy diagram pokazuje tylko procesy, obiekty i działania związane z przetwarzaniem wartości pozycji w formie uproszczonej. Diagram nie pokazuje warunkowych zmian kierunku, obsługi błędów ani pętli. Lokalna pamięć podręczna danych menedżera preprocesingu również nie jest pokazana, ponieważ nie wpływa bezpośrednio na przepływ danych. Celem tego diagramu jest pokazanie procesów biorących udział w przetwarzaniu wartości pozycji oraz sposobu, w jaki ze sobą współdziałają.

  • Zbieranie danych rozpoczyna się od surowych danych ze źródła danych. Na tym etapie dane zawierają tylko identyfikator, znacznik czasu i wartość (mogą to być również wiele wartości).
  • Niezależnie od tego, jaki typ zbieracza danych jest używany, zasada pozostaje taka sama dla sprawdzeń aktywnych lub pasywnych, pozycji trapper itp., ponieważ zmienia się jedynie format danych i inicjator komunikacji (albo zbieracz danych oczekuje na połączenie i dane, albo zbieracz danych inicjuje komunikację i żąda danych). Surowe dane są weryfikowane, konfiguracja pozycji jest pobierana z pamięci podręcznej konfiguracji (dane są wzbogacane o dane konfiguracyjne).
  • Do przekazywania danych od zbieraczy danych do menedżera preprocesingu używany jest mechanizm IPC oparty na gniazdach. Na tym etapie zbieracz danych kontynuuje zbieranie danych bez oczekiwania na odpowiedź od menedżera preprocesingu.
  • Wykonywany jest preprocesing danych. Obejmuje to wykonanie kroków preprocesingu oraz przetwarzanie pozycji zależnych.

Pozycja może zmienić swój stan na NOT SUPPORTED podczas wykonywania preprocesingu, jeśli którykolwiek z kroków preprocesingu zakończy się niepowodzeniem.

  • Dane historyczne z lokalnej pamięci podręcznej menedżera preprocesingu są opróżniane do pamięci podręcznej historii.
  • Na tym etapie przepływ danych zatrzymuje się do czasu następnej synchronizacji pamięci podręcznej historii (gdy proces history syncer wykonuje synchronizację danych).
  • Proces synchronizacji rozpoczyna się od normalizacji danych przed zapisaniem ich w bazie danych Zabbix. Normalizacja danych wykonuje konwersje do docelowego typu pozycji (typu zdefiniowanego w konfiguracji pozycji), w tym obcinanie danych tekstowych na podstawie predefiniowanych rozmiarów dozwolonych dla tych typów (HISTORY_STR_VALUE_LEN dla string, HISTORY_TEXT_VALUE_LEN dla text oraz HISTORY_LOG_VALUE_LEN dla wartości log). Po zakończeniu normalizacji dane są wysyłane do bazy danych Zabbix.

Pozycja może zmienić swój stan na NOT SUPPORTED, jeśli normalizacja danych zakończy się niepowodzeniem (na przykład, gdy wartość tekstowa nie może zostać przekonwertowana na liczbę).

  • Zebrane dane są przetwarzane - sprawdzane są wyzwalacze, konfiguracja pozycji jest aktualizowana, jeśli pozycja stanie się NOT SUPPORTED, itd.
  • Jest to uznawane za koniec przepływu danych z punktu widzenia przetwarzania wartości pozycji.

Wstępne przetwarzanie wartości pozycji

Wstępne przetwarzanie danych odbywa się w następujących krokach:

  • Jeśli pozycja nie ma ani wstępnego przetwarzania, ani pozycji zależnych, jej wartość jest albo dodawana do pamięci podręcznej historii, albo wysyłana do menedżera LLD. W przeciwnym razie wartość pozycji jest przekazywana do menedżera wstępnego przetwarzania za pomocą mechanizmu IPC opartego na gnieździe UNIX (przed Zabbix 7.4.1 wszystkie wartości były przekazywane przez menedżera wstępnego przetwarzania przed dodaniem ich do pamięci podręcznej historii lub wysłaniem do menedżera LLD).
  • Tworzone jest zadanie wstępnego przetwarzania, które zostaje dodane do kolejki, a pracownicy wstępnego przetwarzania są powiadamiani o nowym zadaniu.
  • W tym momencie przepływ danych zatrzymuje się, dopóki nie będzie co najmniej jeden wolny (tj. niewykonujący żadnych zadań) pracownik wstępnego przetwarzania.
  • Gdy pracownik wstępnego przetwarzania jest dostępny, pobiera następne zadanie z kolejki.
  • Po zakończeniu wstępnego przetwarzania (zarówno w przypadku niepowodzenia, jak i powodzenia wykonania kroków wstępnego przetwarzania) wstępnie przetworzona wartość jest dodawana do kolejki ukończonych zadań, a menedżer jest powiadamiany o nowym ukończonym zadaniu.
  • Menedżer wstępnego przetwarzania konwertuje wynik do wymaganego formatu (określonego przez typ wartości pozycji) i albo dodaje go do pamięci podręcznej historii, albo wysyła do menedżera LLD.
  • Jeśli dla przetwarzanej pozycji istnieją pozycje zależne, są one dodawane do kolejki wstępnego przetwarzania z wstępnie przetworzoną wartością pozycji nadrzędnej. Pozycje zależne są kolejkowane z pominięciem zwykłych żądań wstępnego przetwarzania wartości, ale tylko dla pozycji nadrzędnych z ustawioną wartością i niebędących w stanie NOT SUPPORTED.

Należy zauważyć, że na diagramie wstępne przetwarzanie pozycji nadrzędnej jest nieco uproszczone przez pominięcie buforowania wstępnego przetwarzania.

Kolejka przetwarzania wstępnego

Kolejka przetwarzania wstępnego jest zorganizowana następująco:

  • lista oczekujących zadań:

    • zadania utworzone bezpośrednio na podstawie żądań przetwarzania wstępnego wartości, w kolejności ich otrzymania
  • lista zadań natychmiastowych (przetwarzanych przed zadaniami oczekującymi):

    • zadania testowe (tworzone w odpowiedzi na żądania testowania pozycja/przetwarzania wstępnego przez frontend)
    • zadania zależnych pozycji
    • zadania sekwencyjne (zadania, które muszą być wykonywane w ścisłej kolejności):
      • posiadające kroki przetwarzania wstępnego wykorzystujące ostatnią wartość:
        • zmiana
        • ograniczanie
        • JavaScript (buforowanie kodu bajtowego)
      • buforowanie przetwarzania wstępnego zależnych pozycji
  • lista zakończonych zadań

Buforowanie przetwarzania wstępnego

Buforowanie przetwarzania wstępnego zostało wprowadzone w celu poprawy wydajności przetwarzania wstępnego dla wielu zależnych pozycji mających podobne kroki przetwarzania wstępnego (co jest częstym rezultatem LLD).

Buforowanie polega na przetworzeniu wstępnym jednej zależnej pozycji i ponownym wykorzystaniu części wewnętrznych danych przetwarzania wstępnego dla pozostałych zależnych pozycji. Pamięć podręczna przetwarzania wstępnego jest obsługiwana tylko dla pierwszego kroku przetwarzania wstępnego następujących typów:

  • Wzorzec Prometheus (indeksuje dane wejściowe według metryk)
  • JSONPath (parsuje dane do drzewa obiektów i indeksuje pierwsze wyrażenie [?(@.path == "value")])

Workery przetwarzania wstępnego

Plik konfiguracyjny serwera Zabbix pozwala użytkownikom ustawić liczbę wątków workerów przetwarzania wstępnego. Parametr konfiguracyjny StartPreprocessors powinien zostać użyty do ustawienia liczby wstępnie uruchamianych instancji workerów przetwarzania wstępnego, która powinna co najmniej odpowiadać liczbie dostępnych rdzeni CPU.

Jeśli zadania przetwarzania wstępnego nie są ograniczone wydajnością CPU i obejmują częste żądania sieciowe, zaleca się skonfigurowanie dodatkowych workerów. Optymalna liczba workerów przetwarzania wstępnego może zależeć od wielu czynników, w tym liczby „przetwarzalnych” pozycji (pozycji, które wymagają wykonania jakichkolwiek kroków przetwarzania wstępnego), liczby procesów zbierania danych, średniej liczby kroków przetwarzania wstępnego dla pozycji itd. Niewystarczająca liczba workerów może prowadzić do wysokiego zużycia pamięci. Informacje o rozwiązywaniu problemów z nadmiernym zużyciem pamięci w instalacji Zabbix można znaleźć w sekcji Profiling excessive memory usage with tcmalloc.

Zakładając jednak, że nie występują ciężkie operacje przetwarzania wstępnego, takie jak analizowanie dużych fragmentów XML/JSON, liczba workerów przetwarzania wstępnego może odpowiadać łącznej liczbie procesów zbierających dane. W ten sposób w większości przypadków (z wyjątkiem sytuacji, gdy dane od procesu zbierającego napływają zbiorczo) będzie dostępny co najmniej jeden nieużywany worker przetwarzania wstępnego dla zebranych danych.

Zbyt duża liczba procesów zbierania danych (pollers, unreachable pollers, ODBC pollers, HTTP pollers, Java pollers, pingers, trappers, proxypollers) wraz z IPMI manager, SNMP trapper i workerami przetwarzania wstępnego może wyczerpać limit deskryptorów plików na proces dla menedżera przetwarzania wstępnego.

Wyczerpanie limitu deskryptorów plików na proces spowoduje zatrzymanie serwera Zabbix, zwykle krótko po uruchomieniu, choć czasami może to nastąpić później. Aby uniknąć takich problemów, przejrzyj plik konfiguracyjny serwera Zabbix, aby zoptymalizować liczbę równoczesnych kontroli i procesów. Dodatkowo, w razie potrzeby upewnij się, że limit deskryptorów plików jest ustawiony wystarczająco wysoko, sprawdzając i dostosowując limity systemowe.

Potok przetwarzania wartości

Przetwarzanie wartości pozycji jest wykonywane w wielu krokach (lub fazach) przez wiele procesów. Może to powodować:

  • Zależna pozycja może otrzymywać wartości, podczas gdy wartość główna NIE może. Można to osiągnąć przy użyciu następującego przypadku użycia:
    • Główna pozycja ma typ wartości UINT (można użyć trapper item), zależna pozycja ma typ wartości TEXT.
    • Dla głównej i zależnej pozycji nie są wymagane żadne kroki preprocessing.
    • Wartość tekstowa (na przykład „abc”) powinna zostać przekazana do głównej pozycji.
    • Ponieważ nie ma kroków preprocessing do wykonania, menedżer preprocessing sprawdza, czy główna pozycja nie jest w stanie NOT SUPPORTED oraz czy wartość jest ustawiona (oba warunki są spełnione), a następnie umieszcza zależną pozycję w kolejce z tą samą wartością co główna pozycja (ponieważ nie ma kroków preprocessing).
    • Gdy zarówno główna, jak i zależna pozycja osiągną fazę synchronizacji historii, główna pozycja przechodzi w stan NOT SUPPORTED z powodu błędu konwersji wartości (dane tekstowe nie mogą zostać przekonwertowane na liczbę całkowitą bez znaku).

W rezultacie zależna pozycja otrzymuje wartość, podczas gdy główna pozycja zmienia swój stan na NOT SUPPORTED.

  • Zależna pozycja otrzymuje wartość, która nie jest obecna w historii głównej pozycji. Ten przypadek użycia jest bardzo podobny do poprzedniego, z wyjątkiem typu głównej pozycji. Na przykład, jeśli dla głównej pozycji używany jest typ CHAR, to wartość głównej pozycji zostanie obcięta w fazie synchronizacji historii, podczas gdy zależne pozycje otrzymają swoje wartości z początkowej (nieobciętej) wartości głównej pozycji.