5 JavaScript 전처리
원본 보기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 값을 반환하면 입력 값이 폐기되며, 이는 '실패 시 사용자 정의' 동작의 '값 폐기' 전처리와 유사합니다.
값/객체를 던져서(일반적으로 문자열이나 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
}
}