Go接口访问统计应轻量低侵入,分collector、aggregator、storage三子包各司其职;采集在HTTP中间件完成,聚合分内存滚动窗口与持久化两级,查询提供实时/日报等REST接口并含健康检查。
用 Go 实现接口访问统计,核心是轻量、低侵入、可扩展。不需要引入复杂中间件或埋点 SDK,靠合理结构设计就能做到实时采集、按需聚合、方便查询。
统计模块不负责业务逻辑,只做三件事:记录请求信息、聚合数据、提供查询接口。建议拆成三个子包:collector(采集)、aggregator(聚合)、storage(存储)。每个包只暴露
必要接口,比如 collector.Collect(req *http.Request),避免业务层直接操作内部结构。
在路由前统一拦截,不侵入 handler。用标准 http.Handler 包装即可:
/login、/api/v1/user/token),加白名单或黑名单配置time.Since() 精确到毫秒,别用 time.Now().Unix() 做差值原始请求量大,不能全存。推荐两级聚合:
sync.Map + 定时器刷新,适合看实时趋势path、method、status_code、count、sum_duration_ms、error_count、created_at
对外只暴露几个 REST 接口,例如:
GET /api/stats/realtime?path=/api/users&method=GET → 返回最近 60 秒的 QPS 和平均耗时GET /api/stats/daily?from=2025-05-01&to=2025-05-07 → 返回每日各接口调用量 Top10{ "data": {}, "code": 0, "msg": "" }
不复杂但容易忽略:加个 /api/stats/health 检查聚合是否正常运行,比如返回最近聚合时间戳和内存队列长度。