go采集硬件指标需依赖gopsutil等库而非直接暴露,linux下温度需lm-sensors支持,磁盘路径须过滤可读挂载点,指标命名须规范带标签,端点须加访问控制,云环境传感器数据常不可用。

Go 本身不直接暴露硬件指标(如 CPU 温度、磁盘 SMART 数据、网卡丢包率),必须借助系统工具或第三方库采集后转为 Prometheus 格式。硬要“快速集成”,核心是绕过自己写 syscall 或解析 /sys/proc,用成熟封装。
用 gopsutil + prometheus/client_golang 拉取基础硬件指标
gopsutil 是最稳妥的选择,跨平台支持 Linux/macOS/Windows,能读取 CPU 使用率、内存占用、磁盘 I/O、网络接口统计等 —— 这些都是内核暴露的稳定接口,无需 root 权限(部分指标如温度除外)。
常见错误现象:cpu.Percent 返回空 slice、disk.Partitions 报 permission denied、host.SensorsTemperatures 在 Linux 上始终为空。
- Linux 下
host.SensorsTemperatures依赖 lm-sensors,需提前运行sensors-detect并加载模块(如coretemp),否则返回空;macOS 可用osx-cpu-temp替代 -
disk.Usage对挂载点路径敏感,避免用/直接查根分区,应先调用disk.Partitions(true)过滤可读挂载点 - CPU 百分比默认是全局平均值,如需每核数据,传
true给cpu.Percent的第二个参数
注册硬件指标时别漏掉 Labels 和命名规范
Prometheus 要求指标名语义清晰、标签维度合理,否则 Grafana 查起来全是 metric1{instance="xxx"} 这种废标。
示例:磁盘使用率应定义为 disk_usage_percent,而非 disk_used;并带 device 和 mountpoint 标签:
var diskUsage = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "disk_usage_percent",
Help: "Disk usage percentage by device and mountpoint",
},
[]string{"device", "mountpoint"},
)
func init() {
prometheus.MustRegister(diskUsage)
}
- 别用
Counter记磁盘用量——它是只增不减的,而磁盘空间会释放 - 避免在采集函数里反复调用
NewGaugeVec,必须在init()或启动时注册一次 - 标签值不能含空格或斜杠,
mountpoint="/data/app"需替换为mountpoint="data_app"防止解析失败
暴露端点前务必加访问控制
硬件指标包含系统拓扑、设备型号甚至序列号(如 host.Info 中的 VirtualizationSystem),一旦暴露在公网,等于送攻击面。
- 不要用
http.Handle("/metrics", promhttp.Handler())直接挂载,改用中间件限制 IP 段或 BasicAuth - 禁止对
/metrics开放OPTIONS、POST方法,只保留GET - 如果服务部署在 Kubernetes,把 metrics 端口设为
targetPort但不暴露到 Service,仅通过 Pod IP +kubectl port-forward访问
温度/风扇转速这类指标实际可用性很低
除非你明确知道目标机器装了传感器且驱动就绪,否则别默认开启。多数云服务器(AWS EC2、阿里云 ECS)根本不提供物理传感器数据,host.SensorsTemperatures 必然空;裸金属集群也常因 BIOS 设置禁用传感器。
真正可靠的是间接指标:
- CPU 使用率持续 >90% 且
go_goroutines暴涨 → 可能过热降频 -
node_cpu_seconds_total{mode="idle"}下降快 → 实际负载高,比温度更可信 - 用
process_cpu_seconds_total对比业务进程与系统整体 CPU 占比,判断是否被其他进程挤占
硬件监控的复杂点不在代码,而在环境适配——同一段 Go 代码,在笔记本上能读出 CPU 温度,在 AWS t3.micro 上连 /sys/class/hwmon 目录都不存在。先确认采集源是否真实存在,再写指标逻辑。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











