В Go как отследить, какой импорт вызывает ошибку, возникающую при инициализации переменной? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь запустить функцию main() для репозитория, но сталкиваюсь с неразрешимой пани c, которая возникает при инициализации переменной:

> 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, запускаются в пани. c вызвано «конфликтом имен» в сборщиках метрик Prometheus.

Я хотел бы найти, какая зависимость импортирует github.com/myorg/some-library/pubsub, и заменить ее на pubsub/v2, чтобы избежать конфликта имен. Однако у меня возникли проблемы с определением того, как определить это по трассировке стека. Есть идеи как этого добиться?

1 Ответ

0 голосов
/ 09 апреля 2020

Я решил обойти эту проблему, создав ветку avoid-registering-duplicate-metrics-collector в модуле библиотеки и импортировав ее из этой ветки:

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

В этой ветке я прикрепил суффикс _v1 ко всем метрики, зарегистрированные в пакете pubsub, чтобы избежать конфликтов имен с pusub/v2. Это немного хакерство и требует регулярного слияния основной ветки с этой веткой, чтобы поддерживать ее в актуальном состоянии. Способ выяснить, какой файл в импорте действительно пытается импортировать пакет pubsub, все равно будет полезен.

...