首頁 > 軟體

prometheus client_go為應用程式自定義監控指標

2023-02-16 06:01:07

使用prometheus client_go為應用程式新增監控指標

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

以上就是prometheus client_go為應用程式自定義監控指標的詳細內容,更多關於prometheus client_go監控指標的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com