Das Monitoring-Tool Zabbix bietet über das so genannte "Item-Preprocessing" die Möglichkeit, erfasste Monitoring-Daten über verschiedene Operationen aufzubereiten. Beispielsweise können aus einem JSON-Objekt einzelne Elemente als separates Item extrahiert oder Strings mittels eines Regulären Ausdrucks verändert werden.
Mittwoch, 1. Juli 2020
Bitmaske in Zabbix mittels Item-Preprocessing in Integer-Wert umwandeln
Mit Version 4.2.0 kam hier mit JavaScript eine mächtige Operation hinzu. Damit kann ein Script hinterlegt werden, das den ursprünglichen Wert entgegennimmt, diesen verarbeitet und das Ergebnis zurückgibt. Die Verarbeitungsmöglichkeiten sind also nur noch darauf beschränkt, was die zugrunde liegende Javascript Engine "Duktape" (https://duktape.org/) an Funktionalitäten unterstützt.
Wofür dies beispielsweise verwendet werden kann, soll das folgende Beispiel zeigen. Vor einiger Zeit stand ich vor einem Problem: Ich hatte ein Item, das mehrere Werte in Form einer Bitmaske enthielt. Um Fehlerzustände zu erkennen wollte ich in der Trigger-Definition mit der Funktion band (Binary AND) einzelne Bits prüfen. Da diese Funktion aber nur mit Integer-Werten umgehen kann, war es notwendig, die Bitmaske entsprechend umzuwandeln. Da es hierzu seitens Zabbix aber keine Möglichkeit gab, blieben nur folgende Alternativen:
- Item-Wert über ein eigenes Script erfassen (hinsichtlich Performance nicht optimal)
- Mittels Preprocessing über einen RegEx jeweils separate Items aus den einzelnen Bits erstellen (aufgrund der Menge nicht sehr sinnvoll)
function (value) {
# Check for valid bitmask
var regex = new RegExp('^[0-1]+$');
if (value.match(regex) === null) {
throw "Value '" + value + "' is not a valid bitmask";
}
# Convert bitmask to integer value
var int = parseInt(value, 2);
return int;
}
Die Bitmaske liegt nun als Integer-Wert vor, so dass die Prüfung auf Fehlerzustände problemlos möglich ist. Möchte man beispielsweise prüfen, ob das vorletzte Bit (2^1=2) gesetzt ist, kann dies mit folgendem Trigger-Ausdruck gemacht werden:
# Check if a specific bit of item "bitmask_item" is set
{host:bitmask_item.band(,2)}=2