用 go-commons 打造一套最小可行监控体系
在日常的 Go 服务开发中,我们常常需要回答几个关键问题:
- 我的服务现在的 QPS(每秒请求数)是多少?
- 服务器的 CPU、内存、磁盘 是否有瓶颈?
- 业务指标和系统指标如何统一暴露?
传统方案是部署 node_exporter + Prometheus,再做一堆配置。但对于小型服务、内网应用、测试环境来说,这种方案太“重”了。
这时,轻量、零依赖的 go-commons 就能派上用场。
它可以帮你在业务应用中快速集成一个 最小可行监控体系(MVP):
👉 业务指标(QPS、接口耗时) + 系统指标(CPU、内存、磁盘) 一步到位。
1. 快速集成 go-commons
首先,拉取依赖:
go get github.com/Rodert/go-commons
目录结构(最小 demo):
myapp/main.gogo.mod
2. 代码案例:业务指标 + 系统指标
下面我们写一个简单的 Web 服务,包含两个接口:
/hello
:模拟业务请求,统计 QPS/metrics
:暴露业务和系统指标
package mainimport ("encoding/json""fmt""net/http""sync/atomic""time""github.com/Rodert/go-commons/systemutils/cpuutils""github.com/Rodert/go-commons/systemutils/memutils""github.com/Rodert/go-commons/systemutils/diskutils"
)// QPS 计数器
var reqCount uint64
var start = time.Now()// metrics 输出结构
type Metrics struct {QPS float64 `json:"qps"`CPUUsage float64 `json:"cpu_usage"`LoadAvg []float64 `json:"load_avg"`MemUsedMB uint64 `json:"mem_used_mb"`MemTotalMB uint64 `json:"mem_total_mb"`DiskUsedGB uint64 `json:"disk_used_gb"`DiskTotalGB uint64 `json:"disk_total_gb"`
}func helloHandler(w http.ResponseWriter, r *http.Request) {atomic.AddUint64(&reqCount, 1)fmt.Fprintln(w, "Hello, World!")
}func metricsHandler(w http.ResponseWriter, r *http.Request) {// 计算 QPSduration := time.Since(start).Seconds()qps := float64(atomic.LoadUint64(&reqCount)) / durationm := Metrics{QPS: qps}// CPUif cpuInfo, err := cpuutils.GetCPUInfo(); err == nil {m.CPUUsage = cpuInfo.UsagePercentm.LoadAvg = cpuInfo.LoadAvg}// 内存if memInfo, err := memutils.GetMemInfo(); err == nil {m.MemUsedMB = memInfo.Used / 1024 / 1024m.MemTotalMB = memInfo.Total / 1024 / 1024}// 磁盘if diskInfo, err := diskutils.GetDiskInfo("/"); err == nil {m.DiskUsedGB = diskInfo.Used / 1024 / 1024 / 1024m.DiskTotalGB = diskInfo.Total / 1024 / 1024 / 1024}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(m)
}func main() {http.HandleFunc("/hello", helloHandler)http.HandleFunc("/metrics", metricsHandler)fmt.Println("Server started at :8080")http.ListenAndServe(":8080", nil)
}
3. 实际效果
启动服务:
go run main.go
访问业务接口几次:
curl http://localhost:8080/hello
查看监控指标:
curl http://localhost:8080/metrics
输出示例:
{"qps": 12.5,"cpu_usage": 8.34,"load_avg": [0.12, 0.20, 0.30],"mem_used_mb": 512,"mem_total_mb": 4096,"disk_used_gb": 20,"disk_total_gb": 100
}
这就是一套 最小可行监控体系。
4. 为什么选择 go-commons?
- 零依赖:只用标准库 + go-commons,避免引入庞大依赖。
- 跨平台:Linux、macOS、Windows 都支持。
- 即插即用:无需额外部署 node_exporter。
- 轻量:非常适合小型服务、测试环境、嵌入式应用。
5. 一起完善 go-commons 🚀
目前 go-commons 已支持 CPU、内存、磁盘 三大核心指标,未来计划:
- 增加 网络流量、goroutine 数量、GC 次数
- 更紧密的 Prometheus exporter 集成
- 提供更多 监控模板示例
👉 项目地址:https://github.com/Rodert/go-commons
如果你也希望 每个 Go 服务都能自带健康监控,欢迎试用,并参与贡献!