5 JavaScript priekšapstrāde

Pārskats

Šajā sadaļā ir sniegta informācija par priekšapstrādi, izmantojot JavaScript.

Neizmantojiet nedeklarētus piešķīrumus priekšapstrādes JavaScript kodā. Izmantojiet var, lai deklarētu lokālos mainīgos.

JavaScript priekšapstrāde

JavaScript priekšapstrāde tiek veikta, izsaucot JavaScript funkciju ar vienu parametru 'value' un lietotāja norādītu funkcijas pamatdaļu. Priekšapstrādes soļa rezultāts ir šīs funkcijas atgrieztā vērtība, piemēram, lai veiktu konvertēšanu no Fārenheita uz Celsiju, JavaScript priekšapstrādes parametros ievadiet:

return (value - 32)  * 5 / 9

serveris to ietvers JavaScript funkcijā:

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

Ievades parametrs 'value' vienmēr tiek nodots kā virkne. Atgrieztā vērtība tiek automātiski pārveidota par virkni, izmantojot metodi toString() (ja tas neizdodas, kļūda tiek atgriezta kā virknes vērtība), ar dažiem izņēmumiem:

  • atgriežot undefined vērtību, tiks radīta kļūda;
  • atgriežot null vērtību, ievades vērtība tiks atmesta, līdzīgi kā priekšapstrāde 'Discard value' darbībā 'Custom on fail'.

Kļūdas var atgriezt, izmetot vērtības/objektus (parasti tās ir vai nu virknes, vai Error objekti).

Piemēram:

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

Katram skriptam ir 10 sekunžu izpildes noildze (atkarībā no skripta var paiet ilgāks laiks, līdz noildze nostrādā); tās pārsniegšana atgriezīs kļūdu. Tiek piemērots 512 megabaitu kaudzes atmiņas ierobežojums.

JavaScript priekšapstrādes soļa baitkods tiek kešots un izmantots atkārtoti, kad šis solis tiek lietots nākamreiz. Jebkādas izmaiņas vienuma priekšapstrādes soļos izraisīs kešotā skripta atiestatīšanu un vēlāku pārkompilēšanu.

Secīgas izpildlaika kļūmes (3 pēc kārtas) izraisīs dzinēja atkārtotu inicializēšanu, lai mazinātu iespēju, ka viens skripts sabojā izpildes vidi nākamajiem skriptiem (šī darbība tiek reģistrēta žurnālā ar DebugLevel 4 un augstāku).

JavaScript priekšapstrāde ir ieviesta, izmantojot Duktape JavaScript dzinēju.

Skatiet arī: Papildu JavaScript objekti un globālās funkcijas

Makro izmantošana skriptos

Ir iespējams izmantot lietotāja makro (kā arī LLD makro zema līmeņa atklāšanas kontekstā) JavaScript kodā. Ja skripts satur lietotāja makro, šie makro tiek atrisināti serverī/starpniekserverī pirms konkrētu priekšapstrādes soļu izpildes. Ņemiet vērā, ka, testējot priekšapstrādes soļus lietotāja saskarnē, makro vērtības netiks ielasītas un tās būs jāievada manuāli.

Konteksts tiek ignorēts, kad makro tiek aizstāts ar tā vērtību. Makro vērtība tiek ievietota kodā tāda, kāda tā ir; pirms vērtības ievietošanas JavaScript kodā nav iespējams pievienot papildu atsoļošanu. Lūdzu, ņemiet vērā, ka dažos gadījumos tas var izraisīt JavaScript kļūdas.

Tālāk redzamajā piemērā, ja saņemtā vērtība pārsniedz {$THRESHOLD} makro vērtību, tā vietā tiks atgriezta sliekšņa vērtība (ja tā ir norādīta):

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

Piemēri

Tālāk sniegtie piemēri ilustrē, kā var izmantot JavaScript priekšapstrādi.

Katrs piemērs satur īsu aprakstu, funkcijas pamattekstu JavaScript priekšapstrādes parametriem un priekšapstrādes soļa rezultātu — funkcijas atgriezto vērtību.

Piemērs 1: Pārveidot skaitli (zinātniskā pieraksta formu uz veselu skaitli)

Pārveidojiet skaitli "2.62128e+07" no zinātniskā pieraksta formas uz veselu skaitli.

return (Number(value))

Funkcijas atgrieztā vērtība: 26212800.

Piemērs 2: Pārveidot skaitli (no binārās uz decimālo sistēmu)

Pārveidojiet bināro skaitli "11010010" par decimālo skaitli.

return(parseInt(value,2))

Funkcijas atgrieztā vērtība: 210.

Piemērs 3: Noapaļot skaitli

Noapaļojiet skaitli "18.2345" līdz 2 cipariem aiz komata.

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

Funkcijas atgrieztā vērtība: 18.23.

Piemērs 4: Saskaitīt burtus virknē

Saskaitiet burtu skaitu virknē "Zabbix".

return (value.length)

Funkcijas atgrieztā vērtība: 6.

Piemērs 5: Iegūt atlikušo laiku

Iegūstiet atlikušo laiku (sekundēs) līdz sertifikāta derīguma termiņa beigām (Feb 12 12:33:56 2022 GMT).

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);

Funkcijas atgrieztā vērtība: 44380233.

Piemērs 6: Noņemt JSON rekvizītus

Modificējiet JSON datu struktūru, noņemot visus rekvizītus ar atslēgu "data_size" vai "index_size".

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)

Funkcijas pieņemtā vērtība:

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

Funkcijas atgrieztā vērtība:

[
    {
        "table_name":"history"
    },
    {
        "table_name":"history_log"
    }
]
Piemērs 7: Apache statusa pārveidošana par JSON

Pārveidojiet vērtību, kas saņemta no web.page.get Zabbix aģenta vienuma (piemēram, web.page.get[http://127.0.0.1:80/server-status?auto]), par JSON objektu.

// Pārveidot Apache statusu par JSON

// Sadalīt vērtību apakšvirknēs un ievietot šīs apakšvirknes masīvā
var lines = value.split('\n');

// Izveidot tukšu objektu "output"
var output = {};

// Izveidot objektu "workers" ar iepriekš definētām īpašībām
var workers = {
    '_': 0, 'S': 0, 'R': 0, 'W': 0,
    'K': 0, 'D': 0, 'C': 0, 'L': 0,
    'G': 0, 'I': 0, '.': 0
};

// Pievienot apakšvirknes no masīva "lines" objektam "output" kā īpašības (atslēgas-vērtības pārus)
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]);
    }
}

// Daudzversiju metrikas
output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
output.ServerVersion = output.ServerVersion || output.Server;

// Parsēt īpašību "Scoreboard", lai iegūtu darba procesu skaitu
if (typeof output.Scoreboard === 'string') {
    for (var i = 0; i < output.Scoreboard.length; i++) {
        var char = output.Scoreboard[i];

        workers[char]++;
    }
}

// Pievienot darba procesu datus objektam "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['.']
};

// Atgriezt JSON virkni
return JSON.stringify(output);

Funkcijas pieņemtā vērtība:

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

Funkcijas atgrieztā vērtība:

{
    "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
    }
}