45 lines
1.6 KiB
JavaScript
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 };
|