Перейти к основному содержимому

Мониторинг и оповещения

Оповещения об использовании аппаратных ресурсов сервера.

Введение​

Сервер Netuno содержит встроенный механизм мониторинга производительности, который позволяет анализировать влияние программной системы на потребление аппаратных ресурсов.

Мониторинг позволяет приложениям реализовывать правила оповещений, чтобы выдавать предупреждение, когда какой-либо показатель достигает уровня, требующего внимания.

Мониторинг и оповещения выполняются не только по данным производительности самого процесса сервера Netuno, но и по всей системе работающего компьютера.

Таким образом, обеспечивается полный мониторинг с оповещениями.

Настройка​

Общая настройка позволяет включить отображение данных в общих логах Netuno и управлять интервалом сбора и анализа показателей производительности.

Настройка оповещений выполняется в каждом приложении и позволяет задавать несколько оповещений для одного приложения.

Логи и общий интервал​

Netuno сохраняет логи производительности в папке logs, расположенной в корневой папке Netuno.

В этой папке logs находятся файлы stats-ГОД_МЕСЯЦ_ДЕНЬ.json; они всегда создаются автоматически с интервалом, который можно изменить, как указано ниже.

Для лучшего просмотра файлов можно использовать автоматическое форматирование в вашем предпочитаемом редакторе или онлайн-инструменты, например:

Их также можно открыть в Firefox, который отлично выполняет форматирование.

Настройка логов и общего интервала​

Чтобы включить отображение данных производительности в общих логах (logs/netuno.log) и в консоли, отредактируйте файл config.js, расположенный в корневой папке Netuno.

Добавьте следующую строку, если её ещё нет:

config.monitorLog = true

Также можно изменить интервал по умолчанию в 60 секунд, то есть информация записывается в лог только раз в минуту. Для этого добавьте приведённую ниже строку кода и измените значение секунд на нужное время:

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://APP-NAME.local.netu.no:9000/services/мой-сервис-оповещения"
}
]
}
...

Это самая упрощённая конфигурация.

Когда возникает ситуация, требующая оповещения, вызывается этот url и передаются параметры производительности.

По умолчанию для каждого типа оповещения установлен интервал 1 ч; оповещение срабатывает только если Процессор, Память или Диск (HD) превышают порог 90% максимальной ёмкости. По истечении часа будет отправлено новое оповещение.

При нескольких оповещениях интервал сокращается. Например, если было вызвано оповещение по памяти, а через 20 минут диск также превысил 90%, немедленно срабатывает новое оповещение, и часовой интервал начинается заново.

Расширенные оповещения​

Ниже приведена более расширенная конфигурация, позволяющая изменить интервал и пороги потребления Процессора, Памяти или Диска (HD):

...
"monitor": {
"alerts": [
{
"name": "моё-оповещение-простое",
"url": "http://APP-NAME.local.netu.no:9000/services/мой-сервис-оповещения"
},
{
"name": "моё-оповещение-расширенное",
"url": "http://APP-NAME.local.netu.no:9000/services/мой-сервис-оповещения",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": 90,
"memory": 90,
"disk": 90
}
},
{
"name": "моё-оповещение-более-расширенное",
"url": "http://APP-NAME.local.netu.no:9000/services/мой-сервис-оповещения",
"enabled": true,
"interval": 3600,
"threshold": {
"cpu": {
"system": 90,
"process": 90
},
"memory": {
"system": 90,
"process": 90
},
"disk": 90
}
}
]
}
...

Приведённые выше значения являются значениями по умолчанию!

Name​

Идентификационное имя оповещения.

Enabled​

Позволяет включать и отключать оповещение; по умолчанию — true (включено).

Interval​

Определяет интервал между оповещениями в секундах; по умолчанию — 3600 секунд (один час).

Threshold​

Определяет пороги для CPU, памяти и диска (HD).

CPU​

Порог потребления CPU, при котором должно срабатывать оповещение.

Также позволяет задать отдельный порог для system и process.

Memory​

Порог потребления памяти, при котором должно срабатывать оповещение.

Также позволяет задать отдельный порог для system и process.

System​

Это пороги для операционной системы в целом со всеми работающими процессами.

Process​

Это пороги только для процесса сервера Netuno.

Disk​

Порог потребления диска (HD), при котором должно срабатывать оповещение.

Передаваемые параметры​

Когда вызывается url, потому что был превышен некоторый порог и сработало оповещение, передаются данные производительности потребления аппаратных ресурсов.

url вызывается методом POST, а содержимое отправляется в JSON: Content-Type: application/json.

Пример JSON с данными, который отправляется на url оповещений:

{
"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
}
}

Описание параметров​

Key​

Имя (ключ), заданное в конфигурации оповещения приложения.

App​

Имя приложения, в котором настроено оповещение и которое вызывает его срабатывание.

Hostname​

Имя компьютера, на котором работает сервер Netuno, вызвавший оповещение.

Timezone​

Часовой пояс компьютера, на котором работает сервер Netuno и который вызвал оповещение.

Started​

Дата и время запуска сервера Netuno.

Moment​

Дата и время формирования оповещения.

Before​

Информация о предыдущем оповещении; имеет точно такую же структуру JSON, но с данными о ранее вызванном оповещении.

Alerts​

Список сработавших оповещений, где указывается тип (type) оповещения и превышенный порог (threshold).

Типы оповещений:

  • cpu-system: Оповещение о потреблении CPU системой компьютера со всеми работающими процессами в целом.
  • cpu-process: Оповещение о потреблении CPU процессом сервера Netuno.
  • memory-system: Оповещение о потреблении памяти системой компьютера со всеми работающими процессами в целом.
  • memory-process: Оповещение о потреблении памяти процессом сервера Netuno.
  • disk: Оповещение о диске (HD).
CPU​

Это данные процессора, которые передаются со следующей информацией:

  • cores: Количество физических процессоров.
  • vcores: Количество виртуальных процессоров (потоков).
  • load: Информация о нагрузке процессора:
    • system: Нагрузка обработки операционной системы со всеми процессами в целом; значение от 0 (0%) до 1 (100%).
    • process: Нагрузка обработки сервера Netuno; значение от 0 (0%) до 1 (100%).
    • ticks: Возвращает нагрузку процессора в системе в целом в виде массива из восьми элементов, которые представляют в миллисекундах время, затраченное в следующих состояниях: 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 (Hertz), KHz (Kilohertz), MGz (Megahertz), GHz (Gigahertz)

Memory​

Это данные памяти, которые передаются со следующей информацией:

  • 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 (Bytes), KB (Kilobytes), MB (Megabytes), GB (Gigabytes)

Disk​

Это данные использования жёсткого диска (HD), которые передаются со следующей информацией:

  • total: Общий размер диска.
  • used: Объём используемого пространства на диске.
  • free: Объём свободного пространства на диске.

Значения указаны в байтах, поэтому 500068036608 байт соответствуют 465,72 гигабайтам.

Как выполняется деление:

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

B (Bytes), KB (Kilobytes), MB (Megabytes), GB (Gigabytes)

Пример сервисов оповещений​

Сервисы 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": "оповещение-email",
"url": "http://MY-APP.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 нагрузкаCpuСистемы = Math.round(cpu.getValues("load").getFloat("system") * 100)
const нагрузкаCpuПроцесса = Math.round(cpu.getValues("load").getFloat("process") * 100)
const свободнаяПамятьСистемы = Math.round(memory.getValues("system").getLong("free") / 1024 / 1024)
const свободнаяПамятьПроцесса = Math.round(memory.getValues("process").getLong("free") / 1024 / 1024)
const свободноеМестоНаДиске = Math.round(disk.getLong("free") / 1024 / 1024)

let типыТем = ""
let htmlСведения = ""

for (const типОповещения of _req.getValues("alerts")) {
if (типыТем != "") {
типыТем += ", "
}
if (типОповещения.getString("type") == 'cpu-system') {
типыТем += "CPU системы"
htmlСведения += `<p>Процессор <b>системы</b> достигает <b>${нагрузкаCpuСистемы}%</b></p>`
}
if (типОповещения.getString("type") == 'cpu-process') {
типыТем += "CPU процесса"
htmlСведения += `<p>Процессор <b>процесса</b> достигает <b>${нагрузкаCpuПроцесса}%</b></p>`
}
if (типОповещения.getString("type") == 'memory-system') {
типыТем += "Память системы"
htmlСведения += `В <b>системе</b> свободно только <b>${свободнаяПамятьСистемы} MB</b> памяти.`
}
if (типОповещения.getString("type") == 'memory-process') {
типыТем += "Память процесса"
htmlСведения += `В памяти процесса свободно только <b>${свободнаяПамятьПроцесса} MB</b>.`
}
if (типОповещения.getString("type") == 'disk') {
типыТем += "Диск"
htmlСведения += `На диске свободно только <b>${свободноеМестоНаДиске} MB</b>.`
}
}

const smtp = _smtp.init("alert")

smtp.subject += `${_req.getString("hostname")} - ${типыТем}`

smtp.html += `<h2>${_req.getString("hostname")}</h2>${htmlСведения}`

smtp.text = "Информация в HTML-версии этого письма."

smtp.send()

Будет отправлено письмо с оповещениями.

В этом случае потребовалось оповестить только о ситуации со свободным местом на диске, как видно из полученного письма:

письмо

Для реализации отправки SMS есть примеры в демонстрационном приложении с интеграцией удалённых REST API, что позволяет интегрироваться с предпочитаемой платформой SMS.