feat(UptimeMonitor): add uptime monitor scheduler settings and endpoints for improved monitoring functionality
Publish Fast Tabler Docker image / build-and-push-fast (push) Failing after 2m47s

This commit is contained in:
2026-02-22 21:10:50 +07:00
parent 1548de7064
commit 7d3804202f
5 changed files with 270 additions and 1 deletions
+69
View File
@@ -6,6 +6,7 @@ const { sendError, sendOk } = require('../middleware/errorHandler');
const { readS3TextObject, writeS3JsonObject } = require('../services/s3Service');
const networkMapScheduler = require('../services/networkMapScheduler');
const pingServicesScheduler = require('../services/pingServicesScheduler');
const uptimeMonitorScheduler = require('../services/uptimeMonitorScheduler');
const UI_SETTINGS_KEY = 'bgp_data/rt_ui_settings.json';
const NETWORK_MAP_CACHE_KEY = 'network-map-cache/latest.json';
@@ -23,6 +24,11 @@ const PING_SERVICES_SCHEDULER_KEYS = [
'pingServicesSchedulerIntervalMinutes',
];
const UPTIME_MONITOR_SCHEDULER_KEYS = [
'uptimeMonitorSchedulerEnabled',
'uptimeMonitorSchedulerIntervalMinutes',
];
async function readUiSettings() {
try {
const data = await readS3TextObject(UI_SETTINGS_KEY).catch(() => ({ body: '{}' }));
@@ -178,6 +184,66 @@ async function runPingServicesSchedulerNow(req, res) {
}
}
// === Uptime monitor scheduler ===
/** GET /api/scheduler/uptime-monitor/settings */
async function getUptimeMonitorSchedulerSettings(req, res) {
try {
const ui = await readUiSettings();
const settings = uptimeMonitorScheduler.getSettingsFromUiSettings(ui);
const nextRunAt = uptimeMonitorScheduler.getNextRunAt(settings);
return res.json({ ...settings, nextRunAt: nextRunAt || undefined });
} catch (e) {
console.error('[scheduler] getUptimeMonitorSettings', e);
return sendError(res, 500, 'Не удалось прочитать настройки', 'E_SCHEDULER');
}
}
/** PATCH /api/scheduler/uptime-monitor/settings */
async function patchUptimeMonitorSchedulerSettings(req, res) {
try {
const body = req.body || {};
const current = await readUiSettings();
for (const key of UPTIME_MONITOR_SCHEDULER_KEYS) {
if (Object.prototype.hasOwnProperty.call(body, key)) {
current[key] = body[key];
}
}
await writeS3JsonObject(UI_SETTINGS_KEY, current);
const settings = uptimeMonitorScheduler.getSettingsFromUiSettings(current);
return res.json(settings);
} catch (e) {
console.error('[scheduler] patchUptimeMonitorSettings', e);
return sendError(res, 500, 'Не удалось сохранить настройки', 'E_SCHEDULER');
}
}
/** POST /api/scheduler/uptime-monitor/run-now */
async function runUptimeMonitorSchedulerNow(req, res) {
try {
const port = Number(process.env.PORT) || 3001;
const baseUrl = `http://127.0.0.1:${port}`;
const resServers = await fetch(`${baseUrl}/api/servers`).catch(() => null);
const data = resServers?.ok ? await resServers.json() : [];
const servers = Array.isArray(data) ? data : [];
const jumphosts = servers.filter(
(s) => s && ['jumphost', 'home'].includes(String(s.type || '').toLowerCase())
);
const serverIds = jumphosts.map((s) => s.id || s.dns || s.ip).filter(Boolean);
for (const serverId of serverIds) {
fetch(`${baseUrl}/api/uptime/check`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ serverId }),
}).catch((err) => console.warn('[scheduler] uptime check', serverId, err?.message));
}
return sendOk(res, { message: 'Проверки Uptime Monitor запущены в фоне' });
} catch (e) {
console.error('[scheduler] uptime-monitor run-now', e);
return sendError(res, 500, 'Не удалось запустить', 'E_SCHEDULER');
}
}
module.exports = {
getNetworkMapSchedulerSettings,
patchNetworkMapSchedulerSettings,
@@ -187,4 +253,7 @@ module.exports = {
getPingServicesSchedulerSettings,
patchPingServicesSchedulerSettings,
runPingServicesSchedulerNow,
getUptimeMonitorSchedulerSettings,
patchUptimeMonitorSchedulerSettings,
runUptimeMonitorSchedulerNow,
};