В этом разделе приведены сведения о предварительной обработке при помощи JavaScript.
Предобработка JavaScript выполняется путём вызова функции JavaScript с единственным параметром «value» и заданным пользователем телом функции. Результатом шага предобработки является значение, которое возвращается из этой функции, например, для выполнения конвертации из градусов Фаренгейта в градусы Цельсия пользователю необходимо ввести:
Это будет обёрнуто сервером в функцию JavaScript :
Входной параметр «value» всегда передаётся как строка. Возвращаемое значение автоматически приводится к строке через метод ToString() (если он завершится с ошибкой, тогда эта ошибка возвращается в виде строкового значения), с несколькими исключениями:
Ошибки можно вернуть при помощи выбрасывания значений/объектов в качестве исключений (обычно это строки или объекты ошибок).
Например:
У каждого скрипта есть 10-секундный тайм-аут — время ожидания выполнения (в зависимости от скрипта, срабатывание тайм-аута может занять более длительное время); превышение времени ожидания вернёт ошибку. Также применяется ограничение heap памяти в 512 мегабайт.
Байт-код шага предобработки JavaScript кэшируется и используется повторно, когда шаг применяется в следующий раз. Любые изменения в шагах предварительной обработки элемента данных вызовут сброс закэшированного скрипта и затем его перекомпиляцию.
Последовательные ошибки во время выполнения (3 раза подряд) вызовут повторную инициализацию механизма для уменьшения вероятности того, что один скрипт сломает всю среду выполнения для следующих скриптов (это действие заносится в журнал с режимом отладки DebugLevel 4 и выше).
Предобработка JavaScript реализована при помощи механизма JavaScript Duktape ([en] https://duktape.org/).
Смотрите также: Дополнительные объекты и глобальные функции JavaScript
В коде JavaScript можно использовать пользовательские макросы. Если скрипт содержит пользовательские макросы, эти макросы раскрываются сервером/прокси до выполнения конкретных шагов предварительной обработки. Обратите внимание, что при тестировании шагов предварительной обработки в веб-интерфейсе значения макросов не извлекаются автоматически и их нужно указывать вручную.
Когда макрос заменяется своим значением, контекст игнорируется. Значение макроса вставляется в код как есть, невозможно добавить дополнительное экранирование до помещения значения в код JavaScript. Поэтому будьте аккуратны, так как в некоторых случаях это может вызвать ошибки в JavaScript.
В примере ниже, если полученное значение превышает значение макроса {$THRESHOLD}, то вместо самого значения возвращается значение порога (если присутствует):
var threshold = '{$THRESHOLD}';
return (!isNaN(threshold) && value > threshold) ? threshold : value;
Следующие примеры иллюстрируют, как можно использовать предобработку JavaScript.
Каждый пример содержит краткое описание, тело функции для параметров предварительной обработки JavaScript и результат шага предварительной обработки — значение, возвращаемое функцией.
Преобразовать число «2.62128e+07» из научной нотации в целое число.
Значение, возвращаемое функцией: 26212800.
Преобразовать двоичное число «11010010» в десятичное.
Значение, возвращаемое функцией: 210.
Округлить число «18.2345» до двух цифр.
Значение, возвращаемое функцией: 18.23.
Подсчитать количество букв в строке «Zabbix».
Значение, возвращаемое функцией: 6.
Получить время (в секундах), оставшееся до момента истечения срока действия сертификата (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);
Значение, возвращаемое функцией: 44380233.
Изменить структуру данных JSON, удалив все свойства с ключом "data_size"
или "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)
Значение, принимаемое функцией:
[
{
"table_name":"history",
"data_size":"326.05",
"index_size":"174.34"
},
{
"table_name":"history_log",
"data_size":"6.02",
"index_size":"3.45"
}
]
Значение, возвращаемое функцией:
Преобразовать значение, полученное от элемента данных агента Zabbix web.page.get (например, web.page.get[http://127.0.0.1:80/server-status?auto]), в объект JSON.
// Преобразовать статус Apache в JSON
// Разбить значение на подстроки и поместить их в массив
var lines = value.split('\n');
// Создать пустой объект «output»
var output = {};
// Создать объект «workers» с предопределёнными свойствами
var workers = {
'_': 0, 'S': 0, 'R': 0, 'W': 0,
'K': 0, 'D': 0, 'C': 0, 'L': 0,
'G': 0, 'I': 0, '.': 0
};
// Добавить подстроки из массива «lines» в объект «output» как свойства (пары ключ-значение)
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]);
}
}
// Метрики мультиверсии
output.ServerUptimeSeconds = output.ServerUptimeSeconds || output.Uptime;
output.ServerVersion = output.ServerVersion || output.Server;
// Парсинг свойства «Scoreboard» для получения количества worker-ов
if (typeof output.Scoreboard === 'string') {
for (var i = 0; i < output.Scoreboard.length; i++) {
var char = output.Scoreboard[i];
workers[char]++;
}
}
// Добавить данные о worker-ах к объекту «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['.']
};
// Вернуть строку JSON
return JSON.stringify(output);
Значение, принятое функцией:
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__..............................................................................................................................................
Значение, возвращаемое функцией:
{
"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
}
}