Go接口访问统计应轻量低侵入,分collector、aggregator、storage三子包各司其职;采集在HTTP中间件完成,聚合分内存滚动窗口与持久化两级,查询提供实时/日报等REST接口并含健康检查。

用 Go 实现接口访问统计,核心是轻量、低侵入、可扩展。不需要引入复杂中间件或埋点 SDK,靠合理结构设计就能做到实时采集、按需聚合、方便查询。
统计模块职责要清晰
统计模块不负责业务逻辑,只做三件事:记录请求信息、聚合数据、提供查询接口。建议拆成三个子包:collector(采集)、aggregator(聚合)、storage(存储)。每个包只暴露必要接口,比如 collector.Collect(req *http.Request),避免业务层直接操作内部结构。
采集时机选在 HTTP 中间件里
在路由前统一拦截,不侵入 handler。用标准 http.Handler 包装即可:
- 提取关键字段:路径(去掉动态参数)、方法、状态码、响应耗时、客户端 IP(可选)
- 避免记录敏感路径(如
/login、/api/v1/user/token),加白名单或黑名单配置 - 耗时用
time.Since()精确到毫秒,别用time.Now().Unix()做差值
聚合策略按时间窗口分层
原始请求量大,不能全存。推荐两级聚合:
DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。
立即学习“go语言免费学习笔记(深入)”;
- 内存内滚动窗口:每 10 秒统计一次 QPS、错误率、P95 耗时,用
sync.Map+ 定时器刷新,适合看实时趋势 - 持久化小时/天级汇总:写入本地文件或 SQLite(小规模)、MySQL(中等)、或 Prometheus(监控集成场景);字段含:
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=2024-05-01&to=2024-05-07→ 返回每日各接口调用量 Top10 - 所有接口返回 JSON,结构统一:
{ "data": {}, "code": 0, "msg": "" }
不复杂但容易忽略:加个 /api/stats/health 检查聚合是否正常运行,比如返回最近聚合时间戳和内存队列长度。









