说明:变更集中在 1 个新包文件 + 1 个重构点,api/main/测试均为适配性改动,未触及生成/写库主流程逻辑。
以下为标准 codescan_issues_diff 输出的「base 有、head 无」条目(真实数据,未做增删)。
评价:均为 Low/Medium 的复杂度/可维护性/耦合问题,无 Critical/High(severity=High 查询返回 0 条)。新代码的“重复代码块”主要来自 Current() 与 currentLocked() 的刻意的同语义重复、以及日志字段块重复,属可接受范围。
- HTTP 超时被绑定到刷新间隔 —
StartContractRefresh 用 durationEnvOr("CONTRACT_LIVE_INTERVAL", 5m) 同时作为 NewLiveSource 的超时与刷新周期:
src := contractcheck.NewLiveSource(envOr("COLLECTOR_STATUS_URL", ...),
durationEnvOr("CONTRACT_LIVE_INTERVAL", 5*time.Minute))
go contractcheck.StartRefresh(ctx, d.contracts, src,
durationEnvOr("CONTRACT_LIVE_INTERVAL", 5*time.Minute))
若运维把 CONTRACT_LIVE_INTERVAL 调大(如 24h)或调小(如 10s),HTTP 超时会随之异常放大/收紧。RefreshOnce 是同步执行,一次挂起的长请求会阻塞该刷新协程直至超时。建议:超时与周期解耦,固定一个较小的 CONTRACT_HTTP_TIMEOUT(如 5s)。
- 首次漂移会打两条 WARN —
RefreshOnce 命中 drift 时打一条带明细的 WARN;紧接着 StartRefresh.refresh() 因 lastFP=="" 再打一条「契约漂移持续存在」。属重复告警(对应工具 live.go:385 过度日志)。建议首次只打一条。
/status 每次请求重算指纹 — Stats() 内 Fingerprint(contracts) 为 O(n·log n) 排序 + sha256;/status 属监控高频轮询,规模虽小仍建议缓存或仅在 drift 判定时比较 r.live.Fingerprint。
durationEnvOr 被重复调用两次(读环境变量两次、解析两次),可提前算一次复用,避免无谓重复与潜在日志重复。