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

今天,我们就用 Go 写一个能采集 CPU 使用率、内存使用量、磁盘使用量Mini Node Exporter,并通过 Prometheus 对外暴露。


GoLang 开发者照抄就能跑起来的迷你 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 进行拉取。

核心要点:

  1. gopsutil 获取系统资源数据
  2. prometheus/client_golang 定义并注册指标
  3. /metrics 暴露指标,Prometheus 定期抓取

这样,一个简洁可运行的 小型监控系统就完成了 🎉。

GoLang 开发者照抄就能跑起来的迷你 Node Exporter Prometheus_github_02