如何在prometheus/client_golang中禁用go_collector指标

cwtwac6a  于 2023-02-20  发布在  Go
关注(0)|答案(6)|浏览(153)

我正在使用NewGaugeVec报告我的指标:

elapsed := prometheus.NewGaugeVec(prometheus.GaugeOpts{
    Name: "gogrinder_elapsed_ms",
    Help: "Current time elapsed of gogrinder teststep",
}, []string{"teststep", "user", "iteration", "timestamp"})
prometheus.MustRegister(elapsed)

所有工作正常,但我注意到我的自定义导出器包含prometheus/go_collector.go的所有指标:

# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0.00041795300000000004
go_gc_duration_seconds{quantile="0.25"} 0.00041795300000000004
go_gc_duration_seconds{quantile="0.5"} 0.00041795300000000004
...

我怀疑这是一种默认行为,但我没有找到任何关于如何禁用它的文档。如何配置我的自定义导出器,使这些默认指标消失的想法?

f5emj3cl

f5emj3cl1#

这个主题已经很老了,但是为了防止其他人不得不处理它,下面的代码可以很好地与当前的代码库v0.9.0-pre1配合使用

// [...] imports, metric initialization ...

func main() {
  // go get rid of any additional metrics 
  // we have to expose our metrics with a custom registry
  r := prometheus.NewRegistry()
  r.MustRegister(myMetrics)
  handler := promhttp.HandlerFor(r, promhttp.HandlerOpts{})

  // [...] update metrics within a goroutine

  http.Handle("/metrics", handler)
  log.Fatal(http.ListenAndServe(":12345", nil))
}
chy5wohz

chy5wohz2#

我会简单地这样做-〉

// Register your collectors
elapsed := prometheus.NewGaugeVec(prometheus.GaugeOpts{
    Name: "gogrinder_elapsed_ms",
    Help: "Current time elapsed of gogrinder teststep",
}, []string{"teststep", "user", "iteration", "timestamp"})
prometheus.MustRegister(elapsed)
// Remove Go collector
prometheus.Unregister(prometheus.NewGoCollector())
mdfafbf1

mdfafbf13#

我的想法是创建一个自定义注册表并注册我们的指标。确保在打开指标的处理程序选项中传递False将禁用那些默认指标

var httpDuration = prometheus.NewHistogramVec(prometheus.HistogramOpts{
        Name: "golang_api_http_duration_seconds",
        Help: "Duration of HTTP requests.",
    }, []string{"path", "host"})

promReg := prometheus.NewRegistry()
promReg.MustRegister(httpDuration)

handler := promhttp.HandlerFor(
        promReg,
        promhttp.HandlerOpts{
            EnableOpenMetrics: false,
        })

http.Handle("/metrics", handler)
log.Fatal(http.ListenAndServe(":12345", nil))
q8l4jmvw

q8l4jmvw4#

这在Go语言的客户端是不可能的,一旦https://github.com/prometheus/client_golang/issues/46完成,你就有办法做到这一点。
一般来说,你希望你的自定义出口出口这些,唯一的我知道它目前没有意义的是snmp和黑盒出口。
顺便说一下,timestamp作为标签似乎有些奇怪,如果你想的话,你应该使用日志记录而不是指标。参见https://blog.raintank.io/logs-and-metrics-and-graphs-oh-my/普罗米修斯的方法是将时间戳作为一个值,而不是作为一个标签。

h79rfbju

h79rfbju5#

说“你必须自己去做”并不是一个真正有帮助的答案,但这似乎是目前唯一的选择。
因为普罗米修斯是开源的,如果你真的需要这样做;我相信你必须派生this one go_collector.go第28行和相关部分,或者更好的是修改它,使所有这些指标都是可选的,并制作一个PR,以便其他人也可以在未来从中受益。

相关问题