应用prometheus client_go为应用程序增加监控指标时,通常为http注册一个client_go默认的handler,这样就能够通过/metrics接口,拉取应用程序的metrics指标了:

http.Handle("/metrics", promhttp.Handler())

然而,该默认的handler会主动引入go的指标和proc的指标:

go的指标:

go_gc_duration_secondsgo_goroutinesgo_info....

proc的指标

process_start_time_secondsprocess_cpu_seconds_total....

默认handler为啥会引入go指标和proc指标,如果不须要要,能够去掉它们吗?

一. 起因

从源码中找起因,http handler:

http.Handle("/metrics", promhttp.Handler())

client_go中该handler的实现:

// prometheus/client_golang/prometheus/promhttp/http.gofunc Handler() http.Handler {    return InstrumentMetricHandler(        prometheus.DefaultRegisterer, HandlerFor(prometheus.DefaultGatherer, HandlerOpts{}),    )}

其中DefaultRegister、DefaultGather指向同一个Registry对象,即defaultRegistry

// prometheus/client_golang/prometheus/registry.govar (    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_*相干的指标;

参考:

  1. https://github.com/prometheus...