Add visual dual-verdict editor for monitor templates with out_of_expect and field tokens.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
oliver 2026-09-18 21:28:42 +08:00
parent 2c2768a3d0
commit 27c6b7c61d
7 changed files with 985 additions and 136 deletions

View file

@ -580,7 +580,7 @@ const en = {
},
bizMonitorTpl: {
title: "Monitor templates",
hint: "Reference a compare template for HOW-to-compare, then add dual-device / baseline rules for cutover monitor.",
hint: "Compare templates define HOW to align/diff; monitor templates define WHEN dual-device migrate succeeds — one sheet tab per compare sheet.",
create: "New monitor template",
edit: "Edit",
save: "Save",
@ -594,6 +594,7 @@ const en = {
listFilterPh: "Filter name / compare template / note",
kpiTotal: "Templates",
colName: "Name",
namePh: "e.g. Port+BGP cutover monitor",
colCompare: "Compare template",
colCollect: "HF collect metrics",
colNote: "Note",
@ -601,16 +602,47 @@ const en = {
needName: "Name is required",
defaultsInvalid: "Invalid defaults JSON",
overridesInvalid: "Invalid sheet_overrides JSON",
formHint: "Compare template owns alignment & field rules; this page owns dual verdict + optional HF collect subset.",
compareHint: "From Compare templates; create/edit sheets there first if needed.",
formHint: "Pick a compare template → same sheet tabs appear → configure status fields and success patterns per sheet.",
compareHint: "Owns which sheets and Key/compare fields; here you only set dual verdict rules.",
pickCompare: "Pick compare template…",
openCompare: "Manage compare templates",
collectAll: "All sheets",
collectPh: "interface_brief, bgp_peer (empty = all)",
collectHint: "Comma-separated metric_id; empty uses every sheet on the compare template.",
collectHint: "HF collect metrics; empty / “All sheets” uses every compare-template sheet.",
collectTitle: "High-freq collect subset",
defaults: "defaults (JSON)",
overrides: "sheet_overrides (JSON)",
overridesHint: "Optional per-metric status_fields / success patterns; empty array uses global defaults.",
overridesHint: "Optional per-metric status_fields / success patterns.",
globalPolicy: "Global policy",
outOfExpect: "Out-of-expect objects",
outOfExpectHint: "How to treat drift outside the batch expect set.",
ooeStrict: "Strict (red anomaly)",
ooeWarn: "Warn (yellow only, no red tickets)",
ooeIgnore: "Ignore (always not involved)",
sheetRules: "Per-sheet migrate rules",
applyAllPresets: "Apply recommended presets to all",
sheetHowReadonly: "Compare template (read-only)",
iface: "Interface",
compare: "Compare",
presenceOnly: "presence only",
editInCompare: "Edit HOW in compare templates",
presetAuto: "Apply recommended preset",
presetSkip: "Skip dual verdict",
skipDual: "Skip dual for this sheet",
skipDualHint: "This sheet is skipped in cutover evaluate (use a compare job for pure value checks).",
statusFields: "Status fields",
statusFieldsHint: "Classify current rows as up/down; ports use admin/phy/prot, BGP uses state.",
downValues: "Down values",
upValues: "Up values",
noFields: "No fields (pick metrics on the compare template first)",
successPatterns: "Success patterns (old any-of × new any-of)",
successPatternsHint: "e.g. port: old removed/down + new added/up; ARP: old removed + new added; BGP: old down(idle) + new up(established).",
oldSideAny: "Old side (any match)",
newSideAny: "New side (any match)",
addSuccessRow: "Add success pattern",
needCompareFirst: "Pick a compare template that has sheets first.",
showJson: "Advanced: edit JSON",
hideJson: "Back to visual editor",
},
portTraffic: {
title: "Port traffic",

View file

@ -575,7 +575,7 @@ const zh = {
},
bizMonitorTpl: {
title: "监控模板",
hint: "引用对比模板定义「如何比」,再叠加双端迁移/基线判定规则。供割接监控选用。",
hint: "对比模板定义「怎么对齐/比对」;监控模板按同样的表(sheet)定义「怎样算搬迁成功/失败」。",
create: "新建监控模板",
edit: "编辑",
save: "保存",
@ -589,6 +589,7 @@ const zh = {
listFilterPh: "筛选名称 / 对比模板 / 备注",
kpiTotal: "模板数",
colName: "名称",
namePh: "例如:端口+BGP 割接监控",
colCompare: "对比模板",
colCollect: "高频采集项",
colNote: "备注",
@ -596,16 +597,47 @@ const zh = {
needName: "请填写名称",
defaultsInvalid: "defaults JSON 无效",
overridesInvalid: "sheet_overrides JSON 无效",
formHint: "对比模板决定对齐与字段规则;本页配置双端判定与可选高频采集子集。",
compareHint: "来自「对比模板」;可先去那边新建或编辑 sheets。",
formHint: "先选对比模板 → 出现与对比模板相同的表页签 → 为每张表配置状态字段与成功模式。",
compareHint: "决定有哪些表以及 Key/比对字段;此处只配置双端判定。",
pickCompare: "选择对比模板…",
openCompare: "管理对比模板",
collectAll: "模板全量",
collectPh: "interface_brief, bgp_peer(空=全量)",
collectHint: "逗号分隔 metric_id;留空表示使用对比模板全部 sheets。",
collectHint: "勾选高频采集的 metric;全不勾或点「模板全量」表示对比模板全部 sheets。",
collectTitle: "高频采集子集",
defaults: "defaults(JSON)",
overrides: "sheet_overrides(JSON)",
overridesHint: "可按 metric 声明 status_fields / success 模式;空数组则用全局 defaults。",
overridesHint: "可按 metric 声明 status_fields / success 模式。",
globalPolicy: "全局策略",
outOfExpect: "预期外对象",
outOfExpectHint: "不在本批预期内的漂移如何处理。",
ooeStrict: "严格(异常标红)",
ooeWarn: "警告(仅标黄,不记红单)",
ooeIgnore: "忽略(一律未涉及)",
sheetRules: "各表搬迁判定",
applyAllPresets: "全部套用推荐预设",
sheetHowReadonly: "对比模板(只读)",
iface: "接口",
compare: "比对",
presenceOnly: "仅存在性",
editInCompare: "去对比模板改 HOW",
presetAuto: "套用本表推荐预设",
presetSkip: "跳过双端判定",
skipDual: "本表不参与 dual 判定",
skipDualHint: "该 sheet 将在割接判定中跳过(适合纯计数器等值校验类,改用业务对比 Job)。",
statusFields: "状态字段",
statusFieldsHint: "用于把当前行归类为 up/down;端口勾选 admin/phy/prot,BGP 勾选 state。",
downValues: "Down 取值",
upValues: "Up 取值",
noFields: "无可用字段(先在对比模板勾选 metric)",
successPatterns: "成功模式(老侧任意命中 × 新侧任意命中)",
successPatternsHint: "例如端口:老 removed/down + 新 added/up;ARP:老 removed + 新 added;BGP:老 down(idle) + 新 up(established)。",
oldSideAny: "老侧(任意命中)",
newSideAny: "新侧(任意命中)",
addSuccessRow: "添加成功模式",
needCompareFirst: "请先选择带 sheets 的对比模板。",
showJson: "高级:编辑 JSON",
hideJson: "回到可视化编辑",
},
portTraffic: {
title: "端口流量监控",