Guanghu Domestic Migration d1e47f4565
Some checks are pending
自动更新代码和重启 / update-and-restart (push) Waiting to run
CI检查 + 自动部署 / check (push) Waiting to run
CI检查 + 自动部署 / deploy (push) Blocked by required conditions
重启聊天服务 / restart (push) Waiting to run
chore: import sanitized domestic snapshot for REPO-002
Source snapshot: ca48d3ddf926d79aa138306164169baf764bb829
2026-07-17 15:54:41 +08:00

248 lines
7.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const express = require('express');
const os = require('os');
const app = express();
const PORT = 3000;
// 记录服务器启动时间
const SERVER_START_TIME = new Date();
// 解析JSON请求体
app.use(express.json());
// GET /api/health - 快速健康检查
app.get('/api/health', (req, res) => {
res.json({
status: 'healthy',
timestamp: new Date().toISOString()
});
});
// GET /api/status - 详细系统状态
app.get('/api/status', (req, res) => {
const totalMem = os.totalmem();
const freeMem = os.freemem();
const usedMem = totalMem - freeMem;
res.json({
service: 'HoloLake Health Monitor',
version: '1.0.0',
status: 'running',
timestamp: new Date().toISOString(),
uptime: {
seconds: Math.floor((Date.now() - SERVER_START_TIME.getTime()) / 1000),
startedAt: SERVER_START_TIME.toISOString()
},
system: {
platform: os.platform(),
arch: os.arch(),
hostname: os.hostname(),
nodeVersion: process.version
},
memory: {
totalMB: Math.round(totalMem / 1024 / 1024),
usedMB: Math.round(usedMem / 1024 / 1024),
freeMB: Math.round(freeMem / 1024 / 1024),
usagePercent: Math.round((usedMem / totalMem) * 100) + '%'
}
});
});
// POST /api/heartbeat - 心跳上报
let heartbeats = [];
app.post('/api/heartbeat', (req, res) => {
const heartbeat = {
timestamp: new Date().toISOString(),
service: req.body.service || 'unknown',
status: req.body.status || 'ok'
};
heartbeats.push(heartbeat);
res.json({
received: true,
heartbeat: heartbeat
});
});
// GET /api/heartbeat/history - 查看心跳历史
app.get('/api/heartbeat/history', (req, res) => {
res.json({
total: heartbeats.length,
heartbeats: heartbeats.slice(-20)
});
});
// GET / - 根路径欢迎页
app.get('/', (req, res) => {
res.json({
service: 'HoloLake Health Check & Status Report',
version: '1.0.0',
endpoints: [
'GET /api/health - 快速健康检查',
'GET /api/status - 详细系统状态',
'POST /api/heartbeat - 心跳上报',
'GET /api/heartbeat/history - 心跳历史'
]
});
});
// 启动服务器
app.listen(PORT, () => {
console.log('='.repeat(50));
console.log('🌊 HoloLake Health Check & Status Report');
console.log('📡 服务运行在: http://localhost:' + PORT);
console.log('💚 GET /api/health - 健康检查');
console.log('📊 GET /api/status - 系统状态');
console.log('💓 POST /api/heartbeat - 心跳上报');
console.log('='.repeat(50));
});
// ========== 定时自动巡检系统 ==========
const patrolHistory = [];
// 每60秒执行一次巡检
setInterval(() => {
console.log('[PATROL] 开始定时巡检...');
const totalMem = os.totalmem();
const freeMem = os.freemem();
const usedMem = totalMem - freeMem;
const memPercent = Math.round((usedMem / totalMem) * 100);
const patrolRecord = {
timestamp: new Date().toISOString(),
memory: {
totalMB: Math.round(totalMem / 1024 / 1024),
usedMB: Math.round(usedMem / 1024 / 1024),
usagePercent: memPercent
},
uptime: Math.floor((Date.now() - SERVER_START_TIME.getTime()) / 1000),
heartbeatCount: heartbeats.length
};
patrolHistory.push(patrolRecord);
// 只保留最近50条记录
if (patrolHistory.length > 50) {
patrolHistory.shift();
}
console.log(`[PATROL] 巡检完成 - 内存使用: ${memPercent}%`);
}, 60000); // 60000毫秒 = 60秒
// GET /api/patrol/history - 查看巡检历史
app.get('/api/patrol/history', (req, res) => {
res.json({
total: patrolHistory.length,
patrols: patrolHistory
});
});
console.log('🔄 定时巡检系统已启动每60秒');
// ========== 异常状态告警系统 ==========
const alerts = [];
// 告警检查函数
function checkAlerts(memPercent) {
let level = null;
let message = '';
if (memPercent > 90) {
level = 'critical';
message = `内存使用率过高: ${memPercent}%`;
} else if (memPercent > 80) {
level = 'warning';
message = `内存使用率警告: ${memPercent}%`;
}
if (level) {
const alert = {
timestamp: new Date().toISOString(),
level: level,
message: message,
memoryPercent: memPercent
};
alerts.push(alert);
// 只保留最近20条告警
if (alerts.length > 20) {
alerts.shift();
}
console.log(`[ALERT] ${level.toUpperCase()}: ${message}`);
}
}
// 修改巡检代码加入告警检查找到之前的setInterval在console.log后面添加
// 在 patrolHistory.push(patrolRecord); 之后添加:
// checkAlerts(memPercent);
// GET /api/alerts - 查看告警历史
app.get('/api/alerts', (req, res) => {
res.json({
total: alerts.length,
critical: alerts.filter(a => a.level === 'critical').length,
warning: alerts.filter(a => a.level === 'warning').length,
alerts: alerts
});
});
console.log('🚨 异常告警系统已启动(阈值: 80%警告, 90%严重)');
// ========== 心跳超时检测系统 ==========
const HEARTBEAT_TIMEOUT = 5 * 60 * 1000; // 5分钟 = 300000毫秒
// 检查服务在线状态
function checkOnlineStatus() {
const now = Date.now();
const onlineServices = [];
const offlineServices = [];
// 按source分组找出每个source的最新心跳
const latestHeartbeats = {};
heartbeats.forEach(hb => {
const source = hb.service || 'unknown';
if (!latestHeartbeats[source] || new Date(hb.timestamp) > new Date(latestHeartbeats[source].timestamp)) {
latestHeartbeats[source] = hb;
}
});
// 检查每个source是否超时
for (const [source, hb] of Object.entries(latestHeartbeats)) {
const hbTime = new Date(hb.timestamp).getTime();
const isOnline = (now - hbTime) < HEARTBEAT_TIMEOUT;
const serviceInfo = {
source: source,
lastHeartbeat: hb.timestamp,
secondsAgo: Math.floor((now - hbTime) / 1000),
status: isOnline ? 'online' : 'offline'
};
if (isOnline) {
onlineServices.push(serviceInfo);
} else {
offlineServices.push(serviceInfo);
}
}
return { online: onlineServices, offline: offlineServices };
}
// 修改GET /api/status添加在线服务列表
// 找到原来的 app.get('/api/status', ...)在res.json里添加
// services: checkOnlineStatus()
// GET /api/heartbeat/online - 查看在线服务
app.get('/api/heartbeat/online', (req, res) => {
const status = checkOnlineStatus();
res.json({
timestamp: new Date().toISOString(),
onlineCount: status.online.length,
offlineCount: status.offline.length,
online: status.online,
offline: status.offline
});
});
console.log('⏰ 心跳超时检测已启动(超时: 5分钟');