在生产环境中,运维和开发同学都离不开 系统资源监控:
- 什么时候 CPU 快跑满了?
- 内存是不是泄漏了?
- 磁盘剩余空间还能撑多久?
要做到这一点,最常见的方案是:
👉 采集系统资源指标 → 暴露给 Prometheus → 在 Grafana 里可视化。
今天我们就用 Go + go-commons/systemutils 来做一个 轻量级的 Prometheus Exporter。

@
目录
- 一、为什么选择 Prometheus Exporter?
- 二、环境准备
- 三、代码实现
- 四、运行效果
- 五、Prometheus 配置
- 六、Grafana 可视化(可选)
- 七、扩展思路
- 八、总结
一、为什么选择 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+10Prometheus 就能定期拉取这些数据。
五、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() - 网络流量:后续扩展
- 多节点部署
把这个 Exporter 部署到多台机器,Prometheus 统一拉取。 - 告警配置
比如磁盘剩余 < 10%,通过 Alertmanager 发通知到钉钉/Slack。
八、总结
本文我们用 Go 写了一个 轻量级服务器资源 Exporter,结合 Prometheus 和 Grafana,就能快速搭建一套可视化监控:
- go-commons 负责封装系统指标采集逻辑
- Prometheus 负责拉取和存储指标
- Grafana 负责展示和报警
一句话总结:
👉 只需几十行 Go 代码,你就能拥有自己的系统监控 Exporter。
















