我正试图为存储库运行main()
函数,但在变量初始化时遇到了一个棘手的恐慌:
> go run main.go
go: finding github.com/myorg/some-repo/emulator latest
go: finding github.com/myorg/some-repo latest
panic: duplicate metrics collector registration attempted
goroutine 1 [running]:
github.com/prometheus/client_golang/prometheus.(*Registry).MustRegister(0xc0002a09b0, 0xc00033a1d0, 0x1, 0x1)
/Users/kurt/go/pkg/mod/github.com/prometheus/client_golang@v1.5.1/prometheus/registry.go:400 +0xad
github.com/prometheus/client_golang/prometheus/promauto.Factory.NewGaugeVec(0x1acee40, 0xc0002a09b0, 0x0, 0x0, 0x0, 0x0, 0x19ade0e, 0x21, 0x19c60fa, 0x56, ...)
/Users/kurt/go/pkg/mod/github.com/prometheus/client_golang@v1.5.1/prometheus/promauto/auto.go:306 +0x118
github.com/prometheus/client_golang/prometheus/promauto.NewGaugeVec(0x0, 0x0, 0x0, 0x0, 0x19ade0e, 0x21, 0x19c60fa, 0x56, 0x0, 0xc000370160, ...)
/Users/kurt/go/pkg/mod/github.com/prometheus/client_golang@v1.5.1/prometheus/promauto/auto.go:197 +0xa9
github.com/myorg/some-library/pubsub.init.ializers()
/Users/kurt/go/pkg/mod/github.com/myorg/some-library@v0.0.0-20200404213659-0e93c264015a/pubsub/gcp.go:30 +0xcd
exit status 2
错误归结为以下代码行:
var inFlightMetric = promauto.NewGauge(prometheus.GaugeOpts{Name: "gcp_pubsub_handlers_running_count"})
我认为问题是,同一个库也有一个pubsub/v2/gcp.go
,它是同一行,所以试图同时导入github.com/myorg/some-library/pubsub
和github.com/myorg/some-library/pubsub/v2
的程序会因普罗米修斯度量收集器中的"名称冲突"而陷入恐慌。
我想做的是找到导入github.com/myorg/some-library/pubsub
的依赖项,并将其替换为pubsub/v2
,以避免这种名称冲突。然而,我很难弄清楚如何从这个堆栈跟踪中确定这一点。关于如何实现这一点,有什么想法吗?
我最终解决了这个问题,在库模块中创建了一个分支avoid-registering-duplicate-metrics-collector
,并从该分支导入:
go get github.com/myorg/some-lib@avoid-registering-duplicate-metrics-collector
在该分支中,我为pubsub
包中注册的所有度量添加了一个_v1
后缀,以避免与pusub/v2
度量的名称冲突。不过,这有点像黑客,需要定期将主分支合并到该分支中以保持其最新状态。找出导入中实际尝试导入pubsub
包的文件的方法仍然很有用。