在后端開發或運維工作中,采集服務器資源指標 是個繞不開的需求:
- 運維要看 CPU、內存、磁盤的使用情況
- 監控系統要定期上報這些數據
- 應用程序有時候也需要根據系統負載做限流、彈性伸縮
那么問題來了:用 Go 怎么優雅地采集這些指標呢?
為什么要自己采集指標?
很多人會問:我直接用 top
/ htop
/ vmstat
不是就能看了嗎?
沒錯,但這些工具只是給人看的。如果你需要:
- 在 代碼里自動獲取 指標
- 定期 上報到監控系統(比如 Prometheus、InfluxDB)
- 在 日志里記錄系統狀態
那就需要代碼層面的采集。
可以采集哪些指標?
常見的幾個維度:
-
CPU
- 使用率(user / system / idle)
- 核心數、邏輯線程數
-
內存
- 總內存、已用內存、空閑內存
- 使用率(百分比)
-
磁盤
- 分區空間:總大小、已用、剩余
- 使用率
-
網絡(進階)
- 網卡流量、收發包數
這些指標夠你搭建一個輕量級的監控系統了。
用 Go 怎么實現?
Go 有幾個常見做法:
-
直接調用系統命令
比如執行df -h
、free -m
,然后解析輸出。缺點是跨平臺不友好。 -
調用 /proc 接口(Linux 特有)
讀取/proc/meminfo
、/proc/stat
、/proc/diskstats
。這種方式比較底層,適合對接高性能監控。 -
用工具庫封裝
比如go-commons/systemutils
就在做這件事:用 Go 封裝一層,暴露統一的 API。這樣上層代碼就不用關心不同系統的細節。
用 go-commons/systemutils 的示例
假設我們要獲取磁盤信息,可以這樣寫:
package mainimport ("fmt""github.com/Rodert/go-commons/systemutils/diskutils"
)func main() {// 獲取根目錄磁盤信息info, err := diskutils.GetDiskInfo("/")if err != nil {panic(err)}fmt.Printf("掛載點: %s\n", info.Path)fmt.Printf("總空間: %d GB\n", info.Total/1024/1024/1024)fmt.Printf("已使用: %d GB\n", info.Used/1024/1024/1024)fmt.Printf("可用空間: %d GB\n", info.Free/1024/1024/1024)
}
輸出示例:
掛載點: /
總空間: 100 GB
已使用: 45 GB
可用空間: 55 GB
未來 systemutils
里還會有 cpuutils
、memutils
,可以類似這樣調用:
cpu := cpuutils.GetCPUUsage()
mem := memutils.GetMemInfo()
如何應用到實際項目?
-
日志增強
在關鍵操作前后,記錄系統資源情況,方便排查問題。 -
健康檢查
在 API/health
接口里,返回 CPU/內存/磁盤的占用情況。 -
報警監控
定時采集指標,當 CPU > 90% 或磁盤剩余空間 < 10% 時,發通知到釘釘/Slack。 -
資源限流
根據系統負載動態調整并發數,避免雪崩。
總結
用 Go 采集服務器資源指標并不復雜,關鍵在于:
- 選好采集方式(命令行 / proc / 工具庫)
- 保證跨平臺兼容性
- 在業務中善加利用(日志、監控、限流)
如果你不想自己重復造輪子,可以直接試試 go-commons/systemutils,它提供了簡單易用的 API,把繁瑣的系統調用封裝掉。
一句話:
👉 用 Go 采指標,用 go-commons 更輕松。