Skip to content

feat: 优化新版主机指标渐进式加载 --story=137152595 - #11989

Open
chenguo367 wants to merge 11 commits into
masterfrom
acceptance/host-metric-progressive-20260814
Open

feat: 优化新版主机指标渐进式加载 --story=137152595#11989
chenguo367 wants to merge 11 commits into
masterfrom
acceptance/host-metric-progressive-20260814

Conversation

@chenguo367

@chenguo367 chenguo367 commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

close #1010158081137152595

方案

  • 先加载基础主机列表,并按唯一 bk_host_id 数量分流:少于 2,000 台沿用原一次性全量指标请求,达到或超过 2,000 台才启动页级指标与全业务快照。
  • 大业务中,基础列表、当前页指标和后台全量快照并行;当前页与快照已完成分区一经返回,立即参与展示、排序、筛选、关键字搜索和快捷统计。
  • READY 只表示全业务指标覆盖完整,不再作为功能开关。部分分区失败或 UQ partial 时进入 DEGRADED,保留并返回成功数据;只有没有任何可用分区时才进入 FAILED
  • deadline 遵循“有数据优先”:已有 READY/PARTIAL 分区时持久化为 DEGRADED 并继续返回,零分区才 EXPIRED;该语义覆盖任务循环、轮询和最终 READY 提交三条超时路径。
  • DEGRADED 在 scope 主机集合变化时可转 EXPIRED,剩余可用分区全部缺失或损坏时可转 FAILED;后续 create 不复用 FAILED/EXPIRED 指针。
  • 未获取字段保持未知,不补零,也不推导为正常、无数据或无进程;指标排序把未知值置后,正向和反向指标筛选只判断已知值,同时展示各类指标的已获取主机数与总主机数。
  • 全量快照完成后,以相同时间锚点的完整结果原子替换已获得的局部指标;数据集代次保护旧页请求和旧快照不回写。
  • 快照范围由服务端根据普通会话或分享 scope 解析,浏览器不上传全业务主机 ID;创建、轮询和数据释放均执行权限、时间、租户、业务和当前主机范围校验。
  • 后台使用显式共享 Redis、singleflight、按业务并发租约、不可变压缩 section blob 和受限 Celery 任务;业务告警使用 host ID、IPv4、IPv6 三路互斥 composite 聚合。
  • 整条新链路由 ENABLE_HOST_METRIC_PROGRESSIVE 控制,默认关闭;小业务即使开启也不会创建快照或占用后台容量。

验证

  • 后端组合测试 233/233 通过;新增红绿测试覆盖已发布分区后的 task/poll deadline、READY 提交前越过 deadline、DEGRADED scope 作废和最后可用 blob 损坏。
  • 新版主机前端 tests/host-*.test.cjs 126/126 通过,覆盖部分数据立即排序/筛选/统计/搜索、未知值与真实零值、覆盖率、手动重试及页请求与快照竞态。
  • Python Ruff/format、前端 ESLint/Biome/Stylelint/Prettier、raw Worker 语法检查和 git diff --check 通过;ESLint/Biome 仅保留修改前已有的命名与 skeleton index-key 警告。
  • Trace 全量 TypeScript 检查仍受仓库既有 Vue2/Vue3 类型依赖冲突阻断;过滤本次主机目标文件无诊断。

阈值依据

通过主机规模运营分布选择 500、1,000、2,000、5,000 档代表业务,并以最近 3 分钟单磁盘指标查询做初步对拍:500/1,000 档低于 2 秒,约 2,000 档进入 3.6 秒过渡区,约 5,000 档达到 5 秒,因此默认取 2,000。运行时只使用本次基础主机接口返回的唯一主机数,不依赖运营指标。

启用前门禁

本 PR 交付默认关闭的暗代码,不代表生产性能验收完成。开启前仍需在真实大业务验证:ES composite 分页与告警分区总耗时、2 万主机快照时延及 Pod RSS/Redis 容量、50 客户端轮询负载、真实 Redis singleflight、worker 异常恢复,以及 2,000 台分流点附近的端到端页面收益。任一门禁不通过均保持开关关闭并沿用旧链路。

close #1010158081137159376

## 改造范围

- 保留现有 search_host_metric 接口,新增受 scope 约束的主机指标快照创建与轮询接口。
- 使用显式共享 Redis、singleflight、按业务并发租约、不可变压缩 section blob 和专用 Celery task。
- 普通业务快照不携带全量 host_id target;告警段使用 host_id、IPv4、IPv6 三路互斥 composite 聚合和
CMDB 白名单映射。
- 每次返回数据前重新校验权限、scope、时间锚点和主机集合;分享态仅允许 create/retrieve。

## 默认状态与启用前门禁

ENABLE_HOST_METRIC_PROGRESSIVE 默认关闭。启用前必须完成以下真实环境压测并记录结论:

1. 真实 ES composite:验证 20,000 主机业务下的分页总量、总耗时、超时和索引兼容性。
2. 真实 Redis:验证 Web 与 Celery worker 使用同一 Redis alias,以及
singleflight、容量租约、任务死亡和 Redis 异常恢复。
3. 20,000 主机内存:验证 section blob 大小、压缩耗时和 Web/worker Pod RSS 硬上限。
4. 50 客户端轮询:验证 data-bearing/READY 轮询中的 CMDB scope 解析、host hash 和 gzip
开销。

任何门禁未通过均保持开关关闭,并继续使用旧的分页指标链路。

## 关联 PR

PR-C #11984 负责前端渐进式接线,依赖本 PR 的快照协议。两者均以
acceptance/host-metric-progressive-20260814 为 base,需在验收分支组合回归后再统一面向
master 交付;本 PR 不移除旧接口。
close #1010158081137159498

## 改造内容

- 主机基础列表与全量指标快照并发加载,统一采用双路渐进模式,不按业务规模分支。
- 快照运行期间仅补齐当前页指标;页级结果只作为 overlay,不参与全局排序、筛选和统计。
- 四段快照全部成功且主机集合哈希一致后原子替换全量指标,并清理页级 overlay。
- 快照未就绪前禁用指标快捷卡、指标排序和指标筛选,基础字段检索与排序保持可用。
- 补齐 epoch、快照重试、页面卸载、翻页交错和旧响应回写等竞态保护。

## 合入顺序与开关

- 依赖后端快照 API PR-B;请先将后端路由合入验收分支,本 PR 暂不先行合入。
- 功能开关默认关闭;部署侧需由后端 context 将 `ENABLE_HOST_METRIC_PROGRESSIVE` 注入为
`window.enable_host_metric_progressive` 后才会启用新链路。
- 开关仅用于整条渐进链灰度和回退,不引入大小业务分支。

## 验证

- `node --test tests/host-*.test.cjs`:120/120 通过。
- 目标文件 ESLint、Biome、Stylelint、Prettier 与 `git diff --check` 通过。
- 全量 TypeScript 检查仍受仓库既有 `@vitejs/plugin-vue-jsx` moduleResolution
配置错误阻断;报错仅位于三个既有 build 脚本。
@chenguo367 chenguo367 added feat A new feature. Correlates with MINOR in SemVer project/monitor project monitor 主机监控 labels Aug 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat A new feature. Correlates with MINOR in SemVer project/monitor project monitor 主机监控

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants