5 Preprocesamiento con JavaScript

Descripción general

Esta sección proporciona detalles del preprocesamiento mediante JavaScript.

Preprocesamiento de JavaScript

El preprocesamiento de JavaScript se realiza invocando la función de JavaScript con un 'valor' de parámetro único y cuerpo de función proporcionado por el usuario. El El resultado del paso de preprocesamiento es el valor devuelto por esta función, por ejemplo. Por ejemplo, para realizar la conversión de Fahrenheit a Celsius, ingrese:

retorno (valor - 32) * 5/9

en los parámetros de preprocesamiento de JavaScript, que se incluirán en un Función JavaScript por servidor:

función (valor)
       {
          retorno (valor - 32) * 5/9
       }

El parámetro de entrada 'valor' siempre se pasa como una cadena. El regreso El valor se convierte automáticamente en cadena mediante el método ToString() (si falla, entonces el error se devuelve como valor de cadena), con algunos excepciones:

  • devolver un valor indefinido generará un error;
  • devolver un valor nulo hará que se descarte el valor de entrada, muy parecido al preprocesamiento 'Descartar valor' en la acción 'Personalizado en caso de error'.

Los errores se pueden devolver arrojando valores/objetos (normalmente ya sea cadenas u objetos de error).

Por ejemplo:

si (valor == 0)
           tirar "valor de entrada cero"
       devolver 1/valor

Cada script tiene un tiempo de espera de ejecución de 10 segundos (dependiendo del script, el tiempo de espera puede tardar más en activarse); superándolo será error de devolución. Se aplica un límite de almacenamiento dinámico de 512 megabytes.

El código de bytes del paso de preprocesamiento de JavaScript se almacena en caché y se reutiliza cuando El paso se aplica la próxima vez. Cualquier cambio en los pasos de preprocesamiento del artículo. hará que el script almacenado en caché se restablezca y se vuelva a compilar más tarde.

Fallas consecutivas en el tiempo de ejecución (3 seguidas) causarán que el motor se apague. reiniciado para mitigar la posibilidad de que un script rompa el entorno de ejecución para los siguientes scripts (esta acción se registra con Nivel de depuración 4 y superior).

El preprocesamiento de JavaScript se implementa con el motor JavaScript Duktape.

Ver también: Objetos JavaScript adicionales y globales funciones

Uso de macros en scripts

Es posible utilizar macros de usuario en el código JavaScript. Si un guión contiene macros de usuario, estas macros son resueltas por el servidor/proxy antes de ejecutar los pasos de preprocesamiento específicos. Tenga en cuenta que al realizar pruebas de pasos de preprocesamiento en la interfaz, los valores macro no se extraerán y deben ingresarse manualmente.

El contexto se ignora cuando una macro se reemplaza con su valor. El valor de la macro se inserta en el código tal cual, no es posible agregar escapes adicionales antes de colocar el valor en el código JavaScript. Tenga en cuenta que esto puede provocar errores de JavaScript en algunos casos.

En el siguiente ejemplo, si el valor recibido excede el valor de una macro {$THRESHOLD}, en su lugar se devolverá el valor del umbral (si está presente):

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

Ejemplos

Los siguientes ejemplos ilustran cómo puede utilizar el preprocesamiento de JavaScript.

Cada ejemplo contiene una breve descripción, un cuerpo de función para los parámetros de preprocesamiento de JavaScript y el resultado del paso de preprocesamiento: valor devuelto por la función.

Ejemplo 1: convertir un número (notación científica a entero)

Convierte el número "2.62128e+07" de notación científica a un número entero.

retorno (Número (valor))

Valor devuelto por la función: 26212800.

Ejemplo 2: convertir un número (binario a decimal)

Convierta el número binario "11010010" a un número decimal.

retorno(parseInt(valor,2))

Valor devuelto por la función: 210.

Ejemplo 3: redondear un número

Redondea el número "18.2345" a 2 dígitos.

retorno(Math.round(valor* 100) / 100)

Valor devuelto por la función: 18.23.

Ejemplo 4: contar letras en una cadena

Cuente el número de letras en la cadena "Zabbix".

retorno (valor.longitud)

Valor devuelto por la función: 6.

Ejemplo 5: Obtener el tiempo restante

Obtenga el tiempo restante (en segundos) hasta la fecha de vencimiento de un certificado (12 de febrero a las 12:33:56 2022 GMT).

var dividir = valor.split(' '),
           MONTHS_LIST = ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre' ],
           índice_mes = ('0' + (LISTA_MESES.indexOf(split[0]) + 1)).slice(-2),
           ISOdate = dividir[3] + '-' + índice_mes + '-' + dividir[1] + 'T' + dividir[2],
           ahora = Fecha.ahora();
       
       return parseInt((Date.parse(ISOdate) - ahora) / 1000);

Valor devuelto por la función: 44380233.

Ejemplo 6: eliminar propiedades JSON

Modifique la estructura de datos JSON eliminando cualquier propiedad con la clave "data_size" o "index_size".

var obj=JSON.parse(valor);
       
       para (i = 0; i < Object.keys(obj).length; i++) {
           eliminar obj[i]["data_size"];
           eliminar obj[i]["index_size"];
       }
       
       devolver JSON.stringify (obj)

Valor aceptado por la función:

[
           {
               "table_name": "historial",
               "tamaño_datos": "326.05",
               "index_size": "174,34"
           },
           {
               "table_name": "history_log",
               "tamaño_datos": "6.02",
               "index_size": "3,45"
           }
       ]

Valor devuelto por la función:

[
           {
               "nombre_tabla": "historial"
           },
           {
               "nombre_tabla": "registro_historial"
           }
       ]
Ejemplo 7: convertir el estado de Apache a JSON

Convierta el valor recibido de un elemento del agente Zabbix web.page.get (por ejemplo, web.page.get[http://127.0.0.1 :80/server-status?auto]) a un objeto JSON.

// Convertir el estado de Apache a JSON
       
       // Divide el valor en subcadenas y coloca estas subcadenas en una matriz
       var líneas = valor.split('\n');
       
       // Crea un objeto vacío "salida"
       var salida = {};
       
       // Crea un objeto "trabajadores" con propiedades predefinidas
       var trabajadores = {
           '_': 0, 'S': 0, 'R': 0, 'W': 0,
           'K': 0, 'D': 0, 'C': 0, 'L': 0,
           'G': 0, 'I': 0, '.': 0
       };
       
       // Agrega las subcadenas de la matriz "líneas" al objeto "salida" como propiedades (pares clave-valor)
       for (var i = 0; i < líneas.longitud; i++) {
           var línea = líneas[i].match(/([A-z0-9 ]+): (.*)/);
       
           si (línea! == nulo) {
               salida[línea[1]] = isNaN(línea[2])? línea[2] : Número(línea[2]);
           }
       }
       
       // Métricas multiversión
       salida.ServerUptimeSeconds = salida.ServerUptimeSeconds || salida.Tiempo de actividad;
       salida.ServerVersion = salida.ServerVersion || salida.Servidor;
       
       // Analiza la propiedad "Marcador" para obtener el recuento de trabajadores
       if (tipo de salida.Scoreboard === 'cadena') {
           for (var i = 0; i < salida.Scoreboard.length; i++) {
               var char = salida.Scoreboard[i];
       
               trabajadores[char]++;
           }
       }
       
       // Agrega datos del trabajador al objeto "salida"
       salida.Trabajadores = {
           esperando: trabajadores['_'], comenzando: trabajadores['S'], leyendo: trabajadores['R'],
           enviando: trabajadores['W'], keepalive: trabajadores['K'], dnslookup: trabajadores['D'],
           cierre: trabajadores['C'], registro: trabajadores['L'], acabado: trabajadores['G'],
           limpieza: trabajadores['I'], espacio: trabajadores['.']
       };
       
       // Devuelve cadena JSON
       devolver JSON.stringify(salida);

Valor aceptado por la función:

HTTP/1.1 200 correcto
       Fecha: lunes 27 de marzo de 2023 11:08:39 GMT
       Servidor: Apache/2.4.52 (Ubuntu)
       Variar: aceptar-codificación
       Codificación de contenido: gzip
       Longitud del contenido: 405
       Tipo de contenido: texto/sin formato; juego de caracteres=ISO-8859-1
       
       127.0.0.1
       Versión del servidor: Apache/2.4.52 (Ubuntu)
       ServidorMPM: prefork
       Servidor construido: 2023-03-08T17:32:01
       Hora actual: lunes, 27 de marzo de 2023 14:08:39 EEST
       Hora de reinicio: lunes 27 de marzo de 2023 12:19:59 EEST
       ParentServerConfigGeneración: 1
       ParentServerMPMGeneración: 0
       Tiempo de actividad del servidor Segundos: 6520
       Tiempo de actividad del servidor: 1 hora 48 minutos 40 segundos
       Carga1: 0,56
       Carga5: 0,33
       Carga15: 0,28
       Accesos totales: 2476
       kBytes totales: 8370
       Duración total: 52718
       Usuario de CPU: 8.16
       CPUSistema: 3.44
       CPUNiñosUsuario: 0
       CPUNiñosSistema: 0
       Carga de CPU: .177914
       Tiempo de actividad: 6520
       Solicitud por segundo: .379755
       Bytes por segundo: 3461,58
       Bytes por solicitud: 3461,58
       Duración por solicitud: 21,2916
       Trabajadores ocupados: 2
       Trabajadores inactivos: 6
       Marcador: ____KW__................................................ ................................................. .................................................

Valor devuelto por la función:

{
           "Fecha": "lunes, 27 de marzo de 2023 11:08:39 GMT",
           "Servidor": "Apache/2.4.52 (Ubuntu)",
           "Variar": "Aceptar-Codificación",
           "Codificación": "gzip",
           "Longitud": 405,
           "Tipo": "texto/sin formato; juego de caracteres=ISO-8859-1",
           "ServerVersion": "Apache/2.4.52 (Ubuntu)",
           "ServerMPM": "prefork",
           "Servidor construido": "2023-03-08T17:32:01",
           "CurrentTime": "Lunes, 27 de marzo de 2023 14:08:39 EEST",
           "RestartTime": "Lunes, 27 de marzo de 2023 12:19:59 EEST",
           "ParentServerConfigGeneration": 1,
           "ParentServerMPMGeneración": 0,
           "ServidorUptimeSeconds": 6520,
           "ServerUptime": "1 hora 48 minutos 40 segundos",
           "Carga1": 0,56,
           "Carga5": 0,33,
           "Carga15": 0,28,
           “Accesos Totales”: 2476,
           "KBytes totales": 8370,
           "Duración total": 52718,
           "CPUUser": 8.16,
           "Sistema CPU": 3.44,
           "CPUChildrenUser": 0,
           "CPUChildrenSystem": 0,
           "Carga de CPU": 0,177914,
           "Tiempo de actividad": 6520,
           "ReqPerSec": 0,379755,
           "BytesPorSec": 1314,55,
           "BytesPorReq": 3461,58,
           "DuraciónPorReq": 21.2916,
           "Trabajadores ocupados": 2,
           "Trabajadores inactivos": 6,
           "Marcador": "____KW__................................................ ................................................. ................................................",
           "Trabajadores": {
               "esperando": 6,
               "empezando": 0,
               "lectura": 0,
               "enviando": 1,
               "mantener vivo": 1,
               "búsqueda dns": 0,
               "cierre": 0,
               "registro": 0,
               "acabado": 0,
               "limpieza": 0,
               "ranura": 142
           }
       }