应用 prometheus client_go 为应用程序增加监控指标时,通常为 http 注册一个 client_go 默认的 handler,这样就能够通过 /metrics 接口,拉取应用程序的 metrics 指标了:
http.Handle("/metrics", promhttp.Handler())
然而,该默认的 handler 会主动引入 go 的指标和 proc 的指标:
go 的指标:
go_gc_duration_seconds
go_goroutines
go_info
....
proc 的指标
process_start_time_seconds
process_cpu_seconds_total
....
默认 handler 为啥会引入 go 指标和 proc 指标,如果不须要要,能够去掉它们吗?
一. 起因
从源码中找起因,http handler:
http.Handle("/metrics", promhttp.Handler())
client_go 中该 handler 的实现:
// prometheus/client_golang/prometheus/promhttp/http.go
func Handler() http.Handler {
return InstrumentMetricHandler(prometheus.DefaultRegisterer, HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}),
)
}
其中 DefaultRegister、DefaultGather 指向同一个 Registry 对象,即 defaultRegistry:
// prometheus/client_golang/prometheus/registry.go
var (defaultRegistry = NewRegistry()
DefaultRegisterer Registerer = defaultRegistry
DefaultGatherer Gatherer = defaultRegistry
)
func init() {MustRegister(NewProcessCollector(ProcessCollectorOpts{})) // 采集 Proc 指标
MustRegister(NewGoCollector()) // 采集 Go 指标
}
func MustRegister(cs ...Collector) {DefaultRegisterer.MustRegister(cs...)
}
该 Registry 对象在 init() 中,被注入了:
- NewProcessCollector: 采集过程的指标信息;
- NewGoCollector: 采集 go runtime 的指标信息;
二. 去掉 Proc 和 Go 指标
在实现本人的 exporter 或为应用程序增加指标时,若不须要 Proc/Go 指标,能够:
- 不应用 defaultRegister,本人 NewRegister,自定义应用哪些 collector,即可去掉 Proc/Go 指标;
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func main() {
// 创立一个自定义的注册表
registry := prometheus.NewRegistry()
// 可选: 增加 process 和 Go 运行时指标到咱们自定义的注册表中
registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
registry.MustRegister(prometheus.NewGoCollector())
// 创立一个简略的 gauge 指标。temp := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "home_temperature_celsius",
Help: "The current temperature in degrees Celsius.",
})
// 应用咱们自定义的注册表注册 gauge
registry.MustRegister(temp)
// 设置 gague 的值为 39
temp.Set(39)
// 裸露自定义指标
http.Handle("/metrics", promhttp.HandlerFor(registry, promhttp.HandlerOpts{Registry: registry}))
http.ListenAndServe(":8080", nil)
}
其中:
- prometheus.NewRegistry() 创立本人的注册表 ( 不应用 defaultRegistry);
-
registry.MustRegister():
- 若增加了 ProcessCollector,会主动增加 process_* 监控指标;
- 若增加了 GoCollector,会主动增加 go_* 监控指标;
- promhttp.HandlerFor 创立针对 registry 的 http handler;
- promhttp.HandlerOpts{Registry: registry}: 将增加 promhttp_* 相干的指标;
参考:
- https://github.com/prometheus…