[comment]: # ({42979355-213e862c})
# 5 Wstępne przetwarzanie JavaScript

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

[comment]: # ({85dbf118-57d3be9d})
### Przegląd

Ta sekcja zawiera szczegółowe informacje dotyczące preprocessingu za pomocą JavaScript.

:::noteimportant
Nie używaj niezadeklarowanych przypisań w JavaScript używanym do preprocessingu.
Użyj `var`, aby deklarować zmienne lokalne.
:::

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

[comment]: # ({1a912b43-076d2285})
### Wstępne przetwarzanie JavaScript

Wstępne przetwarzanie JavaScript jest wykonywane przez wywołanie funkcji JavaScript z pojedynczym parametrem „value” oraz treścią funkcji dostarczoną przez użytkownika.
Wynikiem kroku wstępnego przetwarzania jest wartość zwrócona przez tę funkcję; na przykład, aby wykonać konwersję ze stopni Fahrenheita na stopnie Celsjusza, wprowadź:

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

w parametrach wstępnego przetwarzania JavaScript; zostanie to opakowane przez serwer w funkcję JavaScript:

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

Parametr wejściowy „value” jest zawsze przekazywany jako ciąg znaków.
Wartość zwracana jest automatycznie konwertowana do ciągu znaków za pomocą metody toString() (jeśli to się nie powiedzie, błąd zostanie zwrócony jako wartość tekstowa), z kilkoma wyjątkami:

-   zwrócenie wartości undefined spowoduje błąd;
-   zwrócenie wartości null spowoduje odrzucenie wartości wejściowej, podobnie jak wstępne przetwarzanie „Discard value” przy akcji „Custom on fail”.

Błędy mogą być zwracane przez zgłaszanie wartości/obiektów (zwykle są to ciągi znaków albo obiekty Error).

Na przykład:

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

Każdy skrypt ma limit czasu wykonania wynoszący 10 sekund (w zależności od skryptu zadziałanie limitu czasu może potrwać dłużej); jego przekroczenie spowoduje zwrócenie błędu.
Obowiązuje limit sterty wynoszący 512 megabajtów.

Kod bajtowy kroku wstępnego przetwarzania JavaScript jest buforowany i używany ponownie przy następnym zastosowaniu tego kroku.
Wszelkie zmiany w krokach wstępnego przetwarzania pozycji spowodują zresetowanie skryptu w pamięci podręcznej i jego późniejszą ponowną kompilację.

Kolejne błędy wykonania w czasie działania (3 z rzędu) spowodują ponowną inicjalizację silnika, aby ograniczyć możliwość, że jeden skrypt uszkodzi środowisko wykonywania kolejnych skryptów (to działanie jest rejestrowane przy DebugLevel 4 i wyższym).

Wstępne przetwarzanie JavaScript jest zaimplementowane przy użyciu silnika JavaScript [Duktape](https://duktape.org/).

Zobacz także: [Dodatkowe obiekty JavaScript i globalne funkcje](/manual/config/items/preprocessing/javascript/javascript_objects)

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

[comment]: # ({db7176c2-c932b901})
##### Używanie makr w skryptach

Można używać makr użytkownika (a także [makr LLD](/manual/config/macros/lld_macros) w kontekście wykrywania niskopoziomowego) w kodzie JavaScript.
Jeśli skrypt zawiera makra, są one rozwijane przez serwer/proxy przed wykonaniem określonych kroków przetwarzania wstępnego.
Należy pamiętać, że podczas testowania kroków przetwarzania wstępnego w frontendzie wartości makr nie zostaną pobrane i trzeba je wprowadzić ręcznie.

::: noteclassic
Kontekst jest ignorowany, gdy makro zostaje zastąpione swoją wartością.
Wartość makra jest wstawiana do kodu bez zmian; nie jest możliwe dodanie dodatkowego escapowania przed umieszczeniem wartości w kodzie JavaScript.
Należy pamiętać, że w niektórych przypadkach może to powodować błędy JavaScript.
:::

W poniższym przykładzie, jeśli otrzymana wartość przekracza wartość makra {$THRESHOLD}, zostanie zwrócona wartość progu (jeśli jest obecna):

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

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

[comment]: # ({023bc14f-6a424b72})
### Przykłady

Poniższe przykłady ilustrują, jak można używać preprocessingu JavaScript.

Każdy przykład zawiera krótki opis, treść funkcji dla parametrów preprocessingu JavaScript oraz wynik kroku preprocessingu — wartość zwracaną przez funkcję.

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

[comment]: # ({565e57c6-ae8e02fb})
##### Przykład 1: Konwersja liczby (notacja naukowa na liczbę całkowitą)

Przekonwertuj liczbę „2.62128e+07” z notacji naukowej na liczbę całkowitą.

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

Wartość zwrócona przez funkcję: 26212800.

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

[comment]: # ({5a30e4ee-f6e6bf55})
##### Przykład 2: Konwersja liczby (z systemu binarnego na dziesiętny)

Przekonwertuj liczbę binarną „11010010” na liczbę dziesiętną.

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

Wartość zwrócona przez funkcję: 210.

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

[comment]: # ({35ba7ead-6ca17bad})
##### Przykład 3: Zaokrąglanie liczby

Zaokrąglij liczbę „18.2345” do 2 cyfr.

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

Wartość zwrócona przez funkcję: 18.23.

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

[comment]: # ({d27ba472-7385d4e0})
##### Przykład 4: Zliczanie liter w ciągu znaków

Policz liczbę liter w ciągu znaków „Zabbix”.

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

Wartość zwrócona przez funkcję: 6.

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

[comment]: # ({a521a081-47caadc8})
##### Przykład 5: Pobierz pozostały czas

Pobierz pozostały czas (w sekundach) do daty wygaśnięcia certyfikatu (Feb 12 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);
```

Wartość zwracana przez funkcję: 44380233.

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

[comment]: # ({f91807bf-fef95b5b})
##### Przykład 6: Usuń właściwości JSON

Zmodyfikuj strukturę danych JSON, usuwając wszystkie właściwości z kluczem `"data_size"` lub `"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)
```

Wartość przyjmowana przez funkcję:

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

Wartość zwracana przez funkcję:

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

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

[comment]: # ({da55e341-f6f7d5a8})
##### Przykład 7: Konwersja statusu Apache do formatu JSON

Przekonwertuj wartość otrzymaną z pozycji Zabbix agent [web.page.get](/manual/config/items/itemtypes/zabbix_agent#web.page.get) (np. web.page.get[http://127.0.0.1:80/server-status?auto]) na obiekt JSON.

```javascript
// Konwersja statusu Apache do formatu JSON

// Podziel wartość na podciągi i umieść te podciągi w tablicy
var lines = value.split('\n');

// Utwórz pusty obiekt "output"
var output = {};

// Utwórz obiekt "workers" ze wstępnie zdefiniowanymi właściwościami
var workers = {
    '_': 0, 'S': 0, 'R': 0, 'W': 0,
    'K': 0, 'D': 0, 'C': 0, 'L': 0,
    'G': 0, 'I': 0, '.': 0
};

// Dodaj podciągi z tablicy "lines" do obiektu "output" jako właściwości (pary klucz-wartość)
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]);
    }
}

// Metryki dla wielu wersji
output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
output.ServerVersion = output.ServerVersion || output.Server;

// Przeanalizuj właściwość "Scoreboard", aby uzyskać liczbę workerów
if (typeof output.Scoreboard === 'string') {
    for (var i = 0; i < output.Scoreboard.length; i++) {
        var char = output.Scoreboard[i];

        workers[char]++;
    }
}

// Dodaj dane workerów do obiektu "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['.']
};

// Zwróć ciąg JSON
return JSON.stringify(output);
```

Wartość akceptowana przez funkcję:

```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__..............................................................................................................................................
```

Wartość zwracana przez funkcję:

```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})
