[comment]: # ({42979355-213e862c})
# 5 Prétraitement JavaScript

[comment]: # ({/42979355-213e862c})

[comment]: # ({85dbf118-57d3be9d})
### Vue d’ensemble

Cette section fournit des détails sur le prétraitement par JavaScript.

:::noteimportant
N’utilisez pas d’affectations non déclarées dans le JavaScript de prétraitement.
Utilisez `var` pour déclarer les variables locales.
:::

[comment]: # ({/85dbf118-57d3be9d})

[comment]: # ({1a912b43-076d2285})
### Prétraitement JavaScript

Le prétraitement JavaScript est effectué en appelant une fonction JavaScript avec un seul paramètre, « value », et un corps de fonction fourni par l'utilisateur.
Le résultat de l'étape de prétraitement est la valeur renvoyée par cette fonction. Par exemple, pour effectuer une conversion de Fahrenheit en Celsius, saisissez :

```javascript
return (value - 32)  * 5 / 9
```

dans les paramètres de prétraitement JavaScript ; le serveur l'encapsulera dans une fonction JavaScript :

```javascript
function (value)
{
   return (value - 32) * 5 / 9
}
```

Le paramètre d'entrée « value » est toujours transmis sous forme de chaîne.
La valeur de retour est automatiquement convertie en chaîne via la méthode toString() (si cela échoue, l'erreur est alors renvoyée sous forme de valeur de chaîne), avec quelques exceptions :

-   le renvoi de la valeur undefined entraînera une erreur ;
-   le renvoi de la valeur null entraînera l'abandon de la valeur d'entrée, de manière similaire au prétraitement « Discard value » dans l'action « Custom on fail ».

Les erreurs peuvent être renvoyées en lançant des valeurs/objets (généralement des chaînes ou des objets Error).

Par exemple :

```javascript
if (value == 0)
    throw "Zero input value"
return 1/value
```

Chaque script dispose d'un délai maximal d'exécution de 10 secondes (selon le script, le déclenchement du délai peut prendre plus de temps) ; si ce délai est dépassé, une erreur sera renvoyée.
Une limite de tas de 512 mégaoctets est appliquée.

Le bytecode de l'étape de prétraitement JavaScript est mis en cache et réutilisé lorsque l'étape est appliquée la fois suivante.
Toute modification des étapes de prétraitement de l'élément entraînera la réinitialisation du script mis en cache et sa recompilation ultérieure.

Des échecs d'exécution consécutifs (3 d'affilée) entraîneront la réinitialisation du moteur afin de réduire le risque qu'un script perturbe l'environnement d'exécution des scripts suivants (cette action est journalisée avec DebugLevel 4 et supérieur).

Le prétraitement JavaScript est implémenté avec le moteur JavaScript [Duktape](https://duktape.org/).

Voir aussi : [Objets JavaScript supplémentaires et fonctions globales](/manual/config/items/preprocessing/javascript/javascript_objects)

[comment]: # ({/1a912b43-076d2285})

[comment]: # ({db7176c2-c932b901})
##### Utilisation des macros dans les scripts

Il est possible d'utiliser des macros utilisateur (ainsi que des [macros LLD](/manual/config/macros/lld_macros) dans le contexte de la découverte de bas niveau) dans le code JavaScript.
Si un script contient des macros, celles-ci sont résolues par le serveur/proxy avant l'exécution d'étapes de prétraitement spécifiques.
Notez que lors du test des étapes de prétraitement dans l'interface, les valeurs des macros ne seront pas récupérées et devront être saisies manuellement.

::: noteclassic
Le contexte est ignoré lorsqu'une macro est remplacée par sa valeur.
La valeur de la macro est insérée dans le code telle quelle ; il n'est pas possible d'ajouter un échappement supplémentaire avant de placer la valeur dans le code JavaScript.
Veuillez noter que cela peut provoquer des erreurs JavaScript dans certains cas.
:::

Dans l'exemple ci-dessous, si la valeur reçue dépasse une valeur de macro {$THRESHOLD}, la valeur du seuil (si elle est présente) sera renvoyée à la place :

```javascript
var threshold = '{$THRESHOLD}';
return (!isNaN(threshold) && value > threshold) ? threshold : value;
```

[comment]: # ({/db7176c2-c932b901})

[comment]: # ({023bc14f-6a424b72})
### Exemples

Les exemples suivants illustrent comment vous pouvez utiliser le prétraitement JavaScript.

Chaque exemple contient une brève description, un corps de fonction pour les paramètres de prétraitement JavaScript, ainsi que le résultat de l’étape de prétraitement : la valeur renvoyée par la fonction.

[comment]: # ({/023bc14f-6a424b72})

[comment]: # ({565e57c6-ae8e02fb})
##### Exemple 1 : Convertir un nombre (notation scientifique en entier)

Convertissez le nombre « 2.62128e+07 » de la notation scientifique en entier.

```javascript
return (Number(value))
```

Valeur renvoyée par la fonction : 26212800.

[comment]: # ({/565e57c6-ae8e02fb})

[comment]: # ({5a30e4ee-f6e6bf55})
##### Exemple 2 : Convertir un nombre (binaire en décimal)

Convertissez le nombre binaire « 11010010 » en nombre décimal.

```javascript
return(parseInt(value,2))
```

Valeur renvoyée par la fonction : 210.

[comment]: # ({/5a30e4ee-f6e6bf55})

[comment]: # ({35ba7ead-6ca17bad})
##### Exemple 3 : Arrondir un nombre

Arrondissez le nombre « 18.2345 » à 2 chiffres.

```javascript
return(Math.round(value* 100) / 100)
```

Valeur renvoyée par la fonction : 18.23.

[comment]: # ({/35ba7ead-6ca17bad})

[comment]: # ({d27ba472-7385d4e0})
##### Exemple 4 : Compter les lettres dans une chaîne

Comptez le nombre de lettres dans la chaîne « Zabbix ».

```javascript
return (value.length)
```

Valeur renvoyée par la fonction : 6.

[comment]: # ({/d27ba472-7385d4e0})

[comment]: # ({a521a081-47caadc8})
##### Exemple 5 : Obtenir le temps restant

Obtenez le temps restant (en secondes) jusqu’à la date d’expiration d’un certificat (12 févr. 12:33:56 2022 GMT).

```javascript
var split = value.split(' '),
    MONTHS_LIST = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
    month_index = ('0' + (MONTHS_LIST.indexOf(split[0]) + 1)).slice(-2),
    ISOdate = split[3] + '-' + month_index + '-' + split[1] + 'T' + split[2],
    now = Date.now();

return parseInt((Date.parse(ISOdate) - now) / 1000);
```

Valeur renvoyée par la fonction : 44380233.

[comment]: # ({/a521a081-47caadc8})

[comment]: # ({f91807bf-fef95b5b})
##### Exemple 6 : Supprimer des propriétés JSON

Modifiez la structure des données JSON en supprimant toutes les propriétés dont la clé est `"data_size"` ou `"index_size"`.

```javascript
var obj=JSON.parse(value);

for (i = 0; i < Object.keys(obj).length; i++) {
    delete obj[i]["data_size"];
    delete obj[i]["index_size"];
}

return JSON.stringify(obj)
```

Valeur acceptée par la fonction :

```json
[
    {
        "table_name":"history",
        "data_size":"326.05",
        "index_size":"174.34"
    },
    {
        "table_name":"history_log",
        "data_size":"6.02",
        "index_size":"3.45"
    }
]
```

Valeur renvoyée par la fonction :

```json
[
    {
        "table_name":"history"
    },
    {
        "table_name":"history_log"
    }
]
```

[comment]: # ({/f91807bf-fef95b5b})

[comment]: # ({da55e341-f6f7d5a8})
##### Exemple 7 : Convertir le statut Apache en JSON

Convertissez la valeur reçue d'un élément agent Zabbix [web.page.get](/manual/config/items/itemtypes/zabbix_agent#web.page.get) (par exemple, web.page.get[http://127.0.0.1:80/server-status?auto]) en objet JSON.

```javascript
// Convertir le statut Apache en JSON

// Diviser la valeur en sous-chaînes et placer ces sous-chaînes dans un tableau
var lines = value.split('\n');

// Créer un objet vide "output"
var output = {};

// Créer un objet "workers" avec des propriétés prédéfinies
var workers = {
    '_': 0, 'S': 0, 'R': 0, 'W': 0,
    'K': 0, 'D': 0, 'C': 0, 'L': 0,
    'G': 0, 'I': 0, '.': 0
};

// Ajouter les sous-chaînes du tableau "lines" à l'objet "output" en tant que propriétés (paires clé-valeur)
for (var i = 0; i < lines.length; i++) {
    var line = lines[i].match(/([A-z0-9 ]+): (.*)/);

    if (line !== null) {
        output[line[1]] = isNaN(line[2]) ? line[2] : Number(line[2]);
    }
}

// Métriques multiversion
output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
output.ServerVersion = output.ServerVersion || output.Server;

// Analyser la propriété "Scoreboard" pour obtenir le nombre de workers
if (typeof output.Scoreboard === 'string') {
    for (var i = 0; i < output.Scoreboard.length; i++) {
        var char = output.Scoreboard[i];

        workers[char]++;
    }
}

// Ajouter les données des workers à l'objet "output"
output.Workers = {
    waiting: workers['_'], starting: workers['S'], reading: workers['R'],
    sending: workers['W'], keepalive: workers['K'], dnslookup: workers['D'],
    closing: workers['C'], logging: workers['L'], finishing: workers['G'],
    cleanup: workers['I'], slot: workers['.']
};

// Renvoyer la chaîne JSON
return JSON.stringify(output);
```

Valeur acceptée par la fonction :

```default
HTTP/1.1 200 OK
Date: Mon, 27 Mar 2023 11:08:39 GMT
Server: Apache/2.4.52 (Ubuntu)
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 405
Content-Type: text/plain; charset=ISO-8859-1

127.0.0.1
ServerVersion: Apache/2.4.52 (Ubuntu)
ServerMPM: prefork
Server Built: 2023-03-08T17:32:01
CurrentTime: Monday, 27-Mar-2023 14:08:39 EEST
RestartTime: Monday, 27-Mar-2023 12:19:59 EEST
ParentServerConfigGeneration: 1
ParentServerMPMGeneration: 0
ServerUptimeSeconds: 6520
ServerUptime: 1 hour 48 minutes 40 seconds
Load1: 0.56
Load5: 0.33
Load15: 0.28
Total Accesses: 2476
Total kBytes: 8370
Total Duration: 52718
CPUUser: 8.16
CPUSystem: 3.44
CPUChildrenUser: 0
CPUChildrenSystem: 0
CPULoad: .177914
Uptime: 6520
ReqPerSec: .379755
BytesPerSec: 3461.58
BytesPerReq: 3461.58
DurationPerReq: 21.2916
BusyWorkers: 2
IdleWorkers: 6
Scoreboard: ____KW__..............................................................................................................................................
```

Valeur renvoyée par la fonction :

```json
{
    "Date": "Mon, 27 Mar 2023 11:08:39 GMT",
    "Server": "Apache/2.4.52 (Ubuntu)",
    "Vary": "Accept-Encoding",
    "Encoding": "gzip",
    "Length": 405,
    "Type": "text/plain; charset=ISO-8859-1",
    "ServerVersion": "Apache/2.4.52 (Ubuntu)",
    "ServerMPM": "prefork",
    "Server Built": "2023-03-08T17:32:01",
    "CurrentTime": "Monday, 27-Mar-2023 14:08:39 EEST",
    "RestartTime": "Monday, 27-Mar-2023 12:19:59 EEST",
    "ParentServerConfigGeneration": 1,
    "ParentServerMPMGeneration": 0,
    "ServerUptimeSeconds": 6520,
    "ServerUptime": "1 hour 48 minutes 40 seconds",
    "Load1": 0.56,
    "Load5": 0.33,
    "Load15": 0.28,
    "Total Accesses": 2476,
    "Total kBytes": 8370,
    "Total Duration": 52718,
    "CPUUser": 8.16,
    "CPUSystem": 3.44,
    "CPUChildrenUser": 0,
    "CPUChildrenSystem": 0,
    "CPULoad": 0.177914,
    "Uptime": 6520,
    "ReqPerSec": 0.379755,
    "BytesPerSec": 1314.55,
    "BytesPerReq": 3461.58,
    "DurationPerReq": 21.2916,
    "BusyWorkers": 2,
    "IdleWorkers": 6,
    "Scoreboard": "____KW__..............................................................................................................................................",
    "Workers": {
        "waiting": 6,
        "starting": 0,
        "reading": 0,
        "sending": 1,
        "keepalive": 1,
        "dnslookup": 0,
        "closing": 0,
        "logging": 0,
        "finishing": 0,
        "cleanup": 0,
        "slot": 142
    }
}
```

[comment]: # ({/da55e341-f6f7d5a8})
