feat(observability): queued 行龄告警——目标池零 worker 的超龄排队行具名可观测(ADR-002 修订跟进单)

Aperta
#345 1 commento 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
43/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Attiva
Stack tecnologico
python, redis

Direzione di ricerca

Start by reading reconcile_summary, engine_sync, flow_store, and capability_gate.runtime_pool_alive to follow existing polling, queued-row, and runtime-pool patterns. Then locate the console lifecycle and health/metrics entry points. Done means aged queued rows for an empty runtime pool produce a named warning, a gauge, and a health count, while live pools and fresh rows stay quiet and one failed poll does not stop later checks.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

优先级 P2 · 依赖:无

基线 HEAD = 6f6fb862

Summary

Go 恢复生产可选 runtime(ADR-002 修订 2026-10-27)后,最后一处无防护的搁浅面:worker 停机窗口入队后、worker 一直没拉起——

  • 受理面在场点名(_admission_version_row → capability_gate.runtime_pool_alive)已于 2026-10-27 晚降级为具名 WARNING + 放行:worker 停机窗口内入队是合法运维模式(Console E2E chaos-wr 契约「停机不丢、拉起后消费」保护的对象),硬拒会打断该契约(实测:首版 422 令 chaos-wr 必红,Console E2E run 40467384887)。
  • #300 门对空池 fail-open(发布面兼容取舍)。
  • flow_worker 投递侧只保证「投递失败可观测」——「投递成功无人消费」现状零信号。

⇒ 组合结果:start 放行(合法)+ worker 永不拉起(无人消费)= queued 行静默滞留,唯有人盯队列才发现。三处设计决策均正确,缺的是滞留本身的可观测。

影响

  • runtime=go 部署只装了 console 没拉 go_worker → go 流程全部入队后静默 pending;
  • worker 全灭窗口(崩溃/误停)超过运维预期 → 滞留无告警,靠用户投诉发现。

建议

console 集群档生命周期内起周期巡检线程(对齐 reconcile_summary/engine_sync 的「降级必须可观测」先例):

  1. 每 N 秒(缺省 300,env PLAITA_QUEUED_AGE_WATCH_INTERVAL)扫 flow_store 中 status=queued 的占位行(plaita#273 形状),按目标 runtime 分组统计「排队时长 > 阈值」(缺省 900s,env PLAITA_QUEUED_AGE_WARN_SECONDS)的行数;
  2. 超龄组逐 runtime 调 capability_gate.runtime_pool_alive(redis, runtime):池空 → 具名 WARNING(点名 runtime/超龄行数/最老行龄)+ 指标暴露(metrics 端新增 gauge,如 plaita_queued_aged_rows{runtime=...})+ /health 计数(对齐 engine_sync degraded 形状);
  3. 池有活 worker(含不可分类旧 build 条目——与点名同取舍)→ 只计数不告警(worker 在消化,排队是正常态);
  4. 阈值内不告警(停机窗口短于阈值属正常 chaos 语义)。

验收条件:

  • 注入「超龄 queued 行 × go 池空」→ WARNING 具名(runtime/行数/最老行龄)+ metrics gauge > 0;
  • go 池有活 worker(可分类 manifest)→ 无告警;
  • 新鲜 queued 行(< 阈值)→ 无告警;
  • 本地档(engine backend 进程内执行,无 queued 态)零影响;
  • 巡检线程异常不退出(单轮失败隔离,同 reconcile 先例)。

边界

  • 不做自动重派/自动拉起(运维动作仍人工);
  • 不动 chaos-wr 契约与受理面放行语义;
  • suspended 行的搁浅(等唤醒类)已有订阅超时兜底(#56 系),不在本单。
Lingua principale
Python
Stelle
0
Fork
1
Merge medio
1h 52m
PR unite (30g)
15

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di jeffkit/plaita

Tutte le issue di jeffkit/plaita

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.