모니터링 및 알림
서버 하드웨어 사용량에 대한 알림 체계입니다.
소개
Netuno 서버에는 소프트웨어 시스템이 하드웨어 사용량에 미치는 영향을 분석할 수 있는 성능 모니터링 메커니즘이 내장되어 있습니다.
모니터링을 통해 앱은 주의가 필요한 수준에 도달했을 때 알림을 보내는 알림 규칙을 구현할 수 있습니다.
모니터링 및 알림은 Netuno 서버 프로세스 자체의 성능 데이터뿐만 아니라 실행 중인 컴퓨터의 전체 시스템에 대해서도 수행됩니다.
따라서 완전한 모니터링과 알림 체계를 구현할 수 있습니다.
구성
전역 구성에서는 Netuno의 일반 로그에 데이터 표시를 활성화하고 성능 지표 수집 및 분석 실행 간격을 제어할 수 있습니다.
알림 구성은 각 앱에서 수행하며, 애플리케이션별로 여러 알림을 둘 수 있습니다.
로그 및 전역 간격
Netuno는 성능 로그를 Netuno 루트 폴더 안의 logs 폴더에 저장합니다.
이 logs 폴더에서 stats-년_월_일.json 파일을 찾을 수 있습니다. 이 파일은 아래에서 설명할 변경 가능한 간격에 따라 항상 자동으로 생성됩니다.
파일을 더 쉽게 보려면 선호하는 편집기의 자동 서식을 사용하거나 다음과 같은 온라인 도구를 사용할 수 있습니다.
Firefox에서도 열 수 있으며, Firefox는 뛰어난 서식을 제공합니다.
로그 및 전역 간격 구성
성능 데이터를 일반 로그(logs/netuno.log)와 콘솔에 표시하려면 Netuno 폴더 루트에 있는 config.js 파일을 편집하세요.
다음 줄이 없다면 추가하세요.
config.monitorLog = true
기본 간격인 60초를 변경할 수도 있습니다. 즉, 정보는 1분마다 로그에 표시됩니다. 이를 위해 아래 코드 줄도 추가하고 초 값을 원하는 시간으로 변경하세요.
config.monitorInterval = 60
이 간격은 전역이며 앱 알림에 구성된 간격에 영향을 줍니다. 앱 알림 간격은 이 전역 간격보다 작을 수 없습니다.
적용하려면 Netuno 서버를 재시작하세요.
이제 콘솔에 다음과 같은 모니터링 정보가 표시되기 시작합니다.
2020-11-17 14:56:08,109 INFO [Thread-13] cli.Monitor - MONITOR
CPU Load:
System: 19.1% (+19.1%)
Process: 3.9% (+3.9%)
Memory:
System:
Used: 9,525.9MB (58.1% +148.0MB)
Free: 6,858.1MB (41.9% -148.0MB)
Process:
Total: 384.0MB (9.4% +126.0MB)
Used: 129.6MB (3.2% +18.9MB)
Free: 254.4MB (6.2% +107.1MB)
GC: false
Disk:
Used: 465,047.8MB (97.5% +21.3MB)
Free: 11,854.3MB (2.5% -21.3MB)
앱의 알림
알림은 애플리케이션에서 구성하므로 앱 구성을 편집하세요.
즉, 애플리케이션 내의 config 폴더에서 환경 구성 파일인 다음 파일에 추가합니다.
- _development.json
- _production.json
모니터링 알림 구성을 추가하세요.
...
"monitor": {
"alerts": [
{
"name": "내-알림",
"url": "http://내-앱.local.netu.no:9000/services/내-알림-서비스"
}
]
}
...
가장 단순한 구성입니다.
알림이 필요한 상황이 발생하면 해당 url이 호출되고 성능 매개변수가 전달됩니다.
기본적으로 각 알림 유형에는 1시간 간격이 있습니다. 따라서 프로세서, 메모리 또는 디스크(HD)가 최대 용량의 90% 한도를 초과한 경우에만 알림이 발생하며, 1시간이 지나면 또 다른 알림을 보냅니다.
여러 알림이 발생하는 상황에서는 간격이 단축됩니다. 예를 들어 메모리 알림이 발생한 뒤 20분이 지났을 때 디스크도 90%를 초과하면 즉시 새 알림이 발생하고 1시간 간격이 다시 시작됩니다.
고급 알림
다음은 프로세서, 메모리 또는 디스크(HD) 사용량의 간격과 한도를 변경할 수 있는 더 고급 구성입니다.
...
"monitor": {
"alerts": [
{
"name": "내-간단-알림",
"url": "http://내-앱.local.netu.no:9000/services/내-알림-서비스"
},
{
"name": "내-고급-알림",
"url": "http://내-앱.local.netu.no:9000/services/내-알림-서비스",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": 90,
"memory": 90,
"disk": 90
}
},
{
"name": "내-더-고급-알림",
"url": "http://내-앱.local.netu.no:9000/services/내-알림-서비스",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": {
"system": 90,
"process": 90
},
"memory": {
"system": 90,
"process": 90
},
"disk": 90
}
}
]
}
...
위 값은 기본값입니다!
이름
알림의 식별 이름입니다.
활성화
알림을 활성화하거나 비활성화합니다. 기본값은 true(활성)입니다.
간격
알림 사이의 간격을 초 단위로 정의합니다. 기본값은 3600초(1시간)입니다.
임계값
CPU, 메모리 및 디스크(HD)의 한도를 정의합니다.
CPU
알림이 발생해야 하는 CPU 사용량 한도입니다.
system 및 _process_에 대한 별도 한도도 정의할 수 있습니다.
메모리
알림이 발생해야 하는 메모리 사용량 한도입니다.
system 및 _process_에 대한 별도 한도도 정의할 수 있습니다.
시스템
실행 중인 모든 프로세스를 포함한 운영 체제 전반의 한도입니다.
프로세스
Netuno 서버 프로세스에만 적용되는 한도입니다.
디스크
알림이 발생해야 하는 디스크(HD) 사용량 한도입니다.
전송되는 매개변수
어떤 한도가 초과되어 url이 호출되면 알림이 발생하며, 하드웨어 사용량의 성능 데이터가 전송됩니다.
url은 POST 메서드로 실행되며 콘텐츠는 JSON으로 전송됩니다: Content-Type: application/json.
알림 url로 전송되는 데이터의 JSON 예시:
{
"key": "내-간단-알림",
"app": "내-앱",
"hostname": "내-컴퓨터",
"timezone": "Europe/Lisbon",
"started": "2020-11-17 14:55:07.682",
"moment": "2020-11-17 14:56:08.098",
"before": {
...
},
"alerts": [
{
"threshold": 90,
"type": "cpu-system"
},
{
"threshold": 90,
"type": "disk"
}
],
"cpu": {
"cores": 4,
"vcores": 8,
"load": {
"system": 0.91311,
"process": 0.03945,
"ticks": [ 575084, 0, 260470, 6796463, 0, 0, 0, 0 ],
"frequency": {
"average": 2500000000,
"max": 2500000000
}
}
},
"memory": {
"system": {
"total": 17179869184,
"used": 9988640768,
"free": 7191228416
},
"process": {
"total": 402653184,
"max": 4294967296,
"used": 135885832,
"free": 266767352,
"gc": false
}
},
"disk": {
"total": 500068036608,
"used": 487637929984,
"free": 12430106624
}
}
매개변수 설명
키
애플리케이션의 알림 구성에 정의된 이름(키)입니다.
앱
알림이 구성되어 있고 해당 알림 발생을 일으킨 애플리케이션의 이름입니다.
호스트 이름
알림을 발생시키는 Netuno 서버가 실행 중인 컴퓨터의 이름입니다.
시간대
알림을 발생시키는 Netuno 서버가 실행 중인 컴퓨터의 시간대입니다.
시작 시각
Netuno 서버가 시작된 날짜 및 시간입니다.
발생 시각
알림이 생성된 시점의 날짜 및 시간입니다.
이전 알림
이전 알림 정보입니다. JSON 구조는 완전히 동일하지만 이전에 발생한 알림에 대한 데이터를 담고 있습니다.
알림
발생한 알림 목록으로, 알림의 유형(type)과 초과된 한도(threshold)를 지정합니다.
알림 유형은 다음과 같습니다.
cpu-system: 실행 중인 모든 프로세스를 포함한 컴퓨터 시스템 전체의 CPU 사용량 알림입니다.cpu-process: Netuno 서버 프로세스의 CPU 사용량 알림입니다.memory-system: 실행 중인 모든 프로세스를 포함한 컴퓨터 시스템 전체의 메모리 사용량 알림입니다.memory-process: Netuno 서버 프로세스의 메모리 사용량 알림입니다.disk: 디스크(HD) 알림입니다.
CPU
다음 정보와 함께 전송되는 프로세서 데이터입니다.
cores: 물리 프로세서 수.vcores: 가상 프로세서(스레드) 수.load: 프로세서 부하 정보:system: 실행 중인 모든 프로세스를 포함한 운영 체제의 처리 부하이며, 값은 0(0%)에서 1(100%) 사이입니다.process: Netuno 서버의 처리 부하이며, 값은 0(0%)에서 1(100%) 사이입니다.ticks: 시스템 전반의 프로세서 부하를 8개 요소의 배열로 반환하며, 다음 상태에서 소비된 시간을 밀리초 단위로 나타냅니다: User(0), Nice(1), System(2), Idle(3), IOwait(4), Hardware interrupts (IRQ)(5), Software interrupts/DPC (SoftIRQ)(6), Steal(7).frequency: 프로세서의 최대 주파수(max)와 모든 코어에서 사용된 평균 주파수(average)입니다. 값은 헤르츠 단위이므로 2500000000 _Hz_는 2.5 _GHz_에 해당합니다.
주파수 나누기는 다음과 같이 수행됩니다.
2500000000 (Hz) / 1000 (KHz) / (1000) (MGz) / 1000 (GHz) = 2.5 GHz
Hz(헤르츠), KHz(킬로헤르츠), MGz(메가헤르츠), GHz(기가헤르츠)
메모리
다음 정보와 함께 전송되는 메모리 데이터입니다.
system: 실행 중인 모든 프로세스를 포함한 운영 체제의 메모리 사용량 정보입니다.total: 컴퓨터의 전체 메모리.used: 사용 중으로 할당된 메모리.free: 사용 가능한 여유 메모리.
process: Netuno 서버 프로세스의 메모리 사용량 데이터입니다.max: Netuno가 사용할 수 있는 최대 메모리 양.total: 예약(할당)된 총 메모리로, 사용 중인 메모리와 "여유" 메모리를 포함합니다.used: 실제로 사용 중인 메모리 양.free: 사용 가능한 여유(예약된) 메모리 양.gc: garbage collector(메모리 가비지 수집기) 실행이 호출되었는지 여부.
값은 바이트 단위이므로 17179869184바이트는 16기가바이트에 해당합니다.
나누기는 다음과 같이 수행됩니다.
17179869184 B / 1024 (KB) / 1024 (MB) / 1024 (GB) = 16 GB
B(바이트), KB(킬로바이트), MB(메가바이트), GB(기가바이트)
디스크
다음 정보와 함께 전송되는 하드 디스크(HD) 사용량 데이터입니다.
total: 디스크의 전체 크기.used: 디스크에서 사용된 공간의 양.free: 디스크에서 사용 가능한 공간의 양.
값은 바이트 단위이므로 500068036608바이트는 465.72기가바이트에 해당합니다.
나누기는 다음과 같이 수행됩니다.
500068036608 B / 1024 (KB) / 1024 (MB) / 1024 (GB) = 465.72 GB
B(바이트), KB(킬로바이트), MB(메가바이트), GB(기가바이트)
알림 서비스 예시
Netuno 서비스는 알림의 url로 사용할 수 있습니다.
이메일, SMS를 통한 알림 전송을 구현하거나 정보를 데이터베이스에 저장할 수도 있습니다.
또한 모든 유형의 url을 사용할 수 있으므로 NodeJS, PHP, .NET, Rails, Laravel, Sails 등 다른 기술로도 알림을 발생시킬 수 있습니다...
Netuno의 경우 이메일 발송 튜토리얼의 안내에 따라 이메일 전송 서비스를 구현할 수 있습니다.
다음은 모니터링 알림에 맞춘 완전한 구현 예시입니다.
시작하기 전에 애플리케이션 구성에 SMTP 구성이 있고 모니터링 구성도 있는지 확인하세요. 예:
...
"smtp": {
"alert": {
"enabled": true,
"host": "내.서버.com",
"port": 465,
"ssl": true,
"subjectPrefix": "알림: ",
"from": "noreply@내.도메인.com",
"to": "info@내.도메인.com",
"username": "noreply@내.도메인.com",
"password": "S3gr3d0"
}
},
...
"monitor": {
"alerts": [
{
"name": "이메일-알림",
"url": "http://내-앱.local.netu.no:9000/services/monitor/alert"
}
]
}
...
특히 강조된 값의 매개변수를 조정해야 합니다.
알림 서비스는 server/services/monitor/alert.js에 다음 코드로 둘 수 있습니다.
_log.info("모니터 알림 정보:\n"+ _req.toJSON())
const cpu = _req.getValues("cpu")
const memory = _req.getValues("memory")
const disk = _req.getValues("disk")
const cpuLoadSystem = Math.round(cpu.getValues("load").getFloat("system") * 100)
const cpuLoadProcess = Math.round(cpu.getValues("load").getFloat("process") * 100)
const memorySystemFree = Math.round(memory.getValues("system").getLong("free") / 1024 / 1024)
const memoryProcessFree = Math.round(memory.getValues("process").getLong("free") / 1024 / 1024)
const diskFree = Math.round(disk.getLong("free") / 1024 / 1024)
let subjectTypes = ""
let htmlInfos = ""
for (const alertType of _req.getValues("alerts")) {
if (subjectTypes != "") {
subjectTypes += ", "
}
if (alertType.getString("type") == 'cpu-system') {
subjectTypes += "시스템 CPU"
htmlInfos += `<p><b>시스템</b> 프로세서가 <b>${cpuLoadSystem}%</b>에 도달했습니다.</p>`
}
if (alertType.getString("type") == 'cpu-process') {
subjectTypes += "프로세스 CPU"
htmlInfos += `<p><b>프로세스</b> 프로세서가 <b>${cpuLoadProcess}%</b>에 도달했습니다.</p>`
}
if (alertType.getString("type") == 'memory-system') {
subjectTypes += "시스템 메모리"
htmlInfos += `<b>시스템</b> 메모리가 <b>${memorySystemFree} MB</b>만 남았습니다.`
}
if (alertType.getString("type") == 'memory-process') {
subjectTypes += "프로세스 메모리"
htmlInfos += `프로세스 메모리가 <b>${memoryProcessFree} MB</b>만 남았습니다.`
}
if (alertType.getString("type") == 'disk') {
subjectTypes += "디스크"
htmlInfos += `디스크가 <b>${diskFree} MB</b>만 남았습니다.`
}
}
const smtp = _smtp.init("alert")
smtp.subject += `${_req.getString("hostname")} - ${subjectTypes}`
smtp.html += `<h2>${_req.getString("hostname")}</h2>${htmlInfos}`
smtp.text = "이 이메일의 HTML 콘텐츠 버전에서 정보를 확인하세요."
smtp.send()
알림이 포함된 메일이 전송됩니다.
이 경우 디스크 공간 상황만 알릴 필요가 있었으며, 수신된 이메일에서 볼 수 있습니다.

SMS 전송을 구현하려면 원격 REST API 통합이 포함된 데모 애플리케이션에 예제가 있으며, 선호하는 SMS 플랫폼과 통합할 수 있습니다.