Skip to content

fix: agent 上报按自身节奏限速,流量与探测结果约每分钟落库一次 - #59

Merged
stqfdyr merged 3 commits into
mainfrom
fix/agent-ingest
Sep 24, 2026
Merged

stqfdyr merged 3 commits into
mainfrom
fix/agent-ingest

Conversation

@stqfdyr

@stqfdyr stqfdyr commented Sep 24, 2026 •

Copy link
Copy Markdown
Collaborator

hub 收 agent 上报的一侧:每条连接按 agent 自己的节奏封顶,流量与探测结果改为约每分钟落库一次。agent 与协议不变。

写入量

流量行原来每条上报提交一次,每次提交至少写一页。8 个节点每秒上报的 hub,7.3 小时写盘 1.04 GB,库只有 8 MB。

  • hub 在内存里保留每个节点最新的一条读数,跨分钟时记一次账;换了 boot_id 或计数回退时,断点两侧各记一次。总量与逐条记账相同(内核计数器一直在累加,后一次记账包含中间全部增量)
  • 会话结束、hub 正常退出时补记未记的读数;被 kill 时至多少记最后不到一分钟,下次上报补回
  • 读数按自己到达的时间归日、归账期,不会记回已经离开的那一天或那个账期;晚于今天的日期戳不算数,墙上钟往回校正后日、月计数回到今天
  • 探测结果按分钟攒在连接里,一个事务写入;被重连顶替的半开连接也写入自己攒下的,面板结束的连接(删节点、换发凭证、恢复数据库)不写。hub 退出时正在攒的那一分钟丢掉,与 metric 行未写完的那一分钟相同
  • 实测(临时 hub,单连接):每条上报写盘 6553 B → 659 B

每条连接的上限

节点 token 能以任意速率发帧,每帧都解析、多数都写库:不设限时单连接 10 秒 34,209 条上报,写盘 93 MB。现在超出 agent 自身节奏的部分丢弃:

  • 上报间隔不足 500 ms(agent 最快 1 秒一条)
  • 同一连接的第二个 hello
  • 探测结果每 5 秒超过 128 条(每节点至多 64 个探测、最短 5 秒一次,窗口可能跨两轮)
  • 丢弃与无法解析的帧,每条连接首条记 warn,其余记 debug

同样的洪泛改后写盘 16 KB。上限随连接重置,泄露的 token 反复重连时每次握手仍是两次提交;正常 agent 不会这样重连,代码里已标注上限与升级办法(按节点给握手限频),在那之前换发凭证即可止住。

其它

  • node 的内存、交换、磁盘容量随 last_seen 一起写入,节点离线后显示的是最后一次上报的值,不再是连接时的值
  • 面板的 metrics 也走白名单,只比公开页多 iface;boot_id 与原始计数器不再下发
  • metrics 里的 total_rx / total_tx / month_rx / month_tx 由 node_view 从流量行填入,与顶层同值(两个官方主题都依赖这四个字段)
  • 缺 boot_id 或计数器的上报不产生读数,流量行保持原样
  • 探测间隔下限、每节点探测数上限改为 Db 上的常量,接口校验与限流共用

测试

  • cargo fmt --check、cargo clippy --all-targets、cargo test(121 个)通过
  • 新增性质测试:跨午夜、重启、网卡减少、上报间断的序列,按分钟记账与逐条记账的流量行逐字段相同
  • 新增:同一分钟多条上报只写一行 metric;会话结束、hub 退出时补记;被顶替的会话写入自己的探测结果;已离开的日与账期不被回记,领先一年的日期戳不把计数按在未来;超速的上报与探测结果被丢弃
  • 变异检查:跨分钟时记新读数而非保留的那条、断点处漏记保留的读数、会话结束不补记、日期不取下限、去掉上报间隔或探测结果上限、被顶替的会话不写探测结果、沿用晚于今天的日期戳,均有测试失败
  • 端到端(临时 hub + 脚本 agent):正常断开、SIGTERM、SIGKILL 后恢复、同一连接内换 boot_id,四种情形流量与预期一致,日志无 warn / error;同一 token 开第二条连接顶替第一条,第一条上的 3 条探测结果全部落库

- hub 保留每个节点最新读数,跨分钟或断点时记账,会话结束与退出时补记
- 读数按到达时间归日、归账期,不回记已离开的周期
- 探测结果按分钟批量写入
- 每条连接的上报、hello、探测结果按 agent 自身节奏封顶
- 容量随 last_seen 写入;面板 metrics 也走白名单,四个流量字段由 hub 填入
- 重连顶替半开连接时,旧连接攒下的探测结果照样写入;面板结束的连接仍不写
- 墙上钟往回校正后不再沿用校正前留下的未来日期,日、月计数回到今天
- 写入上一分钟的探测结果失败时只记日志,不丢弃触发它的那一帧
@stqfdyr
stqfdyr merged commit 385c32f into main Sep 24, 2026
1 check passed
@stqfdyr
stqfdyr deleted the fix/agent-ingest branch September 24, 2026 14:07
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