初始化提交

This commit is contained in:
2025-12-14 15:25:31 +08:00
commit 4fa42f7115
48 changed files with 8718 additions and 0 deletions

View File

@@ -0,0 +1,101 @@
import type { ServerMetrics } from '../types';
export const fetchServerMetrics = async (serverUrl: string): Promise<ServerMetrics> => {
// 测量客户端到服务器的延迟(使用健康检查端点)
const clientToServerLatency = await measureLatency(`${serverUrl}/api/health`);
// 并行请求各个端点
const endpoints = [
'/api/metrics/cpu',
'/api/metrics/memory',
'/api/metrics/storage',
'/api/metrics/gpu',
'/api/metrics/network',
'/api/metrics/system',
'/api/metrics/docker',
'/api/metrics/latency',
];
const results = await Promise.all(
endpoints.map(endpoint =>
fetch(`${serverUrl}${endpoint}`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
})
.then(res => {
if (!res.ok) throw new Error(`Failed to fetch ${endpoint}`);
return res.json();
})
.catch(err => {
console.error(`Error fetching ${endpoint}:`, err);
return null;
})
)
);
// 合并所有结果
const [cpuRes, memRes, storageRes, gpuRes, networkRes, systemRes, dockerRes, latencyRes] = results;
const system = systemRes?.data || {};
const docker = dockerRes?.data || {};
const latency = latencyRes?.data || {};
// 将 docker 数据合并到 system.dockerStats
return {
hostname: system.hostname || 'Unknown',
timestamp: new Date().toISOString(),
cpu: cpuRes?.data || {},
memory: memRes?.data || {},
storage: storageRes?.data || [],
gpu: gpuRes?.data || [],
network: networkRes?.data || [],
system: {
...system,
dockerStats: docker
},
os: system.os || { kernel: '', distro: '', architecture: '' },
uptimeSeconds: system.uptimeSeconds || 0,
latency: {
clientToServer: clientToServerLatency,
external: latency.external || {},
},
};
};
// 测量延迟
async function measureLatency(url: string): Promise<number> {
try {
const startTime = performance.now();
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
const endTime = performance.now();
if (response.ok) {
return Math.round(endTime - startTime);
}
return -1; // 表示失败
} catch {
return -1; // 表示超时或失败
}
}
export const checkServerHealth = async (serverUrl: string): Promise<boolean> => {
try {
const url = `${serverUrl}/api/health`;
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
return response.ok;
} catch {
return false;
}
};