gpt4 book ai didi

go - Prometheus客户过早清理柜台?

转载 作者:行者123 更新时间:2023-12-01 22:07:26 25 4
gpt4 key购买 nike

我正在尝试编写一个程序,该程序公开了普罗米修斯的度量标准。
这是一个简单的程序,我想在结构上每次调用“运行”方法时都增加一个计数器。


import (
"log"
"net/http"
"time"

"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)

type myStruct struct {
errorCount prometheus.Counter
}

func (s myStruct) initialize() {
s.errorCount = prometheus.NewCounter(prometheus.CounterOpts{
Name: "my_counter",
Help: "sample prometheus counter",
})
}

func (s myStruct) run() {
s.errorCount.Add(1)
}

func main() {
s := new(myStruct)
s.initialize()

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

go func() {
for {
s.run()
time.Sleep(time.Second)
}
}()

log.Fatal(http.ListenAndServe(":8080", nil))
}

每次我尝试递增计数器时,以上代码都会失败,并显示“无法继续-错误的访问”错误。即在这一行
s.errorCount.Inc()

我无法确定为什么计数器突然从内存中消失(如果我正确理解了错误消息)。
我确定我是否缺少基本的东西去吧,还是我使用Prometheus客户端库不正确。

最佳答案

initialise()中,s通过值传递,这意味着在main()中,s.errorCountnil

只需更改initialise(和run)的声明以获取指针。

func (s *myStruct) initialize() {
...

您可能想尝试的其他一些建议:
func init() {
go func() {
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":8080", nil))
}()
}

type myStruct struct {
errorCount prometheus.Counter
}

func NewMyStruct() *myStruct {
return &myStruct {
errorCount: prometheus.NewCounter(prometheus.CounterOpts {
Name: "my_counter",
Help: "sample prometheus counter",
}),
}
}

func (s *myStruct) run() {
s.errorCount.Add(1)
}

func main() {
s := NewMyStruct()

go func() {
for {
s.run()
time.Sleep(time.Second)
}
}()

// ... OR select{}
}

关于go - Prometheus客户过早清理柜台?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60552935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com