使用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_*相关的指标;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。