[comment]: # ({30385a91-30385a91})
# 2 Priekšapstrādes detaļas

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

[comment]: # ({e6d564d3-67b39eda})
#### Pārskats

Šī sadaļa sniedz informāciju par vienuma vērtības pirmapstrādi. Vienuma vērtības pirmapstrāde ļauj definēt un izpildīt [transformācijas noteikumus](/manual/config/items/preprocessing) saņemtajām vienuma vērtībām.

Pirmapstrādi pārvalda pirmapstrādes pārvaldnieka process kopā ar pirmapstrādes darbiniekiem, kas veic pirmapstrādes soļus.
Visas vērtības ar pirmapstrādi (pirms Zabbix 7.4.1 — visas vērtības), kas saņemtas no dažādiem datu ievācējiem, pirms pievienošanas vēstures kešatmiņai iziet caur pirmapstrādes pārvaldnieku. Starp datu ievācējiem (aptaujātājiem, traperiem u. c.) un pirmapstrādes procesu tiek izmantota uz ligzdām balstīta IPC saziņa. Pirmapstrādes soļus veic vai nu Zabbix serveris, vai Zabbix starpniekserveris (vienumiem, ko uzrauga starpniekserveris).

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

[comment]: # ({cbc4231a-7aff5db5})
#### Vienuma vērtību apstrāde

Lai vizualizētu datu plūsmu no datu avota uz Zabbix datubāzi, varam izmantot šādu vienkāršotu diagrammu:

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

Iepriekš redzamajā diagrammā vienkāršotā veidā ir attēloti tikai tie procesi, objekti un darbības, kas saistīti ar vienuma vērtību apstrādi. Diagrammā nav parādītas nosacītas virziena maiņas, kļūdu apstrāde vai cikli. Nav parādīta arī priekšapstrādes pārvaldnieka lokālā datu kešatmiņa, jo tā tieši neietekmē datu plūsmu. Šīs diagrammas mērķis ir parādīt procesus, kas iesaistīti vienuma vērtību apstrādē, un to savstarpējo mijiedarbību.

-   Datu iegūšana sākas ar neapstrādātiem datiem no datu avota. Šajā brīdī dati satur tikai ID, laikspiedolu un vērtību (var būt arī vairākas vērtības).
-   Neatkarīgi no tā, kāda veida datu savācējs tiek izmantots, princips ir tāds pats aktīvajām vai pasīvajām pārbaudēm, trapper vienumiem u. c., jo tas maina tikai datu formātu un komunikācijas iniciatoru (vai nu datu savācējs gaida savienojumu un datus, vai arī datu savācējs iniciē komunikāciju un pieprasa datus). Neapstrādātie dati tiek validēti, vienuma konfigurācija tiek izgūta no konfigurācijas kešatmiņas (dati tiek papildināti ar konfigurācijas datiem).
-   Lai nodotu datus no datu savācējiem uz priekšapstrādes pārvaldnieku, tiek izmantots uz ligzdām balstīts IPC mehānisms. Šajā brīdī datu savācējs turpina vākt datus, negaidot atbildi no priekšapstrādes pārvaldnieka.
-   Tiek veikta datu priekšapstrāde. Tas ietver priekšapstrādes soļu izpildi un atkarīgo vienumu apstrādi.

::: noteclassic
Vienums priekšapstrādes laikā var mainīt savu stāvokli uz NOT SUPPORTED, ja kāds no priekšapstrādes soļiem neizdodas.
:::

-   Priekšapstrādes pārvaldnieka lokālajā datu kešatmiņā esošie vēstures dati tiek iztukšoti vēstures kešatmiņā.
-   Šajā brīdī datu plūsma apstājas līdz nākamajai vēstures kešatmiņas sinhronizācijai (kad history syncer process veic datu sinhronizāciju).
-   Sinhronizācijas process sākas ar datu normalizāciju pirms datu saglabāšanas Zabbix datubāzē. Datu normalizācija veic konvertēšanu uz vēlamo vienuma tipu (tipu, kas definēts vienuma konfigurācijā), tostarp teksta datu saīsināšanu, pamatojoties uz [iepriekš definētajiem izmēriem](/manual/config/items/item#text-data-limits), kas atļauti šiem tipiem (HISTORY\_STR\_VALUE\_LEN string tipam, HISTORY\_TEXT\_VALUE\_LEN text tipam un HISTORY\_LOG\_VALUE\_LEN log vērtībām). Pēc normalizācijas pabeigšanas dati tiek nosūtīti uz Zabbix datubāzi.

::: noteclassic
Vienums var mainīt savu stāvokli uz NOT SUPPORTED, ja datu normalizācija neizdodas
(piemēram, ja teksta vērtību nevar pārveidot par skaitli).
:::

-   Iegūtie dati tiek apstrādāti - tiek pārbaudīti trigeri, vienuma konfigurācija tiek atjaunināta, ja vienums kļūst par NOT SUPPORTED, u. c.
-   No vienuma vērtību apstrādes viedokļa tas tiek uzskatīts par datu plūsmas beigām.

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

[comment]: # ({312e1118-44da8577})
#### Vienuma vērtības priekšapstrāde

Datu priekšapstrāde tiek veikta šādos soļos:

-   Ja vienumam nav ne priekšapstrādes, ne atkarīgo vienumu, tā vērtība tiek vai nu pievienota vēstures kešatmiņai, vai nosūtīta LLD pārvaldniekam. Pretējā gadījumā vienuma vērtība tiek nodota priekšapstrādes pārvaldniekam, izmantojot uz UNIX socket balstītu IPC mehānismu (pirms Zabbix 7.4.1 visas vērtības tika nodotas caur priekšapstrādes pārvaldnieku pirms pievienošanas vēstures kešatmiņai vai nosūtīšanas LLD pārvaldniekam).
-   Tiek izveidots priekšapstrādes uzdevums, tas tiek pievienots rindai, un priekšapstrādes darbinieki tiek informēti par jauno uzdevumu.
-   Šajā brīdī datu plūsma apstājas, līdz ir pieejams vismaz viens neaizņemts (t. i., neveic nevienu uzdevumu) priekšapstrādes darbinieks.
-   Kad priekšapstrādes darbinieks ir pieejams, tas paņem nākamo uzdevumu no rindas.
-   Pēc priekšapstrādes pabeigšanas (gan neveiksmīgas, gan veiksmīgas priekšapstrādes soļu izpildes gadījumā) priekšapstrādātā vērtība tiek pievienota pabeigto uzdevumu rindai, un pārvaldnieks tiek informēts par jaunu pabeigtu uzdevumu.
-   Priekšapstrādes pārvaldnieks pārveido rezultātu vajadzīgajā formātā (definētā pēc vienuma vērtības tipa) un vai nu pievieno to vēstures kešatmiņai, vai nosūta LLD pārvaldniekam.
-   Ja apstrādātajam vienumam ir atkarīgie vienumi, tie tiek pievienoti priekšapstrādes rindai ar priekšapstrādāto galvenā vienuma vērtību. Atkarīgie vienumi tiek ievietoti rindā, apejot parastos vērtības priekšapstrādes pieprasījumus, bet tikai galvenajiem vienumiem ar iestatītu vērtību un neatrodoties NOT SUPPORTED stāvoklī.

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

Ņemiet vērā, ka diagrammā galvenā vienuma priekšapstrāde ir nedaudz vienkāršota, izlaižot priekšapstrādes kešatmiņošanu.

[comment]: # ({/312e1118-44da8577})

[comment]: # ({73f49808-4b6fc468})
#### Priekšapstrādes rinda

Priekšapstrādes rinda ir organizēta šādi:

*   gaidošo uzdevumu saraksts:
    *   uzdevumi, kas izveidoti tieši no vērtību priekšapstrādes pieprasījumiem to saņemšanas secībā

*   tūlītējo uzdevumu saraksts (tiek apstrādāti pirms gaidošajiem uzdevumiem):
    *   testēšanas uzdevumi (izveidoti, atbildot uz vienuma/priekšapstrādes testēšanas pieprasījumiem no lietotāja saskarnes)
    *   atkarīgo vienumu uzdevumi
    *   secības uzdevumi (uzdevumi, kas jāizpilda stingrā secībā):
        *   ar priekšapstrādes soļiem, kuros tiek izmantota pēdējā vērtība:
            *   izmaiņa
            *   ierobežošana
            *   JavaScript (baitkoda kešošana)
        *   atkarīgo vienumu priekšapstrādes kešošana

*   pabeigto uzdevumu saraksts

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

[comment]: # ({abb85873-c9d6405f})
#### Priekšapstrādes kešošana

Priekšapstrādes kešošana tika ieviesta, lai uzlabotu priekšapstrādes veiktspēju vairākiem atkarīgajiem vienumiem ar līdzīgām priekšapstrādes darbībām (tas ir bieži sastopams LLD rezultāts).

Kešošana tiek veikta, priekšapstrādājot vienu atkarīgo vienumu un atkārtoti izmantojot daļu no iekšējiem priekšapstrādes datiem pārējiem atkarīgajiem vienumiem. Priekšapstrādes kešatmiņa tiek atbalstīta tikai pirmajā šādu tipu priekšapstrādes solī:

*   Prometheus pattern (indeksē ievadi pēc metrikām)
*   JSONPath (parsē datus objektu kokā un indeksē pirmo izteiksmi `[?(@.path == "value")]`)

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

[comment]: # ({c79ec0eb-98589fcd})
#### Priekšapstrādes darbinieki

Zabbix servera konfigurācijas fails ļauj lietotājiem iestatīt priekšapstrādes darbinieku pavedienu skaitu.
Konfigurācijas parametrs [StartPreprocessors](/manual/appendix/config/zabbix_server#startpreprocessors) jāizmanto, lai iestatītu iepriekš palaisto priekšapstrādes darbinieku instanču skaitu, kam vismaz jāatbilst pieejamo CPU kodolu skaitam.

Ja priekšapstrādes uzdevumi nav saistīti ar CPU noslodzi un ietver biežus tīkla pieprasījumus, ieteicams konfigurēt papildu darbiniekus.
Optimālo priekšapstrādes darbinieku skaitu var noteikt daudzi faktori, tostarp "priekšapstrādājamo" vienumu skaits (vienumi, kuriem jāizpilda jebkādi priekšapstrādes soļi), datu ievākšanas procesu skaits, vidējais vienuma priekšapstrādes soļu skaits utt.
Nepietiekams darbinieku skaits var izraisīt lielu atmiņas patēriņu. Lai novērstu pārmērīga atmiņas patēriņa problēmas jūsu Zabbix instalācijā, skatiet [Pārmērīga atmiņas patēriņa profilēšana ar tcmalloc](/manual/installation/known_issues#profiling-excessive-memory-usage-with-tcmalloc).

Tomēr, pieņemot, ka nav smagu priekšapstrādes darbību, piemēram, lielu XML/JSON fragmentu parsēšanas, priekšapstrādes darbinieku skaits var atbilst kopējam datu ievācēju skaitam. Tādējādi lielākoties (izņemot gadījumus, kad dati no ievācēja tiek saņemti paketēs) savāktajiem datiem būs pieejams vismaz viens neizmantots priekšapstrādes darbinieks.

::: notewarning
Pārāk liels datu ievākšanas procesu skaits (aptaujātāji, nesasniedzamu resursu aptaujātāji, ODBC aptaujātāji, HTTP aptaujātāji, Java aptaujātāji, pingotāji, trapperi, starpniekserveru aptaujātāji) kopā ar IPMI pārvaldnieku, SNMP trapperi un priekšapstrādes darbiniekiem var izsmelt priekšapstrādes pārvaldniekam pieejamo failu deskriptoru limita apjomu uz procesu.
<br><br>
Ja tiek izsmelts failu deskriptoru limits uz procesu, Zabbix serveris apstāsies, parasti neilgi pēc palaišanas, taču dažkārt tas var notikt vēlāk.
Lai izvairītos no šādām problēmām, pārskatiet [Zabbix servera konfigurācijas failu](/manual/appendix/config/zabbix_server), lai optimizētu vienlaicīgo pārbaužu un procesu skaitu.
Papildus tam, ja nepieciešams, pārliecinieties, ka failu deskriptoru limits ir iestatīts pietiekami augsts, pārbaudot un pielāgojot sistēmas limitus.
:::

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

[comment]: # ({a459312a-ad691011})
##### Vērtību apstrādes konveijers

Vienuma vērtību apstrāde tiek izpildīta vairākos soļos (vai fāzēs) ar
vairāku procesu palīdzību. Tas var izraisīt:

-   Atkarīgais vienums var saņemt vērtības, kamēr GALVENĀ vērtība to nevar.
    To var panākt, izmantojot šādu lietošanas gadījumu:
    -   Galvenajam vienumam ir vērtības tips `UINT` (var izmantot trapper vienumu),
        atkarīgajam vienumam ir vērtības tips `TEXT`.
    -   Ne galvenajam, ne atkarīgajam vienumam nav nepieciešami
        priekšapstrādes soļi.
    -   Teksta vērtība (piemēram, "abc") ir jānodod galvenajam vienumam.
    -   Tā kā nav izpildāmu priekšapstrādes soļu, priekšapstrādes
        pārvaldnieks pārbauda, vai galvenais vienums nav stāvoklī NOT SUPPORTED un
        vai vērtība ir iestatīta (abi nosacījumi ir patiesi), un ievieto rindā
        atkarīgo vienumu ar tādu pašu vērtību kā galvenajam vienumam (jo nav
        priekšapstrādes soļu).
    -   Kad gan galvenais, gan atkarīgais vienums sasniedz vēstures
        sinhronizācijas fāzi, galvenais vienums kļūst par NOT SUPPORTED
        vērtības konvertēšanas kļūdas dēļ (teksta datus nevar
        konvertēt par unsigned integer).

Rezultātā atkarīgais vienums saņem vērtību, kamēr galvenais vienums maina
savu stāvokli uz NOT SUPPORTED.

-   Atkarīgais vienums saņem vērtību, kas nav atrodama galvenā vienuma
    vēsturē. Lietošanas gadījums ir ļoti līdzīgs iepriekšējam, izņemot
    galvenā vienuma tipu. Piemēram, ja galvenajam vienumam tiek izmantots
    tips `CHAR`, tad galvenā vienuma vērtība vēstures sinhronizācijas
    fāzē tiks saīsināta, kamēr atkarīgie vienumi saņems savas
    vērtības no galvenā vienuma sākotnējās (nesaīsinātās) vērtības.

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