Skip to content

docs(cases/oracle): add DG/DR alert template label drift Path A 修法 case#226

Merged
weicao merged 1 commit into
mainfrom
weicao/alert-template-drift-path-a-fix-case
May 19, 2026
Merged

docs(cases/oracle): add DG/DR alert template label drift Path A 修法 case#226
weicao merged 1 commit into
mainfrom
weicao/alert-template-drift-path-a-fix-case

Conversation

@weicao
Copy link
Copy Markdown
Contributor

@weicao weicao commented May 18, 2026

Summary

  • 新增 docs/cases/oracle/oracle-dg-dr-alert-template-drift-path-a-fix-case.md (250 行), 沉淀 alert template {{ \$labels.X }} 字面引用 metric 不携带的 label 时渲染空字符串这一 UX 字面错的 Path A doc-spec 层修法
  • 主体 engine-neutral: 5 条硬规则 + per-rule label promotion 决策树 + pending 分支标记三件信息口径 + 6 行反模式表
  • 案例附录 (A.1-A.9): Oracle Data Guard / Disaster Recovery v0.2 final → v0.3 字面 diff (§4 全局 default 块拆 + Rule 1/2/9/10 description 删 thread_id + Rule 5/12 加 thread_id per-rule labels + Rule 7/8 pending B1-b + §6 e2e 验证项 6)
  • addon-docs-writing skill 模板: frontmatter + 第一段问题陈述 + 先用白话理解 + 术语速查 (10 个术语 first-use expand) + 适用场景 + 通用方法论 + 与其他 doc/skill 关系 + 案例附录 + 一句话总结

来源

Skyworth PoC Sprint 2 Oracle DG/DR 规则包交付 P1-E (alert template label drift, 9 条 rule definite affected) 修法落地:

  • replication_lag_seconds 实际不携带 thread_id (schema 表载 vs raw scrape drift) → Rule 1/2/9/10 description 删 , thread {{ \$labels.thread_id }}
  • fsfo / archive_log_gap / redo_apply metric 不携带 db_unique_name → 全局 default labels 块拆, db_unique_name 移到 per-rule (Rule 1/2/3/9/10/11)
  • archive_log_gap metric 携带 thread_id → Rule 5/12 加 per-rule thread_id promotion
  • recording rule oracle_dr_drift_seconds PoC same-cluster vs production cross-cluster topology pending B1-b lock (Emma 方案 A 双 file 物理隔离 + record name 区分) → Rule 7/8 显式标 pending B1-b 注释

Emma (KubeBlocks Enterprise apiserver) P1-E scope 收敛后 audit 确认 fixture JSON 字面 0 change, Path A 物理位置 = Oracle Addon 自己 workspace v0.2 final spec doc; Emma 倾向 (c) PR-ify 一步到位 + GitHub byte-level diff view 比 inline paste 更稳 → 本 PR。Cindy 22:27 patrol 提的"案例沉淀方向"对齐。

PR 依赖 (合并顺序)

本 PR cross-link PR #221 (Sprint 2 case body) §6.5 "Path A vs Path B 路径选择" + §10 backlog row B3 owner 路由 (James alert template + Emma apiserver chart 同步)。

合并顺序建议:

如果 PR #221 没先合, 本 PR 的 cross-link docs/cases/oracle/oracle-dg-dr-promql-rule-pack-sprint2-case.md 会指向 main 上不存在的文件。

Boundary

  • 主体 engine-neutral, 引擎相关 (Oracle DG/DR) 实证字面 + 9 条 rule 字面 diff 放案例附录 A.1-A.9
  • byte-level static review (alert template 字面 vs metric label 集字面对齐), 不跑 live vmsingle / AlertManager evaluate (本 PR 0 image build / 0 sideload / 0 真触发告警)
  • pending B1-b lock 部分 (Rule 7/8 cross-cluster split) 待 Sprint 3 W1+ Emma apiserver Branch 3 fixture 14b- + addon pod label apps.kubeblocks.io/dg-pair 注入 land 后, alert template v0.4 batch 接

Test plan

新增 docs/cases/oracle/oracle-dg-dr-alert-template-drift-path-a-fix-case.md
(250 行), 沉淀 alert template `{{ $labels.X }}` 字面引用 metric 不携带的
label 时渲染空字符串这一 UX 字面错的 Path A doc-spec 层修法。

具体场景: addon 给客户/平台交付 Prometheus alert template 时, 在
description / labels / summary 字段写了 `{{ $labels.thread_id }}` 或
`{{ $labels.db_unique_name }}` 这种 label 插值, 但实际触发告警的 metric
不携带这个 label。Prometheus / vmalert 不会拦截, 静悄悄渲染成空字符串。
告警卡片上出现"DG 备库 (, thread )"这样的半截描述, 客户值班看见会问
"是不是坏了", 信任度被磨掉。

修法分两条路:
- Path A (doc-spec 层短期修, 本 case 主体): 改 alert template 字面,
  全局 default labels 块拆 per-rule, 只在 metric 携带的 rule 上 promote;
  description 字面只引用 metric 携带的 label; pending 分支显式标
  (backlog ID + spec 描述 + 落地后要改成什么)。
- Path B (SQL 层长期修, 排 Sprint 3+ backlog): fork exporter binary,
  改 SQL probe 加 select 把 label 补齐到 raw metric 上。

主体 engine-neutral:
- 5 条硬规则 (mental-run / 全局 default 只放每条都有的 / per-rule labels
  只放 metric 携带的 promote / mental-run + UI 抽查 verify / pending
  显式标)
- per-rule label promotion 决策树 (3 步)
- pending 分支标记三件信息口径
- 6 行反模式表 (label drift / 全局默认放部分 metric label / fork 万能
  反模式 / recording rule LHS 自动保留误解 / pending 不标 / 不 mental-run)

案例附录 (A.1-A.9, Oracle Data Guard / Disaster Recovery 具体例子):
- 五项 lock 不变 (跟 v0.2 final 字面对齐)
- 6 raw metric label 集 (含 replication_lag_seconds 表载 vs raw scrape
  drift 备注)
- v0.2 final → v0.3 字面 diff 表 (12 行 diff 类别)
- §4 全局 default labels v0.3 字面 (删 db_unique_name 行)
- Rule 1/2/9/10 description v0.3 字面 (删 `, thread {{ thread_id }}`)
- Rule 5/12 per-rule labels v0.3 字面 (加 thread_id promotion)
- Rule 7/8 pending B1-b 注释 v0.3 字面
- §6 e2e 验证项 6 (AlertManager UI 抽查 db_unique_name / thread_id
  非空 + Rule 4/6/13 无空字符串残留)
- Sprint 3 W1+ batch 待 trigger 表

按 addon-docs-writing skill 模板: frontmatter + 第一段问题陈述 (本 case
解决什么场景) + `## 先用白话理解这篇文档` (4 段) + `## 术语速查` (10
个术语 first-use expand) + `## 适用场景` 表 + `## 通用方法论` (硬规则
+ 决策树 + pending 口径 + 反模式表) + `## 与其他 doc / skill 关系`
(cross-link PR #221 case body + PR #222 8 类 blocker guide +
design-contract-review-during-xp + addon-docs-writing skill) + `## 案
例附录` + `## 一句话总结`。

跨 PR 依赖: 本 PR 跟 PR #221 (Sprint 2 case body) + PR #222 (8 类 peer
review blocker class guide 同期 OPEN。本 PR cross-link PR #221 §6.5
Path A vs Path B 路径选择 + §10 backlog row B3 owner 路由; 合并顺序
建议先 #221 (本 PR 的 cross-link 依赖), 再 #222 / 本 PR (这两个独立)。

来源: Skyworth PoC Sprint 2 Oracle DG/DR 规则包交付 P1-E (alert
template label drift, 9 条 rule definite affected) 修法落地。Emma
(KubeBlocks Enterprise) P1-E scope 收敛后 audit 确认 fixture JSON 字面
0 change, Path A 物理位置 = Oracle Addon 自己 workspace v0.2 final spec
doc; Emma 倾向 (c) PR-ify 一步到位 + GitHub byte-level diff view 比
inline paste 更稳 → 本 PR。Cindy 22:27 patrol 提的案例沉淀方向对齐。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
EOF
)
@weicao
Copy link
Copy Markdown
Contributor Author

weicao commented May 18, 2026

Byte-level static review PASS on commit 3b8bb94 (PR #226) — 4 件 checklist + 附加 cross-check 全 PASS。Emma (apiserver/KBE 模块 owner) 侧 review。

Checklist 1: §4 全局 default labels 块拆 per-rule labels 字面对齐 ✓

  • A.4 §4 全局 default v0.3 块字面:engine / source / organization / environment / app_kubernetes_io_instance / topology — 删 db_unique_name 行已落字面 ✓
  • A.3 第 1 行 diff 表:"含 db_unique_name 行 → 删该行, 移到 per-rule labels (Rule 1/2/3/9/10/11)" ✓
  • A.3 第 6 行:Rule 1/2/3/9/10/11 加 db_unique_name: '{{ $labels.db_unique_name }}' per-rule ✓
  • A.3 第 9 行:Rule 4/6/13 不变(fsfo / redo_apply / 跨拓扑 redo_apply metric 不携带 db_unique_name)✓
  • 跟 A.2 raw metric label 集字面一致 ✓(rule 4/5/6/12/13 metric 不携带 db_unique_name → 全局放会渲染空字符串这一硬规则成立)

Checklist 2: Rule 1/2/9/10 description thread_id 字样删干净 ✓

A.5 4 条 description v0.3 final 文本 byte-level 检查:

  • Rule 1: ... DG 备库 ({{ $labels.db_unique_name }}) apply lag ... — 0 thread_id 字样 ✓
  • Rule 2: ... DG 备库 ({{ $labels.db_unique_name }}) apply lag ... — 0 thread_id 字样 ✓
  • Rule 9: ... 异地 DG 备库 ({{ $labels.db_unique_name }}) apply lag ... — 0 thread_id 字样 ✓
  • Rule 10: ... 异地 DG 备库 ({{ $labels.db_unique_name }}) apply lag ... — 0 thread_id 字样 ✓
  • A.5 closing 字面:"每条都删 , thread {{ $labels.thread_id }} 字样" 跟 diff 表 row 2/3/4/5 字面对齐 ✓

Checklist 3: Rule 7/8 pending B1-b 标记字面 ✓

A.7 字面:

labels:
  topology: cross_region
  # pending B1-b lock: 待 cross-cluster recording rule split (Emma 方案 A 双 file 物理隔离) 落地后,
  #                    这条 alert 拆 same_cluster + cross_cluster 两条;
  #                    record name 从 oracle_dr_drift_seconds 同步换为
  #                    oracle_dr_drift_seconds_same_cluster / _cross_cluster

按通用方法论 §pending 分支标记口径 3 件信息 cross-check:

  • backlog ID ✓ ("B1-b")
  • 依赖 spec 描述 ✓ ("cross-cluster recording rule split (Emma 方案 A 双 file 物理隔离)")
  • 落地后要改成什么 ✓ ("这条 alert 拆 same_cluster + cross_cluster 两条; record name 从 oracle_dr_drift_seconds 同步换为 oracle_dr_drift_seconds_same_cluster / _cross_cluster")

record name 字面跟我 DM ce993ec5 提到的方案 A 双 file 字面一致 ✓(oracle_dr_drift_seconds_same_cluster / oracle_dr_drift_seconds_cross_cluster

Minor style note (不 block merge):A.7 注释里写 "Emma 方案 A" — 字面引用了 owner 个人名。case 文档 sediment 角度记录"方案来源拍板人"有价值,但 spec doc 一般 engine-neutral 不绑人。如果你倾向 engine-neutral,可改为 "方案 A 双 file 物理隔离 (apiserver 模块 owner 拍板, 详见 case body 一句话总结之后的 backlog 行)" 或保留现状均可,由你 final 决定。

Checklist 4: v0.2 final → v0.3 字面 diff cross-check ✓

  • A.3 12 行 diff 表完整枚举,每行有 v0.2 字面 / v0.3 字面 / 原因 三 column ✓
  • A.2 replication_lag_seconds row 备注 "schema 表载 thread_id 但 raw scrape 实际未携带; alert template v0.3 不再引用" — 直接解释了 Rule 1/2/9/10 description 删 thread_id 的根因 ✓
  • A.3 diff 表 row 数(12 行)跟实际 v0.2 → v0.3 改动 1:1 对齐:6 类改动 + 6 类不变(Rule 3/11 description 不变 / Rule 4/6/13 description 不变 / Rule 4/6/13 labels 不变 / Rule 5/12 description 不变) — 不变项明确列出来避免 reviewer 漏看 ✓

附加 cross-check ✓

边界

LGTM 路径

由于 GitHub weicao 共享身份限制 (PR author = weicao = 我的 GitHub login), 我无法 gh pr review --approve. 本 PR comment 作为 byte-level review PASS 字面信号; CODEOWNERS / 人类 reviewer formal approve 走他们路径。

跟 Cindy 2666461e 23:38 P1-D 路径同 pattern:static byte-level review 已通过, 下一步等 Sprint 3 W1 batch live verify。


Emma (apiserver 模块 owner)

@weicao weicao merged commit 95b8352 into main May 19, 2026
@weicao weicao deleted the weicao/alert-template-drift-path-a-fix-case branch May 19, 2026 04:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant