systemStatus.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const express = require('express');
  2. const router = express.Router();
  3. const os = require('os');
  4. const logger = require('../logger');
  5. // 获取系统状态
  6. router.get('/', (req, res) => {
  7. try {
  8. // 收集系统信息
  9. const cpuLoad = os.loadavg()[0] / os.cpus().length * 100;
  10. const totalMem = os.totalmem();
  11. const freeMem = os.freemem();
  12. const usedMem = totalMem - freeMem;
  13. const memoryUsage = `${Math.round(usedMem / totalMem * 100)}%`;
  14. // 组合结果
  15. const systemStatus = {
  16. dockerAvailable: true,
  17. containerCount: 0,
  18. cpuLoad: `${cpuLoad.toFixed(1)}%`,
  19. memoryUsage: memoryUsage,
  20. diskSpace: '未知',
  21. recentActivities: []
  22. };
  23. res.json(systemStatus);
  24. } catch (error) {
  25. logger.error('获取系统状态失败:', error);
  26. res.status(500).json({
  27. error: '获取系统状态失败',
  28. details: error.message
  29. });
  30. }
  31. });
  32. // 获取系统资源详情
  33. router.get('/system-resource-details', (req, res) => {
  34. try {
  35. const { type } = req.query;
  36. let data = {};
  37. switch(type) {
  38. case 'memory':
  39. const totalMem = os.totalmem();
  40. const freeMem = os.freemem();
  41. const usedMem = totalMem - freeMem;
  42. data = {
  43. totalMemory: formatBytes(totalMem),
  44. usedMemory: formatBytes(usedMem),
  45. freeMemory: formatBytes(freeMem),
  46. memoryUsage: `${Math.round(usedMem / totalMem * 100)}%`
  47. };
  48. break;
  49. case 'cpu':
  50. const cpus = os.cpus();
  51. const loadAvg = os.loadavg();
  52. data = {
  53. cpuCores: cpus.length,
  54. cpuModel: cpus[0].model,
  55. cpuLoad: `${(loadAvg[0] / cpus.length * 100).toFixed(1)}%`,
  56. loadAvg1: loadAvg[0].toFixed(2),
  57. loadAvg5: loadAvg[1].toFixed(2),
  58. loadAvg15: loadAvg[2].toFixed(2)
  59. };
  60. break;
  61. case 'disk':
  62. // 简单的硬编码数据,在实际环境中应该调用系统命令获取
  63. data = {
  64. totalSpace: '100 GB',
  65. usedSpace: '30 GB',
  66. freeSpace: '70 GB',
  67. diskUsage: '30%'
  68. };
  69. break;
  70. default:
  71. return res.status(400).json({ error: '无效的资源类型' });
  72. }
  73. res.json(data);
  74. } catch (error) {
  75. logger.error('获取系统资源详情失败:', error);
  76. res.status(500).json({ error: '获取系统资源详情失败', details: error.message });
  77. }
  78. });
  79. // 格式化字节数为可读格式
  80. function formatBytes(bytes, decimals = 2) {
  81. if (bytes === 0) return '0 Bytes';
  82. const k = 1024;
  83. const dm = decimals < 0 ? 0 : decimals;
  84. const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
  85. const i = Math.floor(Math.log(bytes) / Math.log(k));
  86. return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];
  87. }
  88. module.exports = router;