修复:保留监控缺测语义、采样日期与磁盘字段名称

This commit is contained in:
cieanyau committed 2026-11-07 04:18:02 +08:00
1 parent 520c0894c2
commit 6a07904ca0
7 files changed
+726 -71

No files matched your search

+2 -6
View File
@@ -32,6 +32,7 @@ import { r as configuration_display_r } from "~/lib/configuration-display.js";
import { t as configuration_display_t } from "~/lib/configuration-display.js";
import { t as common_advanced_rules_t } from "~/lib/common-advanced-rules.js";
import multiselect from "openvue/multiselect";
import { t as finance_resource_chart_t } from "~/lib/finance-resource-chart.js";
var j = (e) => (e && typeof e == `object` && !Array.isArray(e) ? e : {}),
M = (e) => e === !0 || e === 1 || e === `1`,
N = (e) => e === !1 || e === 0 || e === `0`,
@@ -163,12 +164,7 @@ function z(e) {
name: a[t] || `数据 ${t + 1}`,
type: `line`,
showSymbol: !1,
data: c.map((e) => {
let t = n.get(e);
return t != null && t !== `` && Number.isFinite(Number(t))
? Number(t)
: null;
}),
data: c.map((e) => finance_resource_chart_t(n.get(e))),
};
});
return {
+12 -14
View File
@@ -26,6 +26,8 @@ import button from "openvue/button";
import { t as _plugin_vue_export_helper_t } from "~/lib/_plugin-vue_export-helper.js";
import skeleton from "openvue/skeleton";
import selectbutton from "openvue/selectbutton";
import { r as dict_r } from "~/lib/dict.js";
import { t as finance_resource_chart_t } from "~/lib/finance-resource-chart.js";
var T = defineAsyncComponent(() =>
loadModule(
() => import("~/components/ChartBox.vue").then((e) => e.default || e),
@@ -113,8 +115,10 @@ var T = defineAsyncComponent(() =>
start_time: Math.floor(Date.now() / 1e3) - S.value,
});
if (R || e !== L || t !== h.hostId || n !== h.module) return;
((F.value = (Array.isArray(r.list) ? r.list : []).filter((e) =>
Number.isFinite(Number(e.time)),
((F.value = (Array.isArray(r.list) ? r.list : []).filter(
(e) =>
finance_resource_chart_t(e.time) !== null &&
Number.isFinite(new Date(Number(e.time) * 1e3).getTime()),
)),
(I.value = typeof r.unit == `string` ? r.unit : ``));
} catch (t) {
@@ -126,12 +130,8 @@ var T = defineAsyncComponent(() =>
}
}
// 缺失采样转为 null 而不是 0,配合 connectNulls:false 保留采集中断的空隙。
function V(e) {
return e != null && e !== `` && Number.isFinite(Number(e))
? Number(e)
: null;
}
let H = computed(() =>
let V = finance_resource_chart_t,
H = computed(() =>
F.value.some((e) => V(e.in_bw) !== null || V(e.out_bw) !== null),
),
U = computed(() => ({
@@ -150,12 +150,10 @@ var T = defineAsyncComponent(() =>
xAxis: {
type: `category`,
boundaryGap: !1,
data: F.value.map((e) =>
new Date(Number(e.time) * 1e3).toLocaleTimeString(`zh-CN`, {
hour: `2-digit`,
minute: `2-digit`,
}),
),
data: F.value.map((e) => dict_r(Number(e.time))),
axisLabel: {
formatter: (e) => String(e).slice(11, 16),
},
},
yAxis: {
type: `value`,
+4 -2
View File
@@ -1055,13 +1055,14 @@ var ge = [`aria-busy`],
createElementVNode(`div`, ke, [
(n[17] ||= createElementVNode(
`label`,
null,
{ for: `disk-resize-capacity` },
`扩容至`,
-1,
)),
createVNode(
fe,
{
inputId: `disk-resize-capacity`,
modelValue: unref(P),
"onUpdate:modelValue": [
(n[1] ||= (e) =>
@@ -1232,13 +1233,14 @@ var ge = [`aria-busy`],
createElementVNode(`div`, Fe, [
(n[21] ||= createElementVNode(
`label`,
null,
{ for: `disk-add-capacity` },
`容量`,
-1,
)),
createVNode(
fe,
{
inputId: `disk-add-capacity`,
modelValue: unref(B),
"onUpdate:modelValue": [
(n[5] ||= (e) =>
+20 -19
View File
@@ -30,6 +30,7 @@ import ListSegments from "~/components/ListSegments.vue";
import skeleton from "openvue/skeleton";
import { n as finance_resource_chart_n } from "~/lib/finance-resource-chart.js";
import { t as finance_resource_chart_t } from "~/lib/finance-resource-chart.js";
import { r as dict_r } from "~/lib/dict.js";
var O = defineAsyncComponent(() =>
loadModule(
() => import("~/components/ChartBox.vue").then((e) => e.default || e),
@@ -125,8 +126,10 @@ var O = defineAsyncComponent(() =>
],
Z = ref(86400),
Q = (e) => {
let t = new Date(e * 1e3);
return `${String(t.getHours()).padStart(2, `0`)}:${String(t.getMinutes()).padStart(2, `0`)}`;
let t = finance_resource_chart_t(e);
return t !== null && Number.isFinite(new Date(t * 1e3).getTime())
? dict_r(t)
: ``;
};
async function te(e, t, n = `mf_cloud`) {
// 云模块各指标并行读取并分别展示失败;物理智简只请求实际支持的带宽图。
@@ -151,10 +154,13 @@ var O = defineAsyncComponent(() =>
pick: [
{
name: `内存`,
fn: (e) =>
e.total
? (Number(e.used ?? 0) / Number(e.total)) * 100
: void 0,
fn: (e) => {
let t = finance_resource_chart_t(e.total),
n = finance_resource_chart_t(e.used);
return t !== null && t > 0 && n !== null
? (n / t) * 100
: null;
},
color: U.value,
unit: `%`,
},
@@ -228,10 +234,7 @@ var O = defineAsyncComponent(() =>
};
let r = n.value.list ?? [],
a = e.pick.map((e) =>
r.map((t) => {
let n = e.fn(t);
return n === void 0 || Number.isNaN(n) ? null : Number(n);
}),
r.map((t) => finance_resource_chart_t(e.fn(t))),
),
s =
e.scale === `bits`
@@ -317,9 +320,7 @@ var O = defineAsyncComponent(() =>
],
};
}
let a = (r.list?.[0] ?? []).map((e) =>
String(e.time ?? ``).slice(11, 16),
),
let a = (r.list?.[0] ?? []).map((e) => String(e.time ?? ``)),
o = (r.list ?? []).map((e, t) => ({
name: String(r.label?.[t] ?? `系列 ${t + 1}`).replace(
/\(.*\)$/,
@@ -341,9 +342,7 @@ var O = defineAsyncComponent(() =>
async function re(e) {
// 快快云监控时间范围由接口决定,带宽值按其既有口径从千分单位转换为 Mbps。
let t = await y.get(`/kky_ecs/monitor/${e}`),
n = (t.sample_info ?? []).map((e) =>
String(e.timestamp ?? ``).slice(11, 16),
),
n = (t.sample_info ?? []).map((e) => String(e.timestamp ?? ``)),
r = (e, t, r, i, a, o = 1) => ({
key: e,
title: t,
@@ -352,9 +351,10 @@ var O = defineAsyncComponent(() =>
name: e.title,
unit: a,
color: i[t % i.length],
data: (e.value ?? []).map((e) =>
typeof e == `number` ? Number((e / o).toFixed(2)) : null,
),
data: (e.value ?? []).map((e) => {
let t = finance_resource_chart_t(e);
return t === null ? null : Number((t / o).toFixed(2));
}),
})),
});
return [
@@ -448,6 +448,7 @@ var O = defineAsyncComponent(() =>
axisLabel: {
color: t,
fontSize: 11,
formatter: (e) => String(e).slice(11, 16),
},
},
yAxis: {
+26 -29
View File
@@ -43,6 +43,7 @@ import FlowPacketPanel from "~/components/instance/FlowPacketPanel.vue";
import InstanceStatusTag from "~/components/instance/InstanceStatusTag.vue";
import InstanceTraffic from "~/components/instance/InstanceTraffic.vue";
import { n as finance_resource_chart_n } from "~/lib/finance-resource-chart.js";
import { t as finance_resource_chart_t } from "~/lib/finance-resource-chart.js";
var le = defineAsyncComponent(() =>
loadModule(
() => import("~/components/ChartBox.vue").then((e) => e.default || e),
@@ -293,13 +294,8 @@ var le = defineAsyncComponent(() =>
),
K = 0,
q = !1;
function J(e) {
if (typeof e != `number` && (typeof e != `string` || !e.trim()))
return null;
let t = Number(e);
return Number.isFinite(t) ? t : null;
}
let xt = (e) => (e.status === `fulfilled` ? e.value : null),
let J = finance_resource_chart_t,
xt = (e) => (e.status === `fulfilled` ? e.value : null),
St = (e) => (e instanceof Error ? e.message : `网络监控加载失败`);
async function Y() {
// 不同模块的监控时间单位和返回结构不同,分支完成协议转换;实例切换后拒绝旧响应。
@@ -374,7 +370,7 @@ var le = defineAsyncComponent(() =>
(e) => {
H.value = {
labels: (e?.list?.[0] ?? []).map((e) =>
String(e.time ?? ``).slice(11, 16),
String(e.time ?? ``),
),
unit: e?.unit?.trim() || ``,
series: (e?.list ?? []).map((t, n) => ({
@@ -474,8 +470,11 @@ var le = defineAsyncComponent(() =>
: 0;
H.value = {
labels: t.map((e) => {
let t = new Date(e.time * 1e3);
return `${String(t.getHours()).padStart(2, `0`)}:${String(t.getMinutes()).padStart(2, `0`)}`;
let t = J(e.time);
return t !== null &&
Number.isFinite(new Date(t * 1e3).getTime())
? dict_r(t)
: ``;
}),
unit: [`bps`, `Kbps`, `Mbps`, `Gbps`, `Tbps`][i],
series: n.map((e, t) => ({
@@ -498,32 +497,34 @@ var le = defineAsyncComponent(() =>
]);
if (!r()) return;
let n = xt(e);
z.value = n?.cpu?.[0]?.value ?? [];
z.value = (n?.cpu?.[0]?.value ?? []).map(J);
let i = n?.memory?.find((e) => !/free/i.test(e.name)),
a = n?.memory?.find((e) => /free/i.test(e.name));
((B.value =
i && a
? i.value.map((e, t) => {
let n = Number(a.value?.[t] ?? 0);
return e > 0
? Math.max(0, Math.min(100, ((e - n) / e) * 100))
: 0;
let n = J(a.value?.[t]),
r = J(e);
return r !== null && r > 0 && n !== null
? Math.max(0, Math.min(100, ((r - n) / r) * 100))
: null;
})
: []),
e.status === `rejected`
? (W.value = St(e.reason))
: (H.value = {
labels: (n?.sample_info ?? []).map((e) =>
String(e.timestamp ?? ``).slice(11, 16),
String(e.timestamp ?? ``),
),
unit: `Mbps`,
series: (n?.bandwidth ?? []).map((e, t) => ({
name: e.title || e.name || `带宽系列 ${t + 1}`,
data: (e.value ?? []).map((e) =>
typeof e == `number` && Number.isFinite(e)
? Number((e / 1e3).toFixed(2))
: null,
),
data: (e.value ?? []).map((e) => {
let t = J(e);
return t === null
? null
: Number((t / 1e3).toFixed(2));
}),
})),
}));
}
@@ -546,23 +547,19 @@ var le = defineAsyncComponent(() =>
x.module === `jy_cloud` || x.module === `jy_dcim`
? (J(R.value?.cpu_usage) ?? z.value.at(-1) ?? null)
: x.module === `mf_cloud` || x.module === `remf_cloud`
? X(R.value?.cpu_usage)
? J(R.value?.cpu_usage)
: z.value.length
? z.value[z.value.length - 1]
: x.module === `remf_finance`
? null
: 0,
: null,
),
wt = computed(() =>
x.module === `jy_cloud` || x.module === `jy_dcim`
? (J(R.value?.memory_usage) ?? B.value.at(-1) ?? null)
: x.module === `mf_cloud` || x.module === `remf_cloud`
? X(R.value?.memory_usage)
? J(R.value?.memory_usage)
: B.value.length
? B.value[B.value.length - 1]
: x.module === `remf_finance`
? null
: 0,
: null,
);
function Tt(e) {
// CPU/内存趋势以百分比绘制;null 表示缺测,禁止连接缺失点伪造连续数据。