[comment]: # ({4990465d-38402763})
# 12 Détails du prétraitement de la valeur de l'élément

[comment]: # ({/4990465d-38402763})

[comment]: # ({d8f3b36d-fc2af0ae})
#### Aperçu

Le pré-traitement des valeurs d’élément permet de définir et d’exécuter
des [règles de
transformation](/fr/manual/config/items/item#item_value_preprocessing)
pour les valeurs d’élément reçues.

Le pré-traitement est géré par un processus gestionnaire de
pré-traitement, ajouté dans Zabbix 3.4, ainsi que par des agents de
pré-traitement exécutant les étapes de pré-traitement. Toutes les
valeurs (avec ou sans pré-traitement) de différents collecteurs de
données transitent par le gestionnaire de pré-traitement avant d'être
ajoutées au cache d'historique. La communication IPC basée sur les
sockets est utilisée entre les collecteurs de données (pollers,
trappers, etc.) et le processus de pré-traitement. Seul le serveur
Zabbix exécute des étapes de pré-traitement.

[comment]: # ({/d8f3b36d-fc2af0ae})

[comment]: # ({21022591-d3af554b})
#### Traitement de la valeur de l'élément

Pour visualiser le flux de données de la source de données à la base de
données Zabbix, nous pouvons utiliser le diagramme simplifié suivant :

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

Le diagramme ci-dessus montre uniquement les processus, les objets et
les actions liés au traitement de la valeur d'un élément sous une forme
simplifiée. Le diagramme ne montre pas les changements de direction
conditionnels, la gestion des erreurs ou les boucles. Le cache de
données local du gestionnaire de pré-traitement ne s'affiche pas non
plus, car il n'affecte pas directement le flux de données. Le but de ce
diagramme est de montrer les processus impliqués dans le traitement des
valeurs d’éléments et leur interaction.

-   La collecte de données commence par les données brutes d'une source
    de données. À ce stade, les données ne contiennent que l'ID,
    l'horodatage et la valeur (peuvent également contenir plusieurs
    valeurs).
-   Quel que soit le type de collecteur de données utilisé, l’idée est
    la même pour les vérifications actives ou passives, pour les
    éléments trappers, etc., dans la mesure où cela ne change que le
    format des données et l'initiation de la communication (le
    collecteur de données attend une connexion et des données, ou le
    collecteur de données initie la communication et demande les
    données). Les données brutes sont validées, la configuration des
    éléments est extraite du cache de configuration (les données sont
    enrichies avec les données de configuration).
-   Le mécanisme IPC basé sur le socket est utilisé pour transférer les
    données des collecteurs de données au gestionnaire de
    pré-traitement. À ce stade, le collecteur de données continue de
    collecter des données sans attendre la réponse du gestionnaire de
    pré-traitement.
-   Le pré-traitement des données est effectué. Cela inclut l'exécution
    des étapes de pré-traitement et du traitement des éléments
    dépendants.

::: noteclassic
L'élément peut changer son état en NON SUPPORTÉ lors du
pré-traitement si l'une des étapes du pré-traitement
échoue.
:::

-   Les données d'historique du cache de données local du gestionnaire
    de pré-traitement sont vidées dans le cache d'historique.
-   À ce stade, le flux de données s'arrête jusqu'à la synchronisation
    suivante du cache d'historique (lorsque le processus synchronisation
    d'historique effectue la synchronisation des données).
-   Le processus de synchronisation commence par la normalisation des
    données qui les stocke dans la base de données Zabbix. La
    normalisation des données effectue des conversions vers le type
    d'élément souhaité (type défini dans la configuration d'élément), y
    compris la troncature des données textuelles en fonction des tailles
    prédéfinies autorisées pour ces types (HISTORY\_STR\_VALUE\_LEN pour
    la chaîne, HISTORY\_TEXT\_VALUE\_LEN pour le texte et
    HISTORY\_LOG\_VALUE\_LEN pour les valeurs de journal). Les données
    sont envoyées à la base de données Zabbix après la normalisation.

::: noteclassic
L'élément peut changer son état en NON SUPPORTÉ si la
normalisation des données échoue (par exemple, lorsque la valeur
textuelle ne peut pas être convertie en nombre).
:::

-   Les données collectées sont en cours de traitement - les
    déclencheurs sont vérifiés, la configuration de l'élément est mise à
    jour si l'élément devient NON SUPPORTÉ, etc.
-   Ceci est considéré comme la fin du flux de données du point de vue
    du traitement de la valeur de l'élément.

[comment]: # ({/21022591-d3af554b})

[comment]: # ({60ba6a98-fd7cc57a})
#### Prétraitement de la valeur d'élément

Pour visualiser le processus de pré-traitement des données, nous pouvons
utiliser le schéma simplifié suivant :

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

Le diagramme ci-dessus montre uniquement les processus, les objets et
les actions principales liés au pré-traitement des valeurs d’élément
sous une forme simplifiée. Le diagramme ne montre pas les changements de
direction conditionnels, la gestion des erreurs ou les boucles. Ce
diagramme ne présente qu'un seul agent de traitement (plusieurs agents
de traitement peuvent être utilisés dans des scénarios réels), une seule
valeur d'élément est en cours de traitement et nous supposons que cet
élément nécessite l'exécution d'au moins une étape de pré-traitement. Le
but de ce diagramme est de montrer l’idée derrière le pipeline de
pré-traitement des valeurs d’élément.

-   Les données et la valeur d'élément sont transmises au gestionnaire
    de pré-traitement à l'aide du mécanisme IPC basé sur le socket.
-   L'élément est placé dans la file d'attente de pré-traitement.

::: noteclassic
L'élément peut être placé à la fin ou au début de la file
d'attente de pré-traitement. Les éléments internes de Zabbix sont
toujours placés au début de la file d'attente de pré-traitement, tandis
que les autres types d'éléments sont mis en file d'attente à la
fin.
:::

-   À ce stade, le flux de données s’arrête jusqu’à ce qu’il y ait au
    moins un worker de pré-traitement inoccupé (qui n’exécute aucune
    tâche).
-   Lorsqu'un agent de pré-traitement est disponible, une tâche de
    pré-traitement lui est envoyée.
-   Une fois le pré-traitement terminé (exécution réussie des étapes de
    pré-traitement), la valeur pré-traitée est renvoyée au gestionnaire
    de pré-traitement.
-   Le gestionnaire de pré-traitement convertit le résultat au format
    souhaité (défini par le type de valeur de l’élément) et place les
    résultats en file d’attente de pré-traitement. S'il existe des
    éléments dépendants pour l'élément en cours, ceux-ci sont également
    ajoutés à la file d'attente de pré-traitement. Les éléments
    dépendants sont mis en file d'attente dans la file d'attente de
    pré-traitement juste après l'élément principal, mais uniquement pour
    les éléments principaux avec une valeur définie et non dans l'état
    NON SUPPORTÉ.

[comment]: # ({/60ba6a98-fd7cc57a})

[comment]: # ({0325bbc6-7e520cbc})
##### Pipeline de traitement de la valeur

Le traitement de la valeur d'élément est exécuté en plusieurs étapes (ou
phases) par plusieurs processus. Cela peut causer :

-   L'élément dépendant peut recevoir des valeurs, alors que LA valeur
    principale ne le peut pas. Ceci peut être réalisé en utilisant le
    cas d'utilisation suivant :

```{=html}
<!-- -->
```
       * L'élément principal a le type de valeur ''UINT'' (l'élément trapper peut être utilisé), l'élément dépendant a le type de valeur ''TEXT''.
       * Aucune étape de pré-traitement n'est requise pour les éléments principaux et dépendants.
       * La valeur textuelle (comme "abc") doit être transmise à l'élément principal.
       * Comme il n’y a pas d’étapes de pré-traitement à exécuter, le gestionnaire de pré-traitement vérifie si l’élément principal n’est pas à l’état NON SUPPORTÉ et si la valeur est définie (les deux sont vrais) et place en file d'attente l’élément dépendant ayant la même valeur que l’élément principal (en l’absence d’étapes de pré-traitement).
       * Lorsque les éléments principaux et dépendants atteignent tous les deux la phase de synchronisation d'historique, l'élément principal devient NON SUPPORTÉ, en raison de l'erreur de conversion de valeur (les données textuelles ne peuvent pas être converties en un entier non signé).

Par conséquent, l'élément dépendant reçoit une valeur, tandis que
l'élément principal change son état en NON SUPPORTÉ.

-   L'élément dépendant reçoit une valeur qui n'est pas présente dans
    l'historique de l'élément principal. Le cas d'utilisation est très
    similaire au précédent, à l'exception du type de l'élément
    principal. Par exemple, si le type `CHAR` est utilisé pour un
    élément principal, la valeur de cet élément sera tronquée à la phase
    de synchronisation d'historique, tandis que les éléments dépendants
    recevront leur valeur de la valeur initiale (non tronquée) de
    l'élément principal.

[comment]: # ({/0325bbc6-7e520cbc})

[comment]: # ({bb0653fe-554cfc45})
#### File d'attente de pré-traitement

La file d'attente de pré-traitement est une structure de données FIFO
qui stocke les valeurs en préservant l'ordre dans lequel les valeurs
sont visualisées par le gestionnaire de pré-traitement. Il y a plusieurs
exceptions à la logique FIFO :

-   Les éléments internes sont mis en file d'attente au début de la file
    d'attente.
-   Les éléments dépendants sont toujours mis en file d'attente après
    l'élément principal

Pour visualiser la logique de la file d'attente de pré-traitement, nous
pouvons utiliser le diagramme suivant :

![](../../../../assets/en/manual/appendix/items/queue_processing.gif)

Les valeurs de la file d'attente de pré-traitement sont vidées du début
à la première valeur non traitée. Ainsi, par exemple, le gestionnaire de
pré-traitement supprime les valeurs 1, 2 et 3, mais pas la valeur 5 car
la valeur 4 n'est pas encore traitée :

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

Seules deux valeurs sont laissées dans la file d'attente (4 et 5) après
le vidage, les valeurs sont ajoutées dans le cache de données local du
gestionnaire de pré-traitement, puis les valeurs sont transférées du
cache local vers le cache d'historique. Le gestionnaire de
pré-traitement peut vider les valeurs du cache de données local en mode
élément unique ou en bloc (utilisé pour les éléments dépendants et les
valeurs reçues en bloc).

[comment]: # ({/bb0653fe-554cfc45})

[comment]: # ({cf906730-02017136})
#### Workers de prétraitement

Le fichier de configuration du serveur Zabbix permet aux utilisateurs de
définir le nombre de processus worker de pré-traitement. Le paramètre de
configuration StartPreprocessors doit être utilisé pour définir le
nombre d'instances prédéfinies de workers de pré-traitement. De nombreux
facteurs peuvent déterminer le nombre optimal de workers de
pré-traitement, notamment le nombre d'éléments "préprocessables"
(éléments nécessitant l'exécution d'une étape de pré-traitement), le
nombre de processus de collecte de données, le nombre moyen d'étapes
pour le pré-traitement d'éléments, etc.

Mais en supposant qu'il n'y ait pas d'opérations de pré-traitement
lourdes comme l'analyse de gros morceaux XML/JSON, le nombre de workers
de pré-traitement peut correspondre au nombre total de collecteurs de
données. De cette manière, il y aura principalement (sauf dans les cas
où les données du collecteur seront fournies en masse) au moins un
worker de pré-traitement inoccupé pour les données collectées.

::: notewarning
Trop de processus de collecte de données (pollers,
pollers d'inaccessibilité, pollers HTTP, pollers Java, pingers, pingers,
pollers proxy) associés au gestionnaire IPMI, au trapper SNMP et aux
workers de pré-traitement peuvent dépasser la limite du descripteur de
fichier par processus du gestionnaire de pré-traitement. Cela provoquera
l'arrêt du serveur Zabbix (généralement peu de temps après le démarrage,
mais cela peut parfois prendre plus de temps). Le fichier de
configuration doit être révisé ou la limite doit être augmentée pour
éviter cette situation.
:::

[comment]: # ({/cf906730-02017136})
