Мониторинг и оповещения
Оповещения об использовании аппаратных ресурсов сервера.
Введение
Сервер 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.