在日常运维中,监控 CPU、内存、磁盘等系统资源是必不可少的。市面上虽然有成熟的 Node Exporter,但对于想学习 Prometheus 指标采集 的 Go 开发者来说,自己写一个“迷你版”更直观,也更能理解其原理。
今天,我们就用 Go 写一个能采集 CPU 使用率、内存使用量、磁盘使用量 的 Mini Node Exporter,并通过 Prometheus 对外暴露。

文章目录
- 一、准备工作
- 二、完整代码(复制即可运行)
- 三、运行 Exporter
- 四、接入 Prometheus
- 五、扩展思路
- 总结
一、准备工作
确保你本地已经安装了 Go 1.20+,然后创建项目目录:
mkdir mini-node-exporter && cd mini-node-exporter
go mod init mini-node-exporter安装依赖:
# Prometheus 官方 Go SDK
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
# 系统信息采集
go get github.com/shirou/gopsutil/v3二、完整代码(复制即可运行)
新建 main.go 文件,内容如下:
package main
import (
"fmt"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/mem"
)
// 定义 Prometheus 指标
var (
cpuUsage = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "server_cpu_usage_percent",
Help: "Current CPU usage percentage",
})
memUsage = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "server_memory_usage_bytes",
Help: "Current memory usage in bytes",
})
diskUsage = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "server_disk_usage_bytes",
Help: "Current disk usage in bytes (root /)",
})
)
func init() {
// 注册指标
prometheus.MustRegister(cpuUsage)
prometheus.MustRegister(memUsage)
prometheus.MustRegister(diskUsage)
}
// 采集函数
func recordMetrics() {
go func() {
for {
// CPU
percent, _ := cpu.Percent(time.Second, false)
if len(percent) > 0 {
cpuUsage.Set(percent[0])
}
// 内存
vm, _ := mem.VirtualMemory()
memUsage.Set(float64(vm.Used))
// 磁盘
du, _ := disk.Usage("/")
diskUsage.Set(float64(du.Used))
time.Sleep(5 * time.Second) // 每 5 秒采集一次
}
}()
}
func main() {
// 启动采集
recordMetrics()
// 暴露 HTTP /metrics 接口
http.Handle("/metrics", promhttp.Handler())
fmt.Println("🚀 Mini Node Exporter started at :2112/metrics")
http.ListenAndServe(":2112", nil)
}三、运行 Exporter
在项目根目录下执行:
go run main.go控制台会输出:
🚀 Mini Node Exporter started at :2112/metrics现在打开浏览器或执行命令:
curl http://localhost:2112/metrics可以看到类似输出:
# HELP server_cpu_usage_percent Current CPU usage percentage
# TYPE server_cpu_usage_percent gauge
server_cpu_usage_percent 12.5
# HELP server_memory_usage_bytes Current memory usage in bytes
# TYPE server_memory_usage_bytes gauge
server_memory_usage_bytes 823910912
# HELP server_disk_usage_bytes Current disk usage in bytes (root /)
# TYPE server_disk_usage_bytes gauge
server_disk_usage_bytes 15234867200四、接入 Prometheus
修改 prometheus.yml 配置文件,增加采集目标:
scrape_configs:
- job_name: "mini_node_exporter"
static_configs:
- targets: ["localhost:2112"]重启 Prometheus 后,就能在监控系统里看到采集到的 CPU、内存和磁盘指标。
五、扩展思路
- 增加 网络流量、磁盘 IOPS、系统负载 等指标
- 配合 Grafana,快速做出可视化大屏
- 打包成 Docker 镜像,方便在服务器部署
- 或者写成一个轻量版的 业务监控插件,把应用日志、请求耗时等自定义指标也接入
总结
本文我们用 Go 写了一个“迷你 Node Exporter”,采集 CPU、内存、磁盘指标,并通过 Prometheus 进行拉取。
核心要点:
-
gopsutil获取系统资源数据 -
prometheus/client_golang定义并注册指标 -
/metrics暴露指标,Prometheus 定期抓取
这样,一个简洁可运行的 小型监控系统就完成了 🎉。

















