feat(admin/health): System Health Level 1 — живой мониторинг + вердикт

getHealth обогащён: вердикт здоровья (ok/warning/critical) по порогам
(память %, диск, ошибки/24ч, лаг event-loop, размер БД) + причины; реальный
% памяти, лаг event-loop (perf_hooks), load average, свободное место на диске
(statfs), PID/NODE_ENV, версия+git-commit, число активных SSE-соединений,
размер WAL, разбивка БД по крупнейшим таблицам.

sse.js: экспорт stats() (онлайн-пользователи/гости/соединения).

admin.js loadHealth: светофор-баннер вердикта с причинами, тумблер
авто-обновления (live, поллинг 5с с самоостановкой при уходе с вкладки),
8 карточек (uptime/БД/файлы/ошибки/SSE/память/event-loop/диск), панели
платформы и активности, горизонтальные бары крупнейших таблиц БД.

Проверено: getHealth собирает полный payload, вердикт срабатывает (диск<2ГБ
→ warning), NaN-лаг защищён.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-05-30 18:03:57 +03:00
parent e843a701a6
commit 50ecb6463a
3 changed files with 201 additions and 76 deletions
+11 -1
View File
@@ -79,7 +79,17 @@ function getOnlineUserIds() {
return [...clients.keys()];
}
/* Сводка SSE-соединений для мониторинга: онлайн-пользователи, гости и
суммарное число открытых стримов. */
function stats() {
let conns = 0;
for (const set of clients.values()) conns += set.size;
let guestConns = 0;
for (const set of guestClients.values()) guestConns += set.size;
return { users: clients.size, guests: guestClients.size, connections: conns + guestConns };
}
module.exports = {
addClient, removeClient, emit, emitToClass, getOnlineUserIds,
addClient, removeClient, emit, emitToClass, getOnlineUserIds, stats,
addGuestClient, removeGuestClient, emitToGuests,
};