prometheus client_go为应用程序自定义监控指标

2023-02-16 09:54:42
目录
使用prometheus client_go为应用程序添加监控指标原因去掉Proc和Go指标

使用prometheus>

使用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>

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指标,可以:

      不使用>
      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...

        以上就是prometheus client_go为应用程序自定义监控指标的详细内容,更多关于prometheus client_go监控指标的资料请关注易采站长站其它相关文章!