Skip to content

feat: 历史分两层存储,保留天数上限 365、默认 30 - #81

Merged
stqfdyr merged 7 commits into
mainfrom
feat/history-tiers
Sep 30, 2026
Merged

stqfdyr merged 7 commits into
mainfrom
feat/history-tiers

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

保留天数原来是 1–3650,历史全部按分钟保存,而主题最宽只画 7 天、匿名接口最多给 168 小时:多存的天数看不到,代价却随天数线性增长。100 台节点、每台 4 个延迟监控保留 90 天,库有 1.63 GiB,每小时的清理持锁 25 秒,打开数据页 17 秒。

  • 最近 7 天按分钟保存,更早的每小时汇总进 metric_hour / ping_hour,按保留天数清理。一小时结束后再等一小时才汇总(agent 最慢一小时上报一次,探测结果等下一帧才落库),分钟明细在所在的小时汇总之后才删
  • 汇总与清理每一步重新读取水位线,进行中恢复备份不会跳过或删掉恢复出的历史;汇总失败时照常清理;收到停止信号后在当前一步结束即返回
  • 保留天数 1–365,默认 30;已保存的值不变,没保存过的从 7 天变为 30 天,超过 365 的按 365
  • 超过 7 天的图表窗口读小时汇总,加上还没汇总的明细,明细最多读最近一周。资源均值按分钟数加权,与直接用分钟明细算的一致;峰值、丢包率和区间精确;延迟中位数在一个点跨多个小时时按答上来的次数加权
  • 分钟明细加记一分钟里最高的 CPU 占用,与网速峰值同样按 agent 的上报间隔测得。图表的每个点返回 cpu_max 与 minutes(有数据的分钟数),主题可以据此积分流量、画在线率
  • 小时汇总保留分钟明细的全部列,包括图表暂不返回的 swap、TCP/UDP 连接数与进程数
  • 窗口上限改为保留天数,登录与匿名相同:一次请求最多读一周的分钟明细或一年的小时汇总(每条序列 8760 行),不超过原来匿名窗口的扫描量。/api/me 返回 history_days
  • 每小时的清理改按节点定位,每条语句最多删一个节点一天的数据,每步之间让出锁,并挪出 runtime;数据页的历史跨度改按节点定位
  • 迁移时删掉旧版删节点、删探测后留在 ping_hour 的行(回退到旧版再升级时会有)
  • 导入备份的上限从 256 MiB 调到 1 GiB
  • 设置页的保留天数旁加问号,说明默认与上限;回收空间的说明改为需要约两倍的空闲磁盘
  • 面板的问号弹窗不再按词中间断行,宽度按各自文字确定;屏幕放不下时改用同样行数能容纳的最窄宽度

测试

  • cargo fmt --check、cargo clippy --all-targets、cargo test(129 个)通过;面板 lint、test、build 通过
  • 用例:同一份数据分别从两层画每点 1 小时与 2 小时的窗口,逐项比对(含 cpu_max、minutes),并与造数据时独立算出的分钟数、峰值和各小时均值对照,最后一小时留在明细里测两层的拼接;去掉加权、去掉水位线之后的明细、中位数不加权、不等迟到余量,四种改法各自让用例失败;汇总之前的宽窗口只读最近一周的明细。旧版本导出的备份能恢复并补建汇总表
  • 规模实测(100 台 × 4 个 60 秒探测、90 天的旧库,1.63 GiB):升级后追补 2159 小时用 150 s、清理 100 s,期间其它请求最慢 295 ms / 24 ms(p99 87 ms);回收后 134 MiB。7 天到 90 天各窗口 14–110 ms
  • 追补期间匿名请求 90 天窗口每条序列 25–110 ms(不限明细时 0.7–1.0 s),SIGTERM 后 0.1 s 退出(不检查时超过 120 s)
  • 兼容(正式版二进制):v1.3.1 在升级后的库上正常运行,回退期间删的节点在再升级时清掉孤儿行,并从水位线续汇总,重新汇总的行逐行一致;新版导出的备份交给 v1.3.1 被拒并提示先升级;追补进行中恢复旧格式备份,重启后 31 天历史完整汇总;scripts/e2e.sh 配 agent v1.1.0 通过
  • 预览环境写入 90 天历史,两个主题在 1280、390、360 宽和深浅色下实测;三个问号在 320、360、390、412、430、1280 宽和深浅色下实测,均不出屏

配套:主题 monitor-probe/monitor-theme-default#19、monitor-probe/monitor-theme-serverstatus#18;文档 monitor-probe/monitor-document#33

- 分钟明细最多保留 7 天,更早的每小时汇总进 metric_hour / ping_hour,按保留天数清理
- 超过 7 天的图表窗口读小时汇总;窗口上限改为保留天数,登录与匿名相同,/api/me 返回 history_days
- 每小时的清理改按节点定位、分片执行并挪出 runtime;数据页的历史跨度改按节点定位
- 设置页的保留天数加问号说明,回收空间的文案改为约两倍的空闲磁盘
按分层存储后的规模:300 台节点、每台 4 个延迟监控保留一年,库约 720 MiB,原来的 256 MiB 导不回去。导入 1 GiB 持锁 14–27 秒,在 agent 重连的 90 秒之内。
# Conflicts:
#	web-admin/src/components/Admin.tsx
- 汇总与清理每一步重新读取水位线:追补进行中恢复备份,不会跳过或删掉恢复出的历史;水位线早于保留期时直接从保留期起点汇总
- 汇总失败时照常清理
- 超过 7 天的窗口最多读最近一周的分钟明细,追补期间的宽窗口不再扫全部明细
- 收到停止信号后,汇总与清理在当前一步结束即返回
- 迁移时删掉旧版删节点、删探测后留在 ping_hour 的行
设置页问号改为说明默认 30 天、季付填 92、年付填 365,占位符同步
@stqfdyr stqfdyr changed the title feat: 历史分两层存储,保留天数上限 365、默认 90 feat: 历史分两层存储,保留天数上限 365、默认 30 Sep 30, 2026
- 保留天数的问号改为说明默认 30 天、上限 365 天
- 每个问号取段落行数最少的最窄宽度;屏幕放不下时改用同样行数能容纳的最窄宽度,不按屏宽截断
- 分钟明细记下一分钟里最高的 CPU 占用,与网速峰值同样按 agent 的上报间隔测得;小时汇总取其最高
- 图表的每个点返回 cpu_max 与 minutes(有数据的分钟数),主题可以据此积分流量、画在线率
- 小时汇总同时保留 swap、TCP/UDP 连接数与进程数的平均值,计数四舍五入
@stqfdyr
stqfdyr merged commit bea0a90 into main Sep 30, 2026
1 check passed
@stqfdyr
stqfdyr deleted the feat/history-tiers branch September 30, 2026 12:51
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