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

用 go-commons 打造一套最小可行监控体系

在日常的 Go 服务开发中,我们常常需要回答几个关键问题:

  • 我的服务现在的 QPS(每秒请求数)是多少?
  • 服务器的 CPU、内存、磁盘 是否有瓶颈?
  • 业务指标和系统指标如何统一暴露?

传统方案是部署 node_exporter + Prometheus,再做一堆配置。但对于小型服务、内网应用、测试环境来说,这种方案太“重”了。
这时,轻量、零依赖的 go-commons 就能派上用场。

它可以帮你在业务应用中快速集成一个 最小可行监控体系(MVP)
👉 业务指标(QPS、接口耗时) + 系统指标(CPU、内存、磁盘) 一步到位。


1. 快速集成 go-commons

首先,拉取依赖:

go get github.com/Rodert/go-commons

目录结构(最小 demo):

myapp/main.gogo.mod

2. 代码案例:业务指标 + 系统指标

下面我们写一个简单的 Web 服务,包含两个接口:

  • /hello:模拟业务请求,统计 QPS
  • /metrics:暴露业务和系统指标
package mainimport ("encoding/json""fmt""net/http""sync/atomic""time""github.com/Rodert/go-commons/systemutils/cpuutils""github.com/Rodert/go-commons/systemutils/memutils""github.com/Rodert/go-commons/systemutils/diskutils"
)// QPS 计数器
var reqCount uint64
var start = time.Now()// metrics 输出结构
type Metrics struct {QPS        float64   `json:"qps"`CPUUsage   float64   `json:"cpu_usage"`LoadAvg    []float64 `json:"load_avg"`MemUsedMB  uint64    `json:"mem_used_mb"`MemTotalMB uint64    `json:"mem_total_mb"`DiskUsedGB uint64    `json:"disk_used_gb"`DiskTotalGB uint64   `json:"disk_total_gb"`
}func helloHandler(w http.ResponseWriter, r *http.Request) {atomic.AddUint64(&reqCount, 1)fmt.Fprintln(w, "Hello, World!")
}func metricsHandler(w http.ResponseWriter, r *http.Request) {// 计算 QPSduration := time.Since(start).Seconds()qps := float64(atomic.LoadUint64(&reqCount)) / durationm := Metrics{QPS: qps}// CPUif cpuInfo, err := cpuutils.GetCPUInfo(); err == nil {m.CPUUsage = cpuInfo.UsagePercentm.LoadAvg = cpuInfo.LoadAvg}// 内存if memInfo, err := memutils.GetMemInfo(); err == nil {m.MemUsedMB = memInfo.Used / 1024 / 1024m.MemTotalMB = memInfo.Total / 1024 / 1024}// 磁盘if diskInfo, err := diskutils.GetDiskInfo("/"); err == nil {m.DiskUsedGB = diskInfo.Used / 1024 / 1024 / 1024m.DiskTotalGB = diskInfo.Total / 1024 / 1024 / 1024}w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(m)
}func main() {http.HandleFunc("/hello", helloHandler)http.HandleFunc("/metrics", metricsHandler)fmt.Println("Server started at :8080")http.ListenAndServe(":8080", nil)
}

3. 实际效果

启动服务:

go run main.go

访问业务接口几次:

curl http://localhost:8080/hello

查看监控指标:

curl http://localhost:8080/metrics

输出示例:

{"qps": 12.5,"cpu_usage": 8.34,"load_avg": [0.12, 0.20, 0.30],"mem_used_mb": 512,"mem_total_mb": 4096,"disk_used_gb": 20,"disk_total_gb": 100
}

这就是一套 最小可行监控体系


4. 为什么选择 go-commons?

  • 零依赖:只用标准库 + go-commons,避免引入庞大依赖。
  • 跨平台:Linux、macOS、Windows 都支持。
  • 即插即用:无需额外部署 node_exporter。
  • 轻量:非常适合小型服务、测试环境、嵌入式应用。

5. 一起完善 go-commons 🚀

目前 go-commons 已支持 CPU、内存、磁盘 三大核心指标,未来计划:

  • 增加 网络流量、goroutine 数量、GC 次数
  • 更紧密的 Prometheus exporter 集成
  • 提供更多 监控模板示例

👉 项目地址:https://github.com/Rodert/go-commons

如果你也希望 每个 Go 服务都能自带健康监控,欢迎试用,并参与贡献!

http://www.dtcms.com/a/391259.html

相关文章:

  • 广东省省考备考(第一百零二天9.19)——言语(拔高突破第二节课)
  • 在vscode中,在powershell 下,如何进入子目录?
  • 易语言源码怎么制作软件 易语言源码和模块怎么做成软件
  • 4-2〔O҉S҉C҉P҉ ◈ 研记〕❘ WEB应用攻击▸目录遍历漏洞-B
  • 【Javaweb】http协议-请求与响应
  • 内网穿透系列十三:wstunnel 一款通过 Websocket 或 HTTP2 隧道传输的内网穿透工具
  • 【开关电源篇】自激振荡开关电源原理详解-从模块解析到故障维修
  • SpringBoot+Vue实现图片上传
  • C++ 函数指针与排序策略
  • 12分钟讲解Python核心理念
  • 01数据结构-串和KMP算法
  • 前端性能优化实用方案(三):骨架屏提升30%用户感知速度
  • NVR设备ONVIF接入平台EasyCVR视频融合平台智慧小区视频监控一站式建设方案
  • window XP环境下配置VC6.0的Win32汇编语言开发环境
  • 【算法】0_算法工程师常见算法题
  • 免费插件分享 | BaseTool
  • sk04.【scikit-learn基础】--『监督学习』之 线性回归
  • Ubuntu终端切换WiFi
  • eBest渠道商管理软件:快消品渠道数字化的“破局利器”
  • 基于protues的电子时钟仿真与模拟
  • FastProperty 高效的属性读写设置
  • 【开题答辩全过程】以 基于Java的失物招领平台为例,包含答辩的问题和答案
  • 【7/20】前后端整合:Vue.js 调用 Express API,操作 MongoDB 数据,实现用户管理系统
  • 【8/20】用户认证基础:JWT 在 Express 中的实现,实现安全登录
  • 独立站有哪些建站工具
  • Linux 终端常用快捷键整理
  • 跨域的两种解决方法
  • 小程序中获取年月日时分的组件
  • Redis热升级秘籍:零停机迁移方案与工具链
  • 时序数据库选型指南深度解析IoTDB架构设计与性能对比