Files
console-dev/app/lib/finance-resource-chart.js

45 lines
1.6 KiB
JavaScript

/** 财务模块监控数据转为图表百分比;非法或缺测值保留 null,不伪造零使用率。 */
function e(e) {
if (typeof e != `number` && (typeof e != `string` || !e.trim())) return null;
let t = Number(e);
return Number.isFinite(t) ? t : null;
}
/** 已是百分比的曲线直接归一;容量曲线按同一时间戳匹配总量与已用/空闲量后计算。 */
function t(t, n) {
let r = t.list ?? [],
i = t.label ?? [],
a = i.findIndex((e) => /已用|使用|used|usage|utilization/i.test(e)),
o = (t) => {
let n = e(t);
return n === null
? null
: Number(Math.min(100, Math.max(0, n)).toFixed(2));
},
s = (e) => e.map((e) => String(e.time ?? ``).slice(11, 16));
if (n === `cpu` || /%|percent/i.test(t.unit ?? ``)) {
let e = r[n === `memory` && a >= 0 ? a : 0] ?? [];
return {
labels: s(e),
data: e.map((e) => o(e.value)),
};
}
// 不能按数组下标直接相除:不同曲线可能缺点,必须用时间戳对齐。
let c = i.findIndex((e) => /总|total|allocated/i.test(e)),
l = c >= 0 ? c : 0,
u = i.findIndex((e) => /空闲|可用|free|available/i.test(e)),
d = a >= 0 ? a : u >= 0 ? u : 1,
f = r[l] ?? [],
p = new Map((r[d] ?? []).map((e) => [String(e.time ?? ``), e.value]));
return {
labels: s(f),
data: f.map((t) => {
let n = e(t.value),
r = t.time ? e(p.get(t.time)) : null;
if (l === d || n === null || n <= 0 || r === null || r < 0) return null;
let i = a < 0 && u >= 0 ? n - r : r;
return o((i / n) * 100);
}),
};
}
export { t as n, e as t };