Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

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

Open
#345 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
43/100
Issue type
Feature
Clarity
Mostly clear
Activity status
Active
Tech stack
python, redis

Research direction

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.

Written by the indexing model from the issue text.

Description

优先级 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 系),不在本单。
Dominant language
Python
Stars
0
Forks
1
Avg merge
1h 52m
Merged PRs (30d)
15

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from jeffkit/plaita

All issues in jeffkit/plaita

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.