[comment]: # ({30385a91-30385a91})
# 2 Szczegóły przetwarzania wstępnego

[comment]: # ({/30385a91-30385a91})

[comment]: # ({e20db496-67b39eda})
#### 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](/manual/config/items/preprocessing) dla otrzymanych wartości pozycji.

Wstępnym przetwarzaniem zarządza proces menedżera wstępnego przetwarzania wraz z workerami wstępnego przetwarzania, które wykonują poszczególne kroki przetwarzania.
Wszystkie wartości z wstępnym przetwarzaniem (przed Zabbix 7.0.17, wszystkie wartości), otrzymywane od różnych zbieraczy danych, przechodzą przez menedżera wstępnego przetwarzania przed
dodaniem ich 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).

[comment]: # ({/e20db496-67b39eda})

[comment]: # ({cbc4231a-7aff5db5})
#### 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:

![](../../../../../assets/en/manual/appendix/items/overall_pic.png)

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 preprocessingu również nie jest pokazana, ponieważ nie wpływa bezpośrednio na przepływ danych. Celem tego diagramu jest pokazanie procesów uczestniczących 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 aktywnych lub pasywnych kontroli, pozycji trapper itp., ponieważ zmienia się jedynie format danych i inicjator komunikacji (albo zbieracz danych czeka 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 preprocessingu używany jest mechanizm IPC oparty na gniazdach. Na tym etapie zbieracz danych kontynuuje zbieranie danych bez czekania na odpowiedź od menedżera preprocessingu.
-   Wykonywane jest preprocessowanie danych. Obejmuje to wykonanie kroków preprocessingu oraz przetwarzanie pozycji zależnych.

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

-   Dane historyczne z lokalnej pamięci podręcznej danych menedżera preprocessingu są opróżniane do pamięci podręcznej historii.
-   Na tym etapie przepływ danych zatrzymuje się do następnej synchronizacji pamięci podręcznej historii (gdy proces synchronizacji historii 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](/manual/config/items/item#text-data-limits) 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.

::: noteclassic
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.

[comment]: # ({/cbc4231a-7aff5db5})

[comment]: # ({107e489a-44da8577})
#### 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.0.17 wszystkie wartości są przekazywane przez menedżera wstępnego przetwarzania przed dodaniem ich do pamięci podręcznej historii lub wysłaniem do menedżera LLD).
-   Tworzony jest zadanie wstępnego przetwarzania, które jest dodawane 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. nie wykonują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 żądanego 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ą umieszczane w kolejce 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.

![](../../../assets/en/diagrams/value_preprocessing.png){width="600"}

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

[comment]: # ({/107e489a-44da8577})

[comment]: # ({73f49808-4b6fc468})
#### 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ń

[comment]: # ({/73f49808-4b6fc468})

[comment]: # ({abb85873-c9d6405f})
#### 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")]`)

[comment]: # ({/abb85873-c9d6405f})

[comment]: # ({c79ec0eb-98589fcd})
#### Procesy robocze przetwarzania wstępnego

Plik konfiguracyjny serwera Zabbix umożliwia użytkownikom ustawienie liczby wątków roboczych przetwarzania wstępnego.
Parametr konfiguracyjny [StartPreprocessors](/manual/appendix/config/zabbix_server#startpreprocessors) należy wykorzystać do ustawienia liczby uruchomionych wcześniej instancji procesów roboczych przetwarzania wstępnego, która powinna co najmniej odpowiadać liczbie dostępnych rdzeni CPU.

Jeśli zadania przetwarzania wstępnego nie są ograniczane przez CPU i obejmują częste żądania sieciowe, zaleca się skonfigurowanie dodatkowych procesów roboczych.
Optymalna liczba procesów roboczych przetwarzania wstępnego może zależeć od wielu czynników, w tym od liczby "przetwarzalnych" pozycji (pozycji wymagających wykonania jakichkolwiek kroków przetwarzania wstępnego), liczby procesów zbierających dane, średniej liczby kroków przetwarzania wstępnego dla pozycji itd.
Niewystarczająca liczba procesów roboczych może prowadzić do wysokiego użycia pamięci. W celu rozwiązywania problemów z nadmiernym użyciem pamięci w instalacji Zabbix, zobacz [Profiling excessive memory usage with tcmalloc](/manual/installation/known_issues#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 procesów roboczych przetwarzania wstępnego może odpowiadać łącznej liczbie procesów zbierających dane. W ten sposób zazwyczaj (z wyjątkiem przypadków, gdy dane od zbierającego są przekazywane zbiorczo) co najmniej jeden proces roboczy przetwarzania wstępnego będzie dostępny dla zebranych danych.

::: notewarning
Zbyt duża liczba procesów zbierających dane (pollers, unreachable pollers, ODBC pollers, HTTP pollers, Java pollers, pingers, trappers, proxypollers) wraz z menedżerem IPMI, trapperem SNMP i procesami roboczymi przetwarzania wstępnego może wyczerpać limit deskryptorów plików na proces dla menedżera przetwarzania wstępnego.
<br><br>
Wyczerpanie limitu deskryptorów plików na proces spowoduje zatrzymanie serwera Zabbix, zwykle krótko po uruchomieniu, ale czasami po dłuższym czasie.
Aby uniknąć takich problemów, przejrzyj [plik konfiguracyjny serwera Zabbix](/manual/appendix/config/zabbix_server), aby zoptymalizować liczbę jednoczesnych 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.
:::

[comment]: # ({/c79ec0eb-98589fcd})

[comment]: # ({a459312a-ad691011})
##### 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.

[comment]: # ({/a459312a-ad691011})
