【发布时间】:2020-04-09 11:52:38
【问题描述】:
我正在尝试为存储库运行 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 的程序会因“名称冲突”而陷入恐慌在 Prometheus 指标收集器中。
我想找到哪个依赖项正在导入 github.com/myorg/some-library/pubsub 并将其替换为 pubsub/v2 以避免这种名称冲突。但是,我在弄清楚如何从这个堆栈跟踪中确定这一点时遇到了麻烦。关于如何实现这一点的任何想法?
【问题讨论】:
-
go mod why和go mod graph帮助您跟踪依赖关系。 -
问题不是使用不同的依赖,而是在同一个依赖中使用不同的包——也就是说,代码不能同时导入
pubsub/v2和@ 987654332@ 包。我想知道pubsub包在哪里(间接)被导入,据我所知go mod graph没有提供这些信息? -
1.包不携带版本,只有模块。 2. go mod why 和 graph 显示为什么,如何导入哪个包,你可以在两个包碰撞的包上运行,看看谁导入了哪个。
标签: go go-modules variable-initialization