5 JavaScript-Vorverarbeitung

Übersicht

Dieser Abschnitt enthält Details zur Vorverarbeitung mit JavaScript.

Verwenden Sie in der Vorverarbeitungs-JavaScript keine Zuweisungen an nicht deklarierte Variablen. Verwenden Sie var, um lokale Variablen zu deklarieren.

JavaScript-Preprocessing

Die JavaScript-Preprocessing wird durchgeführt, indem eine JavaScript-Funktion mit einem einzelnen Parameter 'value' und einem vom Benutzer bereitgestellten Funktionsrumpf aufgerufen wird. Das Ergebnis des Preprocessing-Schritts ist der von dieser Funktion zurückgegebene Wert. Um beispielsweise eine Umrechnung von Fahrenheit in Celsius durchzuführen, geben Sie Folgendes ein:

return (value - 32)  * 5 / 9

in den Parametern der JavaScript-Preprocessing; dies wird vom Server in eine JavaScript-Funktion eingebettet:

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

Der Eingabeparameter 'value' wird immer als Zeichenfolge übergeben. Der Rückgabewert wird automatisch über die Methode toString() in eine Zeichenfolge umgewandelt (falls dies fehlschlägt, wird der Fehler als Zeichenfolgenwert zurückgegeben), mit einigen Ausnahmen:

  • die Rückgabe des Werts undefined führt zu einem Fehler;
  • die Rückgabe des Werts null führt dazu, dass der Eingabewert verworfen wird, ähnlich wie beim Preprocessing „Wert verwerfen“ in der Aktion „Benutzerdefiniert bei Fehler“.

Fehler können durch das Auslösen von Werten/Objekten zurückgegeben werden (normalerweise entweder Zeichenfolgen oder Error-Objekte).

Zum Beispiel:

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

Jedes Skript hat ein Ausführungs-Timeout von 10 Sekunden (abhängig vom Skript kann es länger dauern, bis das Timeout ausgelöst wird); bei Überschreitung wird ein Fehler zurückgegeben. Es wird ein Heap-Limit von 512 Megabyte erzwungen.

Der Bytecode des JavaScript-Preprocessing-Schritts wird zwischengespeichert und bei der nächsten Anwendung des Schritts wiederverwendet. Änderungen an den Preprocessing-Schritten des Datenpunkts führen dazu, dass das zwischengespeicherte Skript zurückgesetzt und später neu kompiliert wird.

Aufeinanderfolgende Laufzeitfehler (3 hintereinander) führen dazu, dass die Engine neu initialisiert wird, um die Möglichkeit zu verringern, dass ein Skript die Ausführungsumgebung für die nachfolgenden Skripte beeinträchtigt (diese Aktion wird mit DebugLevel 4 und höher protokolliert).

Die JavaScript-Preprocessing ist mit der JavaScript-Engine Duktape implementiert.

Siehe auch: Zusätzliche JavaScript-Objekte und globale Funktionen

Verwendung von Makros in Skripten

Es ist möglich, Benutzermakros (sowie LLD-Makros im Kontext der Low-Level-Discovery) in JavaScript-Code zu verwenden. Wenn ein Skript Benutzermakros enthält, werden diese Makros vor der Ausführung bestimmter Vorverarbeitungsschritte vom Server/Proxy aufgelöst. Beachten Sie, dass beim Testen von Vorverarbeitungsschritten im Frontend keine Makrowerte abgerufen werden und diese manuell eingegeben werden müssen.

Der Kontext wird ignoriert, wenn ein Makro durch seinen Wert ersetzt wird. Der Makrowert wird unverändert in den Code eingefügt; es ist nicht möglich, vor dem Einfügen des Werts in den JavaScript-Code zusätzliches Escaping hinzuzufügen. Bitte beachten Sie, dass dies in einigen Fällen zu JavaScript-Fehlern führen kann.

Im folgenden Beispiel wird, wenn der empfangene Wert den Wert des Makros {$THRESHOLD} überschreitet, stattdessen der Schwellenwert (falls vorhanden) zurückgegeben:

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

Beispiele

Die folgenden Beispiele veranschaulichen, wie Sie die JavaScript-Vorverarbeitung verwenden können.

Jedes Beispiel enthält eine kurze Beschreibung, einen Funktionsrumpf für JavaScript-Vorverarbeitungsparameter und das Ergebnis des Vorverarbeitungsschritts – den von der Funktion zurückgegebenen Wert.

Beispiel 1: Eine Zahl umwandeln (wissenschaftliche Notation in Ganzzahl)

Wandeln Sie die Zahl „2.62128e+07“ von wissenschaftlicher Notation in eine Ganzzahl um.

return (Number(value))

Von der Funktion zurückgegebener Wert: 26212800.

Beispiel 2: Eine Zahl umwandeln (binär in dezimal)

Wandeln Sie die Binärzahl "11010010" in eine Dezimalzahl um.

return(parseInt(value,2))

Von der Funktion zurückgegebener Wert: 210.

Beispiel 3: Eine Zahl runden

Runden Sie die Zahl „18.2345“ auf 2 Stellen.

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

Von der Funktion zurückgegebener Wert: 18.23.

Beispiel 4: Buchstaben in einer Zeichenkette zählen

Zählen Sie die Anzahl der Buchstaben in der Zeichenkette „Zabbix“.

return (value.length)

Von der Funktion zurückgegebener Wert: 6.

Beispiel 5: Verbleibende Zeit abrufen

Rufen Sie die verbleibende Zeit (in Sekunden) bis zum Ablaufdatum eines Zertifikats ab (12. Feb. 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);

Von der Funktion zurückgegebener Wert: 44380233.

Beispiel 6: JSON-Eigenschaften entfernen

Ändern Sie die JSON-Datenstruktur, indem Sie alle Eigenschaften mit dem Schlüssel "data_size" oder "index_size" entfernen.

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)

Von der Funktion akzeptierter Wert:

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

Von der Funktion zurückgegebener Wert:

[
    {
        "table_name":"history"
    },
    {
        "table_name":"history_log"
    }
]
Beispiel 7: Apache-Status in JSON umwandeln

Wandeln Sie den von einem Zabbix-Agent-Datenpunkt vom Typ web.page.get empfangenen Wert (z. B. web.page.get[http://127.0.0.1:80/server-status?auto]) in ein JSON-Objekt um.

// Apache-Status in JSON umwandeln

// Den Wert in Teilzeichenfolgen aufteilen und diese Teilzeichenfolgen in ein Array einfügen
var lines = value.split('\n');

// Ein leeres Objekt "output" erstellen
var output = {};

// Ein Objekt "workers" mit vordefinierten Eigenschaften erstellen
var workers = {
    '_': 0, 'S': 0, 'R': 0, 'W': 0,
    'K': 0, 'D': 0, 'C': 0, 'L': 0,
    'G': 0, 'I': 0, '.': 0
};

// Die Teilzeichenfolgen aus dem Array "lines" als Eigenschaften (Schlüssel-Wert-Paare) zum Objekt "output" hinzufügen
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]);
    }
}

// Metriken für mehrere Versionen
output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
output.ServerVersion = output.ServerVersion || output.Server;

// Eigenschaft "Scoreboard" parsen, um die Anzahl der Worker zu ermitteln
if (typeof output.Scoreboard === 'string') {
    for (var i = 0; i < output.Scoreboard.length; i++) {
        var char = output.Scoreboard[i];

        workers[char]++;
    }
}

// Worker-Daten zum Objekt "output" hinzufügen
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['.']
};

// JSON-Zeichenfolge zurückgeben
return JSON.stringify(output);

Von der Funktion akzeptierter Wert:

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

Von der Funktion zurückgegebener Wert:

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