如何使用Golang实现指标监控_监控指标采集方法
发布时间 - 2026-01-12 00:00:00 点击率:次最直接方式是用prometheus/client_golang注册指标并挂载promhttp.Handler()到/metrics;必须调用MustRegister(),指标为全局单例,禁用弃用的prometheus.Handler()。
用 prometheus.ClientGolang 暴露指标端点最直接
Go 服务暴露监控指标,首选官方维护的 prometheus/client_golang。它不负责采集,只提供注册、收集和 HTTP 暴露能力。你要做的,是初始化一个 promhttp.Handler() 并挂到 HTTP 路由上。
- 必须调用
prometheus.MustRegister()注册你定义的指标(如prometheus.NewCounterVec),否则指标不会出现在/metrics - 不要在每次请求里新建
Counter或Gauge—— 它们是全局单例,重复注册会 panic - HTTP handler 必须用
promhttp.Handler(),不能用http.DefaultServeMux直接返回prometheus.Handler()(后者已弃用)
package main
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
httpRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
},
[]string{"method", "status"},
)
)
func init() {
prometheus.MustRegister(httpRequestsTotal)
}
func handler(w http.ResponseWriter, r *http.R
equest) {
httpRequestsTotal.WithLabelValues(r.Method, "200").Inc()
w.WriteHeader(200)
}
func main() {
http.HandleFunc("/", handler)
http.Handle("/metrics", promhttp.Handler()) // 注意这里
http.ListenAndServe(":8080", nil)
}
自定义指标类型选错会导致查询失败或语义错误
Counter、Gauge、Histogram、Summary 不是随便换着用的。Prometheus 查询函数(如 rate()、increase())只对 Counter 有意义;用 Gauge 记请求数量,rate() 会返回 0 或负值。
-
Counter:只增不减,适合累计量(如请求总数、错误总数) -
Gauge:可增可减,适合瞬时值(如当前 goroutine 数、内存使用 MB) -
Histogram:分桶统计,适合延迟(latency)、响应大小等分布类指标;生成_sum、_count、_bucket多个时间序列 -
Summary:客户端计算分位数(如 p95),但无法聚合,多实例场景下基本不用
常见误用:Histogram 的 Buckets 设太宽(如 []float64{0.1, 0.2, 5})导致大部分请求挤在最后一个桶,p99 失真;应按实际延迟分布设,比如 []float64{0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10}(单位秒)
指标命名和 label 设计影响 Prometheus 查询效率
指标名要带语义前缀(如 myapp_http_request_duration_seconds),避免用 metric1 这类名称;label 不是越多越好,高基数(cardinality)label(如 user_id、request_id)会让 series 数量爆炸,拖慢 Prometheus 查询和存储。
- 必须用 label 区分维度:比如
method、status、path是合理 label;ip和user_agent通常不该加(除非明确需要) - 避免在 label 值里拼接字符串(如
path="/api/v1/users/"+id),这等于为每个 ID 创建新 series - 高频更新的指标(如每秒上千次
Inc())别加太多 label,写入压力会陡增
本地调试时 curl localhost:8080/metrics 看不到指标?先查三件事
暴露端点后 curl 返回空或 404,不是代码写错了就是没跑起来。
- 确认
http.ListenAndServe()没 panic,且端口没被占用(lsof -i :8080) - 确认指标已
MustRegister(),未注册的指标不会出现在/metrics输出中 - 确认没有在 handler 里调用了
os.Exit()或 panic 后没 recover,导致进程提前退出
另外,promhttp.Handler() 默认只响应 GET 和 OPTIONS,用 POST curl 会 405;调试就老实用 curl -v http://localhost:8080/metrics。
# git
# go
# github
# golang
# app
# 端口
# curl
# ai
# 路由
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何挑选优质建站一级代理提升网站排名?
实现点击下箭头变上箭头来回切换的两种方法【推荐】
如何用IIS7快速搭建并优化网站站点?
Python自动化办公教程_ExcelWordPDF批量处理案例
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何在橙子建站中快速调整背景颜色?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
北京专业网站制作设计师招聘,北京白云观官方网站?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
微信小程序 require机制详解及实例代码
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
iOS验证手机号的正则表达式
Laravel如何使用Gate和Policy进行授权?(权限控制)
如何在七牛云存储上搭建网站并设置自定义域名?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
香港服务器选型指南:免备案配置与高效建站方案解析
bootstrap日历插件datetimepicker使用方法
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
如何用美橙互联一键搭建多站合一网站?
Laravel如何使用Blade模板引擎?(完整语法和示例)
Laravel如何处理表单验证?(Requests代码示例)
Python面向对象测试方法_mock解析【教程】
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
javascript基于原型链的继承及call和apply函数用法分析
Laravel如何实现API资源集合?(Resource Collection教程)
如何在宝塔面板中创建新站点?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
利用python获取某年中每个月的第一天和最后一天
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
济南网站建设制作公司,室内设计网站一般都有哪些功能?
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
想要更高端的建设网站,这些原则一定要坚持!
Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理
打造顶配客厅影院,这份100寸电视推荐名单请查收
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何在IIS中新建站点并配置端口与物理路径?
Laravel怎么在Controller之外的地方验证数据
电商网站制作价格怎么算,网上拍卖流程以及规则?
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Internet Explorer官网直接进入 IE浏览器在线体验版网址
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
Laravel如何处理CORS跨域请求?(配置示例)


equest) {
httpRequestsTotal.WithLabelValues(r.Method, "200").Inc()
w.WriteHeader(200)
}
func main() {
http.HandleFunc("/", handler)
http.Handle("/metrics", promhttp.Handler()) // 注意这里
http.ListenAndServe(":8080", nil)
}