Przejdź do głównej treści

Monitorowanie i alerty

Alerty dotyczące wykorzystania sprzętu serwera.

Wprowadzenie​

Serwer Netuno zawiera wbudowany mechanizm monitorowania wydajności, który pozwala analizować wpływ systemu oprogramowania na zużycie sprzętu.

Monitorowanie pozwala aplikacjom implementować reguły alertowania, aby powiadamiać, gdy coś osiągnie poziom wymagający uwagi.

Monitorowanie i alerty dotyczą nie tylko danych wydajnościowych procesu serwera Netuno, ale także całego systemu działającego komputera.

Pozwala to więc na pełne monitorowanie wraz z alertowaniem.

Konfiguracja​

Konfiguracja ogólna pozwala włączyć prezentację danych w logach ogólnych Netuno oraz kontrolować interwał wykonywania zbierania i analizy wskaźników wydajności.

Konfiguracja alertów jest wykonywana w każdej aplikacji i pozwala mieć wiele alertów na aplikację.

Logi i interwał ogólny​

Netuno przechowuje logi wydajności w katalogu logs, który znajduje się w katalogu głównym Netuno.

W tym katalogu logs znajdują się pliki stats-ROK_MIESIAC_DZIEN.json, które są zawsze generowane automatycznie zgodnie z interwałem, który można zmienić w sposób opisany poniżej.

Aby lepiej wyświetlić pliki, możesz użyć automatycznego formatowania w swoim ulubionym edytorze lub skorzystać z narzędzi online, takich jak:

Można je również otworzyć w Firefox, który zapewnia doskonałe formatowanie.

Konfiguracja logów i interwału ogólnego​

Aby włączyć prezentację danych wydajnościowych w logach ogólnych (logs/netuno.log) i w konsoli, edytuj plik config.js znajdujący się w katalogu głównym Netuno.

Dodaj następujący wiersz, jeśli jeszcze nie istnieje:

config.monitorLog = true

Możesz także zmienić domyślny interwał 60 sekund, czyli informacje są zapisywane w logu tylko raz na minutę. W tym celu dodaj również poniższy wiersz kodu i zmień wartość sekund na żądany czas:

config.monitorInterval = 60

Ten interwał jest ogólny i wpływa na interwał skonfigurowany w alertach aplikacji, który nigdy nie będzie krótszy niż ten interwał ogólny.

Uruchom ponownie serwer Netuno, aby zmiany zaczęły obowiązywać.

W konsoli zaczną być prezentowane informacje monitorowania, na przykład:

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)

Alerty w aplikacjach​

Alerty są konfigurowane w aplikacjach, więc edytuj konfigurację swojej aplikacji.

Czyli w aplikacji, w katalogu config, w konfiguracji środowiska, w plikach takich jak:

  • _development.json
  • _production.json

Dodaj konfigurację alertów monitorowania:

...
"monitor": {
"alerts": [
{
"name": "moj-alert",
"url": "http://NAZWA-APLIKACJI.local.netu.no:9000/services/moj-serwis-alertu"
}
]
}
...

To jest najprostsza konfiguracja.

Gdy wystąpi sytuacja wymagająca alertu, wywołany zostanie ten url i przekazane zostaną parametry wydajnościowe.

Domyślnie alerty mają interwał 1 godziny dla każdego typu alertu, więc alert zostanie wywołany tylko wtedy, gdy procesor, pamięć lub dysk (HD) przekroczy limit 90% maksymalnej pojemności; po upływie godziny zostanie wysłany kolejny alert.

W sytuacjach z wieloma alertami interwał ulega skróceniu; na przykład jeśli został wywołany alert pamięci, a po 20 minutach dysk również przekroczy 90%, natychmiast zostanie wywołany nowy alert, a interwał 1 godziny rozpocznie się od nowa.

Zaawansowane alerty​

Poniżej znajduje się bardziej zaawansowana konfiguracja, która pozwala zmienić interwał i limity zużycia procesora, pamięci lub dysku (HD):

...
"monitor": {
"alerts": [
{
"name": "moj-alert-prosty",
"url": "http://NAZWA-APLIKACJI.local.netu.no:9000/services/moj-serwis-alertu"
},
{
"name": "moj-alert-zaawansowany",
"url": "http://NAZWA-APLIKACJI.local.netu.no:9000/services/moj-serwis-alertu",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": 90,
"memory": 90,
"disk": 90
}
},
{
"name": "moj-alert-bardziej-zaawansowany",
"url": "http://NAZWA-APLIKACJI.local.netu.no:9000/services/moj-serwis-alertu",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": {
"system": 90,
"process": 90
},
"memory": {
"system": 90,
"process": 90
},
"disk": 90
}
}
]
}
...

Powyższe wartości są wartościami domyślnymi!

Nazwa​

Nazwa identyfikująca alert.

Włączone​

Pozwala włączyć i wyłączyć alert; domyślnie jest to true (aktywny).

Interwał​

Określa interwał między alertami w sekundach; domyślnie jest to 3600 sekund (jedna godzina).

Próg​

Określa limity CPU, pamięci i dysku (HD).

CPU​

Limit zużycia CPU, przy którym powinien zostać wywołany alert.

Pozwala także zdefiniować osobny limit dla system i process.

Pamięć​

Limit zużycia pamięci, przy którym powinien zostać wywołany alert.

Pozwala także zdefiniować osobny limit dla system i process.

System​

Są to limity dla całego systemu operacyjnego ze wszystkimi uruchomionymi procesami.

Proces​

Są to limity wyłącznie dla procesu serwera Netuno.

Dysk​

Limit zużycia dysku (HD), przy którym powinien zostać wywołany alert.

Wysyłane parametry​

Gdy wywoływany jest url, oznacza to, że został przekroczony jakiś limit i wywołano alert; wysyłane są wtedy dane wydajnościowe dotyczące zużycia sprzętu.

Adres url jest wywoływany metodą POST, a zawartość jest wysyłana w formacie JSON: Content-Type: application/json.

Przykład JSON z danymi wysyłanymi na url alertów:

{
"key": "moj-alert-prosty",
"app": "moja-aplikacja",
"hostname": "moj-komputer",
"timezone": "Europe/Warsaw",
"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
}
}

Opis parametrów​

Klucz​

Nazwa (klucz) zdefiniowana w konfiguracji alertu w aplikacji.

Aplikacja​

Nazwa aplikacji, w której skonfigurowano alert i która powoduje jego wywołanie.

Nazwa hosta​

Nazwa komputera, na którym uruchomiony jest serwer Netuno powodujący alert.

Strefa czasowa​

Strefa czasowa komputera, na którym uruchomiony jest serwer Netuno powodujący alert.

Rozpoczęto​

Data i godzina uruchomienia serwera Netuno.

Moment​

Data i godzina wygenerowania alertu.

Poprzedni alert​

Informacje o poprzednim alercie; mają dokładnie taką samą strukturę JSON, ale zawierają dane dotyczące wcześniej wywołanego alertu.

Alerty​

Lista alertów, które zostały wywołane; określa typ (type) alertu i przekroczony limit (threshold).

Typy alertów to:

  • cpu-system: Alert dotyczący zużycia CPU przez system komputerowy ze wszystkimi uruchomionymi procesami ogólnie.
  • cpu-process: Alert dotyczący zużycia CPU przez proces serwera Netuno.
  • memory-system: Alert dotyczący zużycia pamięci przez system komputerowy ze wszystkimi uruchomionymi procesami ogólnie.
  • memory-process: Alert dotyczący zużycia pamięci przez proces serwera Netuno.
  • disk: Alert dotyczący dysku (HD).
CPU​

Są to dane procesora wysyłane z następującymi informacjami:

  • cores: Liczba procesorów fizycznych.
  • vcores: Liczba procesorów wirtualnych (wątków).
  • load: Informacje o obciążeniu procesora:
    • system: Obciążenie procesora systemu operacyjnego ze wszystkimi procesami ogólnie; wartość mieści się między 0 (0%) a 1 (100%).
    • process: Obciążenie procesora serwera Netuno; wartość mieści się między 0 (0%) a 1 (100%).
    • ticks: Zwraca obciążenie procesora w całym systemie w postaci tablicy ośmiu elementów, która przedstawia w milisekundach czas zużyty w następujących stanach: User (0), Nice (1), System (2), Idle (3), IOwait (4), Hardware interrupts (IRQ) (5), Software interrupts/DPC (SoftIRQ) (6) i Steal (7).
    • frequency: Maksymalna częstotliwość (max) procesora oraz średnia częstotliwość używana przez wszystkie rdzenie (average); wartości są w hercach, więc 2500000000 Hz odpowiada 2,5 GHz.

Podział częstotliwości wykonuje się w następujący sposób:

2500000000 (Hz) / 1000 (KHz) / (1000) (MGz) / 1000 (GHz) = 2.5 GHz

Hz (herce), KHz (kiloherce), MGz (megaherce), GHz (gigaherce)

Pamięć​

Są to dane pamięci wysyłane z następującymi informacjami:

  • system: Informacje o zużyciu pamięci systemu operacyjnego ze wszystkimi procesami ogólnie.
    • total: Całkowita pamięć komputera.
    • used: Pamięć przydzielona do użycia.
    • free: Dostępna wolna pamięć.
  • process: Dane dotyczące wykorzystania pamięci przez proces serwera Netuno.
    • max: Maksymalna ilość pamięci, jaką może wykorzystać Netuno.
    • total: Całkowita pamięć zarezerwowana (przydzielona), obejmuje pamięć używaną i „wolną”.
    • used: Ilość pamięci faktycznie używanej.
    • free: Ilość wolnej (zarezerwowanej) pamięci dostępnej do wykorzystania.
    • gc: Czy uruchomiono garbage collector (mechanizm odśmiecania pamięci).

Wartości są w bajtach, więc 17179869184 bajtów odpowiada 16 gigabajtom.

Jak wykonuje się podział:

17179869184 B / 1024 (KB) / 1024 (MB) / 1024 (GB) = 16 GB

B (bajty), KB (kilobajty), MB (megabajty), GB (gigabajty)

Dysk​

Są to dane wykorzystania dysku twardego (HD) wysyłane z następującymi informacjami:

  • total: Całkowity rozmiar dysku.
  • used: Ilość zajętego miejsca na dysku.
  • free: Ilość dostępnego miejsca na dysku.

Wartości są w bajtach, więc 500068036608 bajtów odpowiada 465,72 gigabajta.

Jak wykonuje się podział:

500068036608 B / 1024 (KB) / 1024 (MB) / 1024 (GB) = 465,72 GB

B (bajty), KB (kilobajty), MB (megabajty), GB (gigabajty)

Przykład usług alertowania​

Usługi Netuno mogą być używane jako url alertów.

Można zaimplementować wysyłanie alertów przez e-mail, SMS, a nawet zapisywanie informacji w bazie danych.

Można również użyć dowolnego typu url, dzięki czemu alert może być wysyłany do innych technologii, takich jak NodeJS, PHP, .NET, Rails, Laravel, Sails itd.

W przypadku Netuno można zaimplementować usługę wysyłania e-maili zgodnie ze wskazówkami z tutoriala Wysyłanie e-maili.

Poniżej znajduje się sposób implementacji kompletnego przykładu dostosowanego do alertowania monitorowania.

Przed rozpoczęciem upewnij się, że masz skonfigurowany SMTP w konfiguracji aplikacji, a także konfigurację monitorowania, na przykład:

...
"smtp": {
"alert": {
"enabled": true,
"host": "MOJ.SERWER.com",
"port": 465,
"ssl": true,
"subjectPrefix": "Alert: ",
"from": "noreply@MOJ.DOMENA.com",
"to": "info@MOJ.DOMENA.com",
"username": "noreply@MOJ.DOMENA.com",
"password": "S3gr3d0"
}
},
...
"monitor": {
"alerts": [
{
"name": "alert-email",
"url": "http://MOJA-APLIKACJA.local.netu.no:9000/services/monitor/alert"
}
]
}
...

Upewnij się, że dostosowujesz parametry, zwłaszcza te wyróżnione wielkimi literami w wartościach.

Usługa alertowania może znajdować się w server/services/monitor/alert.js z następującym kodem:

_log.info("Informacje o alercie monitorowania:\n"+ _req.toJSON())

const cpu = _req.getValues("cpu")
const pamiec = _req.getValues("memory")
const dysk = _req.getValues("disk")

const obciazenieCpuSystemu = Math.round(cpu.getValues("load").getFloat("system") * 100)
const obciazenieCpuProcesu = Math.round(cpu.getValues("load").getFloat("process") * 100)
const wolnaPamiecSystemu = Math.round(pamiec.getValues("system").getLong("free") / 1024 / 1024)
const wolnaPamiecProcesu = Math.round(pamiec.getValues("process").getLong("free") / 1024 / 1024)
const wolneMiejsceDysku = Math.round(dysk.getLong("free") / 1024 / 1024)

let typyTematow = ""
let informacjeHtml = ""

for (const typAlertu of _req.getValues("alerts")) {
if (typyTematow != "") {
typyTematow += ", "
}
if (typAlertu.getString("type") == 'cpu-system') {
typyTematow += "CPU systemu"
informacjeHtml += `<p>Procesor <b>systemu</b> osiąga <b>${obciazenieCpuSystemu}%</b></p>`
}
if (typAlertu.getString("type") == 'cpu-process') {
typyTematow += "CPU procesu"
informacjeHtml += `<p>Procesor <b>procesu</b> osiąga <b>${obciazenieCpuProcesu}%</b></p>`
}
if (typAlertu.getString("type") == 'memory-system') {
typyTematow += "Pamięć systemu"
informacjeHtml += `Pamięć <b>systemu</b> ma tylko <b>${wolnaPamiecSystemu} MB</b> wolnej pamięci.`
}
if (typAlertu.getString("type") == 'memory-process') {
typyTematow += "Pamięć procesu"
informacjeHtml += `Pamięć procesu ma tylko <b>${wolnaPamiecProcesu} MB</b> wolnej pamięci.`
}
if (typAlertu.getString("type") == 'disk') {
typyTematow += "Dysk"
informacjeHtml += `Dysk ma tylko <b>${wolneMiejsceDysku} MB</b> wolnego miejsca.`
}
}

const smtp = _smtp.init("alert")

smtp.subject += `${_req.getString("hostname")} - ${typyTematow}`

smtp.html += `<h2>${_req.getString("hostname")}</h2>${informacjeHtml}`

smtp.text = "Informacje znajdują się w wersji HTML tej wiadomości e-mail."

smtp.send()

Zostanie wysłany e-mail z alertami.

W tym przypadku konieczne było jedynie zaalarmowanie o stanie wolnego miejsca na dysku, co można zobaczyć w tej otrzymanej wiadomości e-mail:

e-mail

Aby zaimplementować wysyłkę SMS, w aplikacji demonstracyjnej znajdują się przykłady integracji ze zdalnymi API REST, które pozwalają zintegrować się z wybraną platformą SMS.