用 Go 打造一個服務器資源指標采集器:結合 Prometheus Exporter 實戰
在生產環境中,運維和開發同學都離不開 系統資源監控:
- 什么時候 CPU 快跑滿了?
- 內存是不是泄漏了?
- 磁盤剩余空間還能撐多久?
要做到這一點,最常見的方案是:
?? 采集系統資源指標 → 暴露給 Prometheus → 在 Grafana 里可視化。
今天我們就用 Go + go-commons/systemutils 來做一個 輕量級的 Prometheus Exporter。

@
一、為什么選擇 Prometheus Exporter?
Prometheus 本身是一個 拉取型監控系統,它會定期訪問 Exporter(通常是 HTTP 服務),獲取指標數據。
常見的 Exporter 有:
- node_exporter(系統級指標)
- mysqld_exporter(數據庫指標)
- 自研業務指標 Exporter
而我們今天要寫的,就是一個 自研的系統資源 Exporter,用 Go 來采集 CPU、內存、磁盤指標,并提供給 Prometheus。
二、環境準備
- Go 1.20+
- Prometheus 已安裝(可選)
- Grafana 已安裝(可選)
依賴庫:
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
go get github.com/Rodert/go-commons
三、代碼實現
創建 main.go:
package main
import (
"fmt"
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/Rodert/go-commons/systemutils/diskutils"
)
// 定義指標
var (
diskTotal = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "server_disk_total_bytes",
Help: "Total disk size in bytes",
})
diskUsed = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "server_disk_used_bytes",
Help: "Used disk size in bytes",
})
diskFree = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "server_disk_free_bytes",
Help: "Free disk size in bytes",
})
)
func recordMetrics() {
go func() {
for {
// 獲取根目錄的磁盤信息
info, err := diskutils.GetDiskInfo("/")
if err != nil {
fmt.Println("采集磁盤信息失敗:", err)
continue
}
// 設置指標
diskTotal.Set(float64(info.Total))
diskUsed.Set(float64(info.Used))
diskFree.Set(float64(info.Free))
// 每 10 秒采集一次
<-time.After(10 * time.Second)
}
}()
}
func main() {
// 注冊指標
prometheus.MustRegister(diskTotal, diskUsed, diskFree)
// 啟動采集
recordMetrics()
// 暴露 HTTP 接口給 Prometheus
http.Handle("/metrics", promhttp.Handler())
fmt.Println("Exporter 已啟動,監聽 :8080/metrics")
http.ListenAndServe(":8080", nil)
}
四、運行效果
運行:
go run main.go
訪問:
http://localhost:8080/metrics
你會看到類似輸出:
# HELP server_disk_free_bytes Free disk size in bytes
# TYPE server_disk_free_bytes gauge
server_disk_free_bytes 5.9e+10
# HELP server_disk_total_bytes Total disk size in bytes
# TYPE server_disk_total_bytes gauge
server_disk_total_bytes 1.0e+11
# HELP server_disk_used_bytes Used disk size in bytes
# TYPE server_disk_used_bytes gauge
server_disk_used_bytes 4.1e+10
Prometheus 就能定期拉取這些數據。
五、Prometheus 配置
在 prometheus.yml 里增加一個 job:
scrape_configs:
- job_name: 'go_commons_exporter'
static_configs:
- targets: ['localhost:8080']
重啟 Prometheus,訪問 http://localhost:9090,就能在控制臺查詢這些指標。
六、Grafana 可視化(可選)
在 Grafana 里添加 Prometheus 數據源,然后新建 Dashboard,輸入查詢:
- 磁盤已用空間(GB):
server_disk_used_bytes / 1024 / 1024 / 1024
- 磁盤使用率:
(server_disk_used_bytes / server_disk_total_bytes) * 100
就能得到一個漂亮的磁盤使用趨勢圖。
七、擴展思路
-
采集更多指標
- CPU 使用率:
cpuutils.GetCPUUsage() - 內存占用:
memutils.GetMemInfo() - 網絡流量:后續擴展
- CPU 使用率:
-
多節點部署
把這個 Exporter 部署到多臺機器,Prometheus 統一拉取。 -
告警配置
比如磁盤剩余 < 10%,通過 Alertmanager 發通知到釘釘/Slack。
八、總結
本文我們用 Go 寫了一個 輕量級服務器資源 Exporter,結合 Prometheus 和 Grafana,就能快速搭建一套可視化監控:
- go-commons 負責封裝系統指標采集邏輯
- Prometheus 負責拉取和存儲指標
- Grafana 負責展示和報警
一句話總結:
?? 只需幾十行 Go 代碼,你就能擁有自己的系統監控 Exporter。

浙公網安備 33010602011771號