Esta seção fornece detalhes do pré-processamento por JavaScript.
Não use atribuições não declaradas em JavaScript de pré-processamento. Use var para declarar variáveis locais.
O pré-processamento JavaScript é feito invocando uma função JavaScript com um único parâmetro 'value' e o corpo da função fornecido pelo usuário. O resultado da etapa de pré-processamento é o valor retornado por essa função, por exemplo, para realizar a conversão de Fahrenheit para Celsius, insira:
nos parâmetros de pré-processamento JavaScript, que serão encapsulados em uma função JavaScript pelo server:
O parâmetro de entrada 'value' é sempre passado como uma string. O valor de retorno é automaticamente convertido para string via método toString() (se falhar, o erro é retornado como valor string), com algumas exceções:
Erros podem ser retornados lançando valores/objetos (normalmente strings ou objetos Error).
Por exemplo:
Cada script tem um tempo limite de execução de 10 segundos (dependendo do script, pode levar mais tempo para o tempo limite ser acionado); excedê-lo retornará erro. Um limite de heap de 512 megabytes é imposto.
O bytecode da etapa de pré-processamento JavaScript é armazenado em cache e reutilizado quando a etapa é aplicada na próxima vez. Quaisquer alterações nas etapas de pré-processamento do item farão com que o script em cache seja redefinido e recompilado posteriormente.
Falhas consecutivas em tempo de execução (3 seguidas) farão com que o mecanismo seja reinicializado para mitigar a possibilidade de um script quebrar o ambiente de execução para os próximos scripts (essa ação é registrada com DebugLevel 4 ou superior).
O pré-processamento JavaScript é implementado com o mecanismo JavaScript Duktape.
Veja também: Objetos JavaScript adicionais e funções globais
É possível usar macros de usuário em código JavaScript. Se um script contiver macros de usuário, essas macros são resolvidas pelo server/proxy antes de executar etapas específicas de pré-processamento. Observe que, ao testar etapas de pré-processamento no frontend, os valores das macros não serão buscados e precisam ser inseridos manualmente.
O contexto é ignorado quando uma macro é substituída por seu valor. O valor da macro é inserido no código como está, não é possível adicionar escape adicional antes de colocar o valor no código JavaScript. Esteja ciente de que isso pode causar erros de JavaScript em alguns casos.
No exemplo abaixo, se o valor recebido exceder o valor da macro {$THRESHOLD}, o valor do limite (se presente) será retornado:
var threshold = '{$THRESHOLD}'; return (!isNaN(threshold) && value > threshold) ? threshold : value;Os exemplos a seguir ilustram como você pode usar o pré-processamento em JavaScript.
Cada exemplo contém uma breve descrição, um corpo de função para os parâmetros de pré-processamento em JavaScript e o resultado da etapa de pré-processamento - valor retornado pela função.
Converta o número "2.62128e+07" da notação científica para um inteiro.
Valor retornado pela função: 26212800.
Converta o número binário "11010010" para um número decimal.
Valor retornado pela função: 210.
Arredonde o número "18.2345" para 2 dígitos.
Valor retornado pela função: 18.23.
Conta o número de letras na string "Zabbix".
Valor retornado pela função: 6.
Obtenha o tempo restante (em segundos) até a data de expiração de um certificado (12 de fevereiro de 2022 12:33:56 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 retornado pela função: 44380233.
Modifique a estrutura de dados JSON removendo quaisquer propriedades com a chave "data_size" ou "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)Valor aceito pela função:
[ { "table_name":"history", "data_size":"326.05", "index_size":"174.34" }, { "table_name":"history_log", "data_size":"6.02", "index_size":"3.45" } ]Valor retornado pela função:
Converta o valor recebido de um item do agente Zabbix web.page.get (por exemplo, web.page.get[http://127.0.0.1:80/server-status?auto]) para um objeto JSON.
// Converter status do Apache para JSON // Divide o valor em substrings e coloca essas substrings em um array var lines = value.split('\n'); // Cria um objeto vazio "output" var output = {}; // Cria um objeto "workers" com propriedades predefinidas var workers = { '_': 0, 'S': 0, 'R': 0, 'W': 0, 'K': 0, 'D': 0, 'C': 0, 'L': 0, 'G': 0, 'I': 0, '.': 0 }; // Adiciona as substrings do array "lines" ao objeto "output" como propriedades (pares chave-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étricas multiversão output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime; output.ServerVersion = output.ServerVersion || output.Server; // Analisa a propriedade "Scoreboard" para obter a contagem de workers if (typeof output.Scoreboard === 'string') { for (var i = 0; i < output.Scoreboard.length; i++) { var char = output.Scoreboard[i]; workers[char]++; } } // Adiciona dados de workers ao objeto "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 string JSON return JSON.stringify(output);Valor aceito pela função:
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 retornado pela função:
{ "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 } }