문서
원본 보기5 JavaScript 전처리
개요
이 섹션은 JavaScript에 의한 전처리에 대한 세부 정보를 제공합니다.
전처리 JavaScript에서 선언되지 않은 할당을 사용하지 마세요.
지역 변수를 선언할 때는 var를 사용하세요.
JavaScript 전처리
JavaScript 전처리는 단일 매개변수 'value'와 사용자 제공 함수 본문을 사용하여 JavaScript 함수를 호출함으로써 수행됩니다. 전처리 단계 결과는 이 함수가 반환하는 값입니다. 예를 들어, 화씨에서 섭씨로 변환을 수행하려면 다음과 같이 입력합니다:
return (value - 32) * 5 / 9
JavaScript 전처리 매개변수에서, 이는 서버에 의해 JavaScript 함수로 감싸집니다:
function (value)
{
return (value - 32) * 5 / 9
}
입력 매개변수 'value'는 항상 문자열로 전달됩니다. 반환 값은 toString() 메서드를 통해 자동으로 문자열로 강제 변환됩니다(실패할 경우 오류가 문자열 값으로 반환됨). 몇 가지 예외가 있습니다:
- undefined 값을 반환하면 오류가 발생합니다;
- null 값을 반환하면 입력 값이 폐기되며, 이는 'Custom on fail' 액션의 'Discard value' 전처리와 유사합니다.
값/객체를 던짐으로써 오류를 반환할 수 있습니다(일반적으로 문자열 또는 Error 객체).
예를 들어:
if (value == 0)
throw "Zero input value"
return 1/value
각 스크립트는 10초 실행 시간 제한이 있습니다(스크립트에 따라 시간 제한이 발동하는 데 더 오래 걸릴 수 있음). 이를 초과하면 오류가 반환됩니다. 512메가바이트 힙 제한이 적용됩니다.
JavaScript 전처리 단계 바이트코드는 캐시되고 다음에 단계가 적용될 때 재사용됩니다. 아이템의 전처리 단계에 대한 모든 변경 사항은 캐시된 스크립트가 재설정되고 나중에 재컴파일되도록 합니다.
연속적인 런타임 실패(연속 3회)는 한 스크립트가 다음 스크립트의 실행 환경을 손상시킬 가능성을 완화하기 위해 엔진이 재초기화되도록 합니다(이 액션은 DebugLevel 4 이상에서 기록됩니다).
JavaScript 전처리는 Duktape JavaScript 엔진으로 구현됩니다.
스크립트에서 매크로 사용
JavaScript 코드에서 사용자 매크로(그리고 저수준 발견의 컨텍스트에서 LLD 매크로)를 사용할 수 있습니다. 스크립트에 매크로가 포함되어 있으면, 특정 전처리 단계를 실행하기 전에 서버/프록시에서 이러한 매크로를 해결합니다. 프런트엔드에서 전처리 단계를 테스트할 때는 매크로 값이 가져와지지 않으므로 수동으로 입력해야 합니다.
매크로가 해당 값으로 교체될 때 컨텍스트는 무시됩니다. 매크로 값은 코드에 그대로 삽입되며, JavaScript 코드에 값을 배치하기 전에 추가 이스케이프를 추가할 수 없습니다. 이로 인해 경우에 따라 JavaScript 오류가 발생할 수 있으니 주의하시기 바랍니다.
아래 예시에서, 수신된 값이 {$THRESHOLD} 매크로 값을 초과하면, 임계값(있는 경우)이 대신 반환됩니다:
var threshold = '{$THRESHOLD}';
return (!isNaN(threshold) && value > threshold) ? threshold : value;
예제
다음 예제들은 JavaScript 전처리를 어떻게 사용할 수 있는지 보여줍니다.
각 예제에는 간단한 설명, JavaScript 전처리 매개변수를 위한 함수 본문, 그리고 전처리 단계 결과 - 함수에서 반환되는 값이 포함되어 있습니다.
예제 1: 숫자 변환 (과학적 표기법을 정수로)
숫자 "2.62128e+07"을 과학적 표기법에서 정수로 변환합니다.
return (Number(value))
함수에서 반환된 값: 26212800.
예제 2: 숫자 변환 (이진수에서 십진수로)
이진수 "11010010"을 십진수로 변환합니다.
return(parseInt(value,2))
함수에서 반환되는 값: 210.
예제 3: 숫자 반올림
"18.2345" 숫자를 소수점 둘째 자리까지 반올림합니다.
return(Math.round(value* 100) / 100)
함수에서 반환된 값: 18.23.
예제 4: 문자열의 글자 수 세기
"Zabbix" 문자열의 글자 수를 세어보세요.
return (value.length)
함수가 반환하는 값: 6.
예제 5: 남은 시간 구하기
인증서 만료일(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.
예제 6: JSON 속성 제거
"data_size" 또는 "index_size" 키를 가진 모든 속성을 제거하여 JSON 데이터 구조를 수정합니다.
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"
}
]
함수가 반환하는 값:
[
{
"table_name":"history"
},
{
"table_name":"history_log"
}
]
예제 7: Apache 상태를 JSON으로 변환
web.page.get Zabbix 에이전트 아이템(예: 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" 속성을 파싱하여 워커 수를 얻습니다
if (typeof output.Scoreboard === 'string') {
for (var i = 0; i < output.Scoreboard.length; i++) {
var char = output.Scoreboard[i];
workers[char]++;
}
}
// 워커 데이터를 "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
}
}