Go语言怎么做指标监控_Go语言Metrics指标监控教程【经典】
必须显式调用 prometheus.MustRegister() 且仅一次,否则指标未注册导致 /metrics 为空或 404;自定义 Registry 需配 promhttp.HandlerFor(reg, ...),注册须在 ListenAndServe 前完成。用 prometheus/client_golang 暴露指标是 Go 服务监控的事实标准,自己手写计数器、拼 metrics 文本、绕过注册机制——全都会在上线后出问题。怎么注册指标才不会 404 或返回空?指标没注册 = Prometheus 看不见,promhttp.Handler() 只读默认注册器(prometheus.DefaultRegisterer),但很多人误以为“定义了变量就自动生效”。必须显式调用 prometheus.MustRegister(),且只能调一次;重复注册会 panic:duplicate metrics collector registration attempted如果用了自定义 prometheus.NewRegistry(),就得配 promhttp.HandlerFor(reg, ...),否则 promhttp.Handler() 还是查默认注册器,结果就是 /metrics 返回 200 但内容为空注册必须在 http.ListenAndServe() 之前完成,放在 init() 或 main() 开头最安全Counter 和 Gauge 到底该用哪个?类型选错不是“不好看”,而是会让 PromQL 查询直接失效,比如用 Gauge.Set() 记请求总数,服务重启后数值归零,rate() 就崩掉。Counter:只增不减,适合累计量——http_requests_total、errors_totalGauge:可升可降,适合瞬时值——go_goroutines、cache_size_bytes别用 Gauge 模拟 P95 延迟,那是 Histogram 的职责;也别用 Counter 记当前活跃连接数,它不会减HTTP 中间件埋点为什么耗时不准?常见写法是在 handler 开头打点、结尾再打点,但中间可能 panic、提前 return、或 defer 没覆盖所有出口,导致 Observe() 漏调或时机错位。 Trenz AI驱动的社交电商营销平台,专为TikTok Shop设计
