Aquesta secció proveeix detalls del pretractrament per a JavaScript.
El preprocessament de JavaScript es realitza invocant la funció JavaScript amb un únic paràmetre "valor" i un cos de funció subministrat per l'usuari. El resultat de la passa de preprocessament és el valor que retorna aquesta funció, per exemple, per fer una conversió de Fahrenheit a Celsius, l'usuari introduiria:
als paràmetres de preprocessament de JavaScript, que s'embolcallen en una funció JavaScript per servidor:
El paràmetre d'entrada 'valor' sempre es passa com a cadena. El valor de retorn es converteix automàticament a una cadena mitjançant el mètode ToString() (si falla, l'error es retorna com a valor de cadena), amb algunes excepcions:
Els errors es poden retornar iniciant valors/objectes (normalment cadenes o objectes d'error).
Per exemple:
Cada script té un temps d'espera d'execució de 10 segons (depenent de l'script, el temps d'espera pot trigar més a activar-se); superar-lo retornarà un error. S'aplica un límit d'emmagatzematge dinàmic de 512 Mo (abans de Zabbix 6.4.4 era de 64 megaoctets).
El bytecode de la passa de preprocessament de JavaScript s'emmagatzema a la memòria cau i es reutilitza la propera vegada que s'aplica el pas. Qualsevol canvi als passos de preprocessament de l'element farà que l'script desat a la memòria cau es restableixi i es torni a compilar posteriorment.
Els errors d'execució consecutius (3 de seguits) faran que el motor es restableixi per esmorteir la possibilitat que un script trenqui l'entorn d'execució per als scripts posteriors (aquesta acció es registra amb DebugLevel a 4 i posteriors).
El preprocessament de JavaScript s'implementa amb el motor JavaScript de Duktape (https://duktape.org/).
Veieu també: Objectes JavaScript addicionals i funcions globals
És possible emprar macros d'usuari al codi JavaScript. Si un script conté macros d'usuari, aquestes macros les resol el servidor/proxy abans de realitzar passes específiques de preprocessament. Tingueu en compte que quan proveu les passes de preprocessament a la interfície web, els valors de macro no s'extreuran i caldrà introduir-los manualment.
El context s'ignora quan se substitueix una macro pel seu valor. El valor de la macro s'insereix tal com és al codi, no és possible afegir una escapada addicional abans de col·locar el valor al codi JavaScript. Tingueu en compte que això pot provocar errors de JavaScript en alguns casos.
A l'exemple següent, si el valor rebut supera un valor de macro {$THRESHOLD}, es retornarà el valor de llindar (si és present):
var threshold = '{$THRESHOLD}'; return (!isNaN(threshold) && value > threshold) ? threshold : value;Els exemples següents il·lustren com podeu emprar el preprocessament de JavaScript.
Cada exemple conté una breu descripció, un cos de la funció per als paràmetres de preprocessament de JavaScript i el resultat de la passa de preprocessament: valor retornat per la funció.
Converteix el nombre "2.62128e+07" de notació científica a enter.
Valor retornat per la funció: 26212800.
Converteix el nombre binari "11010010" a un nombre decimal.
Valor retornat per la funció: 210.
Arrodoneix el nombre "18.2345" a 2 dígits.
Valor retornat per la funció: 18.23.
compta el nombre de lletres de la cadena "Zabbix".
Valor retornat per la funció: 6.
Obté el temps restant (en segons) fins la data d'expiració del certificat (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);Valor retornat per la funció: 44380233.
Modifica l'estructura de dades JSON esborrant qualsevol propietat amb la clau "data_size" o "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)Value accepted by the function:
[ { "table_name":"history", "data_size":"326.05", "index_size":"174.34" }, { "table_name":"history_log", "data_size":"6.02", "index_size":"3.45" } ]Valor retornat per la funció:
Converteix el valor rebut d'un element d'agent Zabbix web.page.get (p. ex., web.page.get[http://127.0.0.1 :80/server-status?auto]) a un objecte JSON.
// Converteix l'estat Apache a JSON // Divideix el valor en subcadenes i posa aquestes subcadenes en una matriu var lines = value.split('\n'); // Crea un objecte buit "output" var output = {}; // Crea un objecte "workers" amb les propietats predefinides var workers = { '_': 0, 'S': 0, 'R': 0, 'W': 0, 'K': 0, 'D': 0, 'C': 0, 'L': 0, 'G': 0, 'I': 0, '.': 0 }; // Afegiu les subcadenes de la matriu "línies" a l'objecte "sortida" com a propietats (parelles clau-valor) 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 multiversió output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime; output.ServerVersion = output.ServerVersion || output.Server; // Analitza la propietat "Tauler de marcador" per obtindre el recompte de treballadors if (typeof output.Scoreboard === 'string') { for (var i = 0; i < output.Scoreboard.length; i++) { var char = output.Scoreboard[i]; workers[char]++; } } // Afegeix informació del treballador a l'objecte "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['.'] }; // Retorna una cadena JSON return JSON.stringify(output);Valor acceptat per la funció:
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__..............................................................................................................................................Valor retornat per la funció:
{ "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 } }