优化一点东西 懒得写了

This commit is contained in:
CN-JS-HuiBai
2026-04-04 22:35:05 +08:00
parent 286eb1687d
commit e77bdbcc9e
3 changed files with 217 additions and 98 deletions

View File

@@ -421,6 +421,14 @@ async function getServerDetails(baseUrl, instance, job) {
// Queries based on the requested dashboard structure
const queries = {
// Split CPU
cpuSystem: `avg(rate(node_cpu_seconds_total{mode="system", instance="${node}"}[1m])) * 100`,
cpuUser: `avg(rate(node_cpu_seconds_total{mode="user", instance="${node}"}[1m])) * 100`,
cpuIowait: `avg(rate(node_cpu_seconds_total{mode="iowait", instance="${node}"}[1m])) * 100`,
cpuIrq: `avg(rate(node_cpu_seconds_total{mode=~"irq|softirq", instance="${node}"}[1m])) * 100`,
cpuOther: `avg(rate(node_cpu_seconds_total{mode=~"nice|steal|guest|guest_nice", instance="${node}"}[1m])) * 100`,
cpuIdle: `avg(rate(node_cpu_seconds_total{mode="idle", instance="${node}"}[1m])) * 100`,
cpuBusy: `100 * (1 - avg(rate(node_cpu_seconds_total{mode="idle", instance="${node}"}[1m])))`,
sysLoad: `node_load1{instance="${node}",job="${job}"} * 100 / count(count(node_cpu_seconds_total{instance="${node}",job="${job}"}) by (cpu))`,
memUsedPct: `(1 - (node_memory_MemAvailable_bytes{instance="${node}", job="${job}"} / node_memory_MemTotal_bytes{instance="${node}", job="${job}"})) * 100`,
@@ -455,9 +463,42 @@ async function getServerHistory(baseUrl, instance, job, metric, range = '1h', st
const url = normalizeUrl(baseUrl);
const node = instance;
// Custom multi-metric handler for CPU Busy
if (metric === 'cpuBusy') {
const modes = {
system: 'system',
user: 'user',
iowait: 'iowait',
irq: 'irq|softirq',
other: 'nice|steal|guest|guest_nice',
idle: 'idle'
};
const rangeObj = parseRange(range, start, end);
const timestamps = [];
const series = {};
Object.keys(modes).forEach(m => series[m] = []);
const results = await Promise.all(Object.entries(modes).map(async ([name, mode]) => {
const expr = `avg(rate(node_cpu_seconds_total{mode=~"${mode}", instance="${node}"}[1m])) * 100`;
const res = await queryRange(url, expr, rangeObj.queryStart, rangeObj.queryEnd, rangeObj.step);
return { name, values: res.length > 0 ? res[0].values : [] };
}));
if (results[0].values.length === 0) return { timestamps: [], series: {} };
// Use first result for timestamps
results[0].values.forEach(v => timestamps.push(v[0] * 1000));
results.forEach(r => {
r.values.forEach(v => series[r.name].push(parseFloat(v[1])));
});
return { timestamps, series };
}
// Map metric keys to Prometheus expressions
const metricMap = {
cpuBusy: `100 * (1 - avg(rate(node_cpu_seconds_total{mode="idle", instance="${node}"}[1m])))`,
sysLoad: `node_load1{instance="${node}",job="${job}"} * 100 / count(count(node_cpu_seconds_total{instance="${node}",job="${job}"}) by (cpu))`,
memUsedPct: `(1 - (node_memory_MemAvailable_bytes{instance="${node}", job="${job}"} / node_memory_MemTotal_bytes{instance="${node}", job="${job}"})) * 100`,
swapUsedPct: `((node_memory_SwapTotal_bytes{instance="${node}",job="${job}"} - node_memory_SwapFree_bytes{instance="${node}",job="${job}"}) / (node_memory_SwapTotal_bytes{instance="${node}",job="${job}"})) * 100`,
@@ -469,52 +510,10 @@ async function getServerHistory(baseUrl, instance, job, metric, range = '1h', st
const expr = metricMap[metric];
if (!expr) throw new Error('Invalid metric for history');
let duration, step, queryStart, queryEnd;
if (start && end) {
queryStart = Math.floor(new Date(start).getTime() / 1000);
queryEnd = Math.floor(new Date(end).getTime() / 1000);
duration = queryEnd - queryStart;
if (duration <= 0) throw new Error('End time must be after start time');
// Reasonable step for fixed range
step = Math.max(15, Math.floor(duration / 100));
} else {
// Relative range logic
const rangeMap = {
'15m': { duration: 900, step: 15 },
'30m': { duration: 1800, step: 30 },
'1h': { duration: 3600, step: 60 },
'6h': { duration: 21600, step: 300 },
'12h': { duration: 43200, step: 600 },
'24h': { duration: 86400, step: 900 },
'2d': { duration: 172800, step: 1800 },
'7d': { duration: 604800, step: 3600 }
};
if (rangeMap[range]) {
duration = rangeMap[range].duration;
step = rangeMap[range].step;
} else {
// Try to parse relative time string like "2h", "30m", "1d"
const match = range.match(/^(\d+)([smhd])$/);
if (match) {
const val = parseInt(match[1]);
const unit = match[2];
const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };
duration = val * (multipliers[unit] || 3600);
// Calculate a reasonable step for ~60-120 data points
step = Math.max(15, Math.floor(duration / 100));
} else {
duration = 3600;
step = 60;
}
}
queryEnd = Math.floor(Date.now() / 1000);
queryStart = queryEnd - duration;
}
const rangeObj = parseRange(range, start, end);
try {
const result = await queryRange(url, expr, queryStart, queryEnd, step);
const result = await queryRange(url, expr, rangeObj.queryStart, rangeObj.queryEnd, rangeObj.step);
if (!result || result.length === 0) return { timestamps: [], values: [] };
return {
@@ -527,6 +526,48 @@ async function getServerHistory(baseUrl, instance, job, metric, range = '1h', st
}
}
function parseRange(range, start, end) {
let duration, step, queryStart, queryEnd;
if (start && end) {
queryStart = Math.floor(new Date(start).getTime() / 1000);
queryEnd = Math.floor(new Date(end).getTime() / 1000);
duration = queryEnd - queryStart;
step = Math.max(15, Math.floor(duration / 100));
} else {
const rangeMap = {
'15m': { duration: 900, step: 15 },
'30m': { duration: 1800, step: 30 },
'1h': { duration: 3600, step: 60 },
'6h': { duration: 21600, step: 300 },
'12h': { duration: 43200, step: 600 },
'24h': { duration: 86400, step: 900 },
'2d': { duration: 172800, step: 1800 },
'7d': { duration: 604800, step: 3600 }
};
if (rangeMap[range]) {
duration = rangeMap[range].duration;
step = rangeMap[range].step;
} else {
const match = range.match(/^(\d+)([smhd])$/);
if (match) {
const val = parseInt(match[1]);
const unit = match[2];
const multipliers = { s: 1, m: 60, h: 3600, d: 86400 };
duration = val * (multipliers[unit] || 3600);
step = Math.max(15, Math.floor(duration / 100));
} else {
duration = 3600;
step = 60;
}
}
queryEnd = Math.floor(Date.now() / 1000);
queryStart = queryEnd - duration;
}
return { queryStart, queryEnd, step };
}
module.exports = {
testConnection,
query,