【问题标题】:In Go, how to track down which import is causing an error which occurs upon variable initialization?在 Go 中,如何跟踪哪个导入导致变量初始化时发生的错误?
【发布时间】: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/pubsubgithub.com/myorg/some-library/pubsub/v2 的程序会因“名称冲突”而陷入恐慌在 Prometheus 指标收集器中。

我想找到哪个依赖项正在导入 github.com/myorg/some-library/pubsub 并将其替换为 pubsub/v2 以避免这种名称冲突。但是,我在弄清楚如何从这个堆栈跟踪中确定这一点时遇到了麻烦。关于如何实现这一点的任何想法?

【问题讨论】:

  • go mod whygo mod graph 帮助您跟踪依赖关系。
  • 问题不是使用不同的依赖,而是在同一个依赖中使用不同的——也就是说,代码不能同时导入pubsub/v2和@ 987654332@ 包。我想知道pubsub 包在哪里(间接)被导入,据我所知go mod graph 没有提供这些信息?
  • 1.包不携带版本,只有模块。 2. go mod why 和 graph 显示为什么,如何导入哪个包,你可以在两个包碰撞的包上运行,看看谁导入了哪个。

标签: go go-modules variable-initialization


【解决方案1】:

我最终通过在库模块中创建一个分支 avoid-registering-duplicate-metrics-collector 并从该分支导入它来解决这个问题:

go get github.com/myorg/some-lib@avoid-registering-duplicate-metrics-collector

在那个分支中,我为pubsub 包中注册的所有指标附加了一个_v1 后缀,以避免与pusub/v2 的名称冲突。不过,这有点小技巧,需要定期将主分支合并到该分支中以使其保持最新。找出导入中的哪个文件实际上正在尝试导入 pubsub 包的方法仍然有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2014-12-14
    • 2022-01-03
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多