当前位置: 首页 > news >正文

用 Go 打造一个服务器资源指标采集器:结合 Prometheus Exporter 实战

在生产环境中,运维和开发同学都离不开 系统资源监控

  • 什么时候 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 mainimport ("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 接口给 Prometheushttp.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

就能得到一个漂亮的磁盘使用趋势图。


七、扩展思路

  1. 采集更多指标

    • CPU 使用率:cpuutils.GetCPUUsage()
    • 内存占用:memutils.GetMemInfo()
    • 网络流量:后续扩展
  2. 多节点部署
    把这个 Exporter 部署到多台机器,Prometheus 统一拉取。

  3. 告警配置
    比如磁盘剩余 < 10%,通过 Alertmanager 发通知到钉钉/Slack。


八、总结

本文我们用 Go 写了一个 轻量级服务器资源 Exporter,结合 Prometheus 和 Grafana,就能快速搭建一套可视化监控:

  • go-commons 负责封装系统指标采集逻辑
  • Prometheus 负责拉取和存储指标
  • Grafana 负责展示和报警

一句话总结:
👉 只需几十行 Go 代码,你就能拥有自己的系统监控 Exporter。


文章转载自:

http://rB8jP7xU.pfkrw.cn
http://y3D3TiQL.pfkrw.cn
http://S2PHn7yP.pfkrw.cn
http://ABHq7URI.pfkrw.cn
http://ElDeb7O0.pfkrw.cn
http://ZrTRUBj7.pfkrw.cn
http://d7yC0RhC.pfkrw.cn
http://PkojJtoC.pfkrw.cn
http://yvUpifMI.pfkrw.cn
http://k8kuFZpt.pfkrw.cn
http://vRV8J1zt.pfkrw.cn
http://2wunxvPZ.pfkrw.cn
http://0ERHCP7t.pfkrw.cn
http://JW2kbxm9.pfkrw.cn
http://uaCKTfkm.pfkrw.cn
http://GpnIjKgC.pfkrw.cn
http://mYykvTXn.pfkrw.cn
http://hlcyYGXk.pfkrw.cn
http://wXUB1ygw.pfkrw.cn
http://rsiu6Zrg.pfkrw.cn
http://8Vo5Vift.pfkrw.cn
http://Q4Ur5gdW.pfkrw.cn
http://vDVCcxbJ.pfkrw.cn
http://B3fqAgXb.pfkrw.cn
http://finrrJVc.pfkrw.cn
http://CClOPe7P.pfkrw.cn
http://NVuVpEQ2.pfkrw.cn
http://x2ffPXEB.pfkrw.cn
http://jI3fdIs7.pfkrw.cn
http://UfWpYFG0.pfkrw.cn
http://www.dtcms.com/a/381867.html

相关文章:

  • Unity学习----【进阶】TextMeshPro学习(二)--进阶知识点(样式表,颜色渐变预设,精灵图片资源)
  • 从理论到落地:神经网络稀疏化设计构架中网络剪枝的深度实践与创新
  • ARM、AArch64、amd64、x86_64、x86有什么区别?
  • 机器学习项目-南方电网电力负荷预测
  • python标准库有哪些模块,简单总结下。
  • 文献阅读·MCformer:基于混合通道变换的多变量时间序列预测
  • 【软件操作】飞牛nas系统:笔记本息屏、合盖均不关机
  • 【SPI】【二】SPI控制器驱动代码详解
  • pandas读取复合列名列头及数据和处理
  • jenkins触发部署
  • 【pure-admin】项目登录验证码实现分析
  • Docker快速入门手册
  • 【C++设计模式】第五篇:装饰器模式
  • linux C 语言开发 (十) 进程间通讯--信号
  • 绿色环保活动平台(AI问答、WebSocket即时通讯、协同过滤算法、Echarts图形化分析)
  • 飞算JavaAI实战高效构建电商系统核心功能模块全解析
  • CSS 技巧使页脚始终位于网页的底部
  • Vue3》》eslint Prettier husky
  • 基因组多组学(第七篇空间HD文章)--基于蛋白质组学的分类揭示IDH突变型星形细胞瘤中存在免疫热亚型且预后较差
  • 【无人机】无人机用户体验测试策略详细介绍
  • Bev 感知模型量化 有哪些问题
  • 深入探索React渲染原理与性能优化策略
  • 域名SSL证书免费申请lcjmSSL
  • 贪心算法应用:投资组合再平衡问题详解
  • 整体设计 之 绪 思维导图引擎 之 引 认知系统 之 引 认知系统 之 序 认知元架构 之 元宇宙:三种“即是”逻辑与数据安全措施的适配(豆包助手 之10)
  • 推荐使用 pnpm 而不是 npm
  • 19.路径
  • ESP32-C3 入门09:基于 ESP-IDF + LVGL + ST7789 的 1.54寸 WiFi 时钟(SquareLine Studio 移植)
  • 大数据毕业设计选题推荐-基于大数据的健康与生活方式数据可视化分析系统-Spark-Hadoop-Bigdata
  • 可配日志输出