Monitorizare și alerte
Alertare privind utilizarea hardware-ului serverului.
Introducere
Serverul Netuno include un mecanism de monitorizare a performanței care permite analizarea impactului sistemului software asupra consumului de hardware.
Monitorizarea permite aplicațiilor să implementeze reguli de alertare pentru a notifica atunci când ceva atinge un prag care necesită atenție.
Monitorizarea și alertele se realizează nu doar asupra datelor de performanță ale procesului serverului Netuno în sine, ci și asupra întregului sistem al calculatorului pe care rulează.
Astfel, permite o monitorizare completă, împreună cu alertarea.
Configurare
Configurația generală permite activarea afișării datelor în logurile generale ale Netuno și controlul intervalului de execuție pentru colectarea și analiza indicatorilor de performanță.
Configurarea alertelor se face în fiecare aplicație și permite existența mai multor alerte per aplicație.
Loguri și interval general
Netuno păstrează logurile de performanță în folderul logs, aflat în folderul rădăcină al Netuno.
În acest folder logs se găsesc fișierele stats-AN_LUNA_ZI.json; acestea sunt generate automat conform intervalului care poate fi modificat după cum se arată în continuare.
Pentru o mai bună vizualizare a fișierelor, puteți utiliza formatarea automată a editorului preferat sau instrumente online precum:
De asemenea, pot fi deschise în Firefox, care realizează o formatare excelentă.
Configurarea logurilor și a intervalului general
Pentru a activa afișarea datelor de performanță în logurile generale (logs/netuno.log) și în consolă, editați fișierul config.js din rădăcina folderului Netuno.
Adăugați următoarea linie, dacă nu există deja:
config.monitorLog = true
De asemenea, puteți modifica intervalul implicit de 60 de secunde, adică informația este afișată în log doar o dată pe minut. Pentru aceasta, adăugați și linia de cod de mai jos și modificați valoarea secundelor la timpul dorit:
config.monitorInterval = 60
Acest interval este general și interferează cu intervalul configurat în alertele aplicațiilor, care nu va fi niciodată mai mic decât acest interval general.
Reporniți serverul Netuno pentru ca modificările să aibă efect.
În consolă va începe să fie afișată informația de monitorizare, de exemplu:
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)
Alerte în aplicații
Alertele se configurează în aplicații, așa că editați configurația aplicației dumneavoastră.
Adică, în interiorul aplicației, în folderul config, în configurația mediului, în fișiere precum:
- _development.json
- _production.json
Adăugați configurația alertelor de monitorizare:
...
"monitor": {
"alerts": [
{
"name": "alerta-mea",
"url": "http://NUME-APLICATIE.local.netu.no:9000/services/serviciu-meu-de-alertare"
}
]
}
...
Aceasta este configurația cea mai simplificată.
Când există o situație care necesită alertare, acel url va fi apelat și vor fi trimise parametrii de performanță.
Implicit, alertele au un interval de 1h pentru fiecare tip de alertă, astfel alerta se va declanșa doar dacă Procesorul, Memoria sau Discul (HD) depășesc limita de 90% din capacitatea maximă; după o oră se va trimite o altă alertă.
În situații cu multiple alerte, intervalul este scurtat; de exemplu, dacă a fost declanșată alerta pentru Memorie și, după 20 de minute, Discul depășește și el 90%, atunci este declanșată imediat o nouă alertă, iar intervalul de 1 oră este reînceput.
Alerte avansate
Mai jos se află o configurație mai avansată care permite modificarea intervalului și a limitelor de consum pentru Procesor, Memorie sau Disc (HD):
...
"monitor": {
"alerts": [
{
"name": "alerta-mea-simpla",
"url": "http://NUME-APLICATIE.local.netu.no:9000/services/serviciu-meu-de-alertare"
},
{
"name": "alerta-mea-avansata",
"url": "http://NUME-APLICATIE.local.netu.no:9000/services/serviciu-meu-de-alertare",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": 90,
"memory": 90,
"disk": 90
}
},
{
"name": "alerta-mea-mai-avansata",
"url": "http://NUME-APLICATIE.local.netu.no:9000/services/serviciu-meu-de-alertare",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": {
"system": 90,
"process": 90
},
"memory": {
"system": 90,
"process": 90
},
"disk": 90
}
}
]
}
...
Valorile de mai sus sunt valori implicite!
Nume
Numele de identificare al alertei.
Activat
Permite activarea și dezactivarea alertei; implicit este true (activă).
Interval
Definește intervalul dintre alerte în secunde; implicit este 3600 de secunde (o oră).
Prag
Definește limitele pentru CPU, Memorie și Disc (HD).
CPU
Limita consumului de CPU la care trebuie declanșată alerta.
Permite, de asemenea, definirea limitei specifice pentru system și pentru process.
Memorie
Limita consumului de Memorie la care trebuie declanșată alerta.
Permite, de asemenea, definirea limitei specifice pentru system și pentru process.
Sistem
Sunt limitele pentru sistemul de operare în general, cu toate procesele în execuție.
Proces
Sunt limitele doar pentru procesul serverului Netuno.
Disc
Limita consumului de Disc (HD) la care trebuie declanșată alerta.
Parametri trimiși
Când un url este invocat, este declanșată o alertă pentru că a fost depășită o limită, astfel sunt trimise datele de performanță privind consumul de hardware.
url este executat cu metoda POST, iar conținutul este trimis în JSON: Content-Type: application/json.
Exemplu de JSON cu datele trimise către url-ul alertelor:
{
"key": "alerta-mea-simpla",
"app": "aplicatia-mea",
"hostname": "calculatorul-meu",
"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
}
}
Descrierea parametrilor
Cheie
Numele (cheia) definit în configurația alertei din aplicație.
Aplicație
Numele aplicației care are alerta configurată și care provoacă declanșarea acesteia.
Nume gazdă
Numele calculatorului pe care rulează serverul Netuno care provoacă alerta.
Fus orar
Fusul orar al calculatorului pe care rulează serverul Netuno și care provoacă alerta.
Pornit
Data și ora la care a fost pornit serverul Netuno.
Moment
Data și ora momentului în care a fost generată alerta.
Anterior
Informațiile alertei anterioare; au exact aceeași structură JSON, dar cu datele referitoare la alerta declanșată anterior.
Alerte
Lista alertelor declanșate, în care se specifică tipul (type) alertei și pragul (threshold) depășit.
Tipurile de alerte sunt:
cpu-system: Alertă privind consumul de CPU al sistemului calculatorului, cu toate procesele în execuție în general.cpu-process: Alertă privind consumul de CPU al procesului serverului Netuno.memory-system: Alertă privind consumul de Memorie al sistemului calculatorului, cu toate procesele în execuție în general.memory-process: Alertă privind consumul de Memorie al procesului serverului Netuno.disk: Alertă privind Discul (HD).
CPU
Sunt datele despre Procesor care sunt trimise cu următoarele informații:
cores: Numărul de procesoare fizice.vcores: Numărul de procesoare virtuale (thread-uri).load: Informații despre încărcarea procesorului:system: Încărcarea de procesare a sistemului de operare cu toate procesele în general; valoarea este între 0 (0%) și 1 (100%).process: Încărcarea de procesare a serverului Netuno; valoarea este între 0 (0%) și 1 (100%).ticks: Returnează încărcarea procesorului în sistemul general într-un tablou cu opt elemente care reprezintă în milisecunde ceea ce a fost consumat în următoarele stări: Utilizator (0), Nice (1), Sistem (2), Inactiv (3), IOwait (4), Întreruperi hardware (IRQ) (5), Întreruperi software/DPC (SoftIRQ) (6) și Steal (7).frequency: Frecvența maximă (max) a procesorului și media frecvenței utilizate între toate core-urile (average); valorile sunt în hertz, deci 2500000000 Hz echivalează cu 2.5 GHz.
Împărțirea frecvenței se realizează astfel:
2500000000 (Hz) / 1000 (KHz) / (1000) (MGz) / 1000 (GHz) = 2.5 GHz
Hz (Hertz), KHz (Kilohertz), MGz (Megahertz), GHz (Gigahertz)
Memorie
Sunt datele despre Memorie care sunt trimise cu următoarele informații:
system: Sunt informațiile despre consumul de memorie al sistemului de operare cu toate procesele în general.total: Memoria totală a calculatorului.used: Memoria alocată în utilizare.free: Memoria disponibilă liberă.
process: Sunt datele de utilizare a memoriei procesului serverului Netuno.max: Cantitatea maximă de memorie care poate fi utilizată de Netuno.total: Totalul memoriei rezervate (alocate), include memoria utilizată și memoria „liberă”.used: Cantitatea de memorie care este realmente utilizată.free: Cantitatea de memorie liberă (rezervată) disponibilă pentru utilizare.gc: Dacă a fost invocată execuția garbage collector (colectorul de deșeuri al memoriei).
Valorile sunt în octeți, deci 17179869184 de octeți echivalează cu 16 gigaocteți.
Cum se realizează împărțirea:
17179869184 B / 1024 (KB) / 1024 (MB) / 1024 (GB) = 16 GB
B (octeți), KB (kiloocteți), MB (megaocteți), GB (gigaocteți)
Disc
Sunt datele de utilizare a discului dur (HD) care sunt trimise cu următoarele informații:
total: Dimensiunea totală a discului.used: Cantitatea de spațiu utilizată pe disc.free: Cantitatea de spațiu disponibilă pe disc.
Valorile sunt în octeți, deci 500068036608 octeți echivalează cu 465,72 gigaocteți.
Cum se realizează împărțirea:
500068036608 B / 1024 (KB) / 1024 (MB) / 1024 (GB) = 465,72 GB
B (octeți), KB (kiloocteți), MB (megaocteți), GB (gigaocteți)
Exemplu de servicii de alertare
Serviciile Netuno pot fi utilizate ca url al alertelor.
Se poate implementa trimiterea alertelor prin e-mail, SMS sau chiar salvarea informațiilor într-o bază de date.
De asemenea, poate fi utilizat orice tip de url, astfel alerta poate fi declanșată către alte tehnologii precum NodeJS, PHP, .NET, Rails, Laravel, Sails etc.
În cazul Netuno, se poate implementa un serviciu pentru trimiterea de e-mailuri urmând indicațiile din tutorialul Trimiterea de e-mailuri.
Mai jos este prezentat un exemplu complet adaptat pentru alertarea de monitorizare.
Înainte de a începe, asigurați-vă că aveți configurația SMTP în configurația aplicației și, de asemenea, configurația monitorizării, de exemplu:
...
"smtp": {
"alert": {
"enabled": true,
"host": "SERVERUL.MEU.com",
"port": 465,
"ssl": true,
"subjectPrefix": "Alertă: ",
"from": "noreply@DOMENIUL.MEU.com",
"to": "info@DOMENIUL.MEU.com",
"username": "noreply@DOMENIUL.MEU.com",
"password": "S3gr3d0"
}
},
...
"monitor": {
"alerts": [
{
"name": "alerta-email",
"url": "http://APLICATIA-MEA.local.netu.no:9000/services/monitor/alertare"
}
]
}
...
Asigurați-vă că ajustați parametrii, în special pe cei evidențiați cu majuscule în valori.
Serviciul de alertare poate fi plasat în server/services/monitor/alertare.js, cu următorul cod:
_log.info("Informații despre alerta de monitorizare:\n"+ _req.toJSON())
const cpu = _req.getValues("cpu")
const memorie = _req.getValues("memory")
const disc = _req.getValues("disk")
const incarcareCpuSistem = Math.round(cpu.getValues("load").getFloat("system") * 100)
const incarcareCpuProces = Math.round(cpu.getValues("load").getFloat("process") * 100)
const memorieSistemLibera = Math.round(memorie.getValues("system").getLong("free") / 1024 / 1024)
const memorieProcesLibera = Math.round(memorie.getValues("process").getLong("free") / 1024 / 1024)
const discLiber = Math.round(disc.getLong("free") / 1024 / 1024)
let tipuriSubiect = ""
let informatiiHtml = ""
for (const tipAlerta of _req.getValues("alerts")) {
if (tipuriSubiect != "") {
tipuriSubiect += ", "
}
if (tipAlerta.getString("type") == 'cpu-system') {
tipuriSubiect += "CPU al sistemului"
informatiiHtml += `<p>Procesorul <b>sistemului</b> atinge <b>${incarcareCpuSistem}%</b></p>`
}
if (tipAlerta.getString("type") == 'cpu-process') {
tipuriSubiect += "CPU al procesului"
informatiiHtml += `<p>Procesorul <b>procesului</b> atinge <b>${incarcareCpuProces}%</b></p>`
}
if (tipAlerta.getString("type") == 'memory-system') {
tipuriSubiect += "Memoria sistemului"
informatiiHtml += `Memoria <b>sistemului</b> are doar <b>${memorieSistemLibera} MB</b> liberi.`
}
if (tipAlerta.getString("type") == 'memory-process') {
tipuriSubiect += "Memoria procesului"
informatiiHtml += `Memoria procesului are doar <b>${memorieProcesLibera} MB</b> liberi.`
}
if (tipAlerta.getString("type") == 'disk') {
tipuriSubiect += "Disc"
informatiiHtml += `Discul are doar <b>${discLiber} MB</b> liberi.`
}
}
const smtp = _smtp.init("alert")
smtp.subject += `${_req.getString("hostname")} - ${tipuriSubiect}`
smtp.html += `<h2>${_req.getString("hostname")}</h2>${informatiiHtml}`
smtp.text = "Informațiile sunt disponibile în versiunea HTML a acestui e-mail."
smtp.send()
Va fi trimis un e-mail cu alertele.
În acest caz a fost necesar să se alerteze doar situația spațiului pe disc, după cum se poate vedea în acest e-mail primit:

Pentru implementarea trimiterii de SMS, există exemple în aplicația de demonstrație cu integrarea de API-uri REST la distanță, care permite integrarea cu platforma SMS preferată.