gogf / gf

GoFrame is a modular, powerful, high-performance and enterprise-class application development framework of Golang.
https://goframe.org
MIT License
11.44k stars 1.56k forks source link

contrib/registry/nacos/v2: panic: duplicate metrics collector registration attempted #3680

Open LanceAdd opened 1 month ago

LanceAdd commented 1 month ago

Go version

go version go1.22.4 darwin/amd64

GoFrame version

2.7.2

Can this bug be reproduced with the latest release?

Option Yes

What did you do?

load remote config from nacos

serverConfig := constant.ServerConfig{
        IpAddr: "172.16.23.99",
        Port:   8848,
    }
    clientConfig := constant.ClientConfig{
        CacheDir:    "/tmp/nacos",
        LogDir:      "/tmp/nacos",
        NamespaceId: "c1e15245-03c1-4cba-9c40-ddc59e4d4167",
    }
    configParam := vo.ConfigParam{
        DataId: "sso.yml",
        Group:  "test",
    }

    adapter, err := nacos.New(ctx, nacos.Config{
        ServerConfigs: []constant.ServerConfig{serverConfig},
        ClientConfig:  clientConfig,
        ConfigParam:   configParam,
    })
    if err != nil {
        g.Log().Fatalf(ctx, `%+v`, err)
    }
    g.Cfg().SetAdapter(adapter)

Register with Nacos

gsvc.SetRegistry(nacos.New("172.16.23.99:8848",
constant.WithNamespaceId("c1e15245-03c1-4cba-9c40-ddc59e4d4167"),
constant.WithUsername("nacos"),
constant.WithPassword("nacos"),
).SetGroupName("test"))

When I get the configuration file from Nacos and then register the service with Nacos, I get the following error


panic: duplicate metrics collector registration attempted

goroutine 1 [running]: github.com/prometheus/client_golang/prometheus.(*Registry).MustRegister(0xc0000b9db0, {0xc0004a0300, 0x2, 0x2}) /Users/shanyujie/go/pkg/mod/github.com/prometheus/client_golang@v1.12.2/prometheus/registry.go:403 +0x116 github.com/prometheus/client_golang/prometheus.MustRegister({0xc0004a0300, 0x2, 0x2}) /Users/shanyujie/go/pkg/mod/github.com/prometheus/client_golang@v1.12.2/prometheus/registry.go:178 +0x3f github.com/nacos-group/nacos-sdk-go/v2/common/monitor.init.0() /Users/shanyujie/go/pkg/mod/github.com/nacos-group/nacos-sdk-go/v2@v2.2.5/common/monitor/monitor.go:34 +0xc5 Exiting.


> sso.yml

server: address: "0.0.0.0:50001" openapiPath: "/api.json" swaggerPath: "/doc.html" accessLogEnabled: true errorLogEnabled: true pprofEnabled: false logPath: "./log" dumpRouterMap: true


### What did you see happen?

panic: duplicate metrics collector registration attempted

goroutine 1 [running]: github.com/prometheus/client_golang/prometheus.(*Registry).MustRegister(0xc0000b9db0, {0xc0004a0300, 0x2, 0x2}) /Users/shanyujie/go/pkg/mod/github.com/prometheus/client_golang@v1.12.2/prometheus/registry.go:403 +0x116 github.com/prometheus/client_golang/prometheus.MustRegister({0xc0004a0300, 0x2, 0x2}) /Users/shanyujie/go/pkg/mod/github.com/prometheus/client_golang@v1.12.2/prometheus/registry.go:178 +0x3f github.com/nacos-group/nacos-sdk-go/v2/common/monitor.init.0() /Users/shanyujie/go/pkg/mod/github.com/nacos-group/nacos-sdk-go/v2@v2.2.5/common/monitor/monitor.go:34 +0xc5 Exiting.



### What did you expect to see?

It's okay to just register the service or just get the configuration file, but it can be problematic when both are present
LanceAdd commented 1 month ago

Why is the nacos sdk referenced differently in "github.com/gogf/gf/contrib/config/nacos/v2" and "github.com/gogf/gf/contrib/registry/nacos/v2"

github.com/gogf/gf/contrib/registry/nacos/v2

github.com/joy999/nacos-sdk-go

github.com/gogf/gf/contrib/config/nacos/v2

github.com/nacos-group/nacos-sdk-go/v2

This leads to duplicate registrations when obtaining remote configuration files and registering services

wu-weichao commented 3 weeks ago

Have you solved this problem?

LanceAdd commented 3 weeks ago

Have you solved this problem?

I used github.com/nacos-group/nacos-sdk-go/v2 instead of github.com/joy999/nacos-sdk-go, and then combined it with the content of github.com/gogf/gf/contrib/registry/nacos/v2 to write my own library https://github.com/LanceAdd/nacos-gf I hope it can help you

wu-weichao commented 3 weeks ago

Have you solved this problem?

I used github.com/nacos-group/nacos-sdk-go/v2 instead of github.com/joy999/nacos-sdk-go, and then combined it with the content of github.com/gogf/gf/contrib/registry/nacos/v2 to write my own library https://github.com/LanceAdd/nacos-gf I hope it can help you

Thanks

wilsonliu123 commented 3 weeks ago

Same problem

Issues-translate-bot commented 3 weeks ago

Bot detected the issue body's language is not English, translate it automatically. 👯👭🏻🧑‍🤝‍🧑👫🧑🏿‍🤝‍🧑🏻👩🏾‍🤝‍👨🏿👬🏿


Same problem

LanceAdd commented 3 weeks ago

Same problem

The reason for this problem is that nacos-sdk-go is used in config and registry, github.com/nacos-group/nacos-sdk-go/v2 is used in config, but github.com/joy999/nacos-sdk-go is used in registry, which causes multiple initializations of monitor. If you need to, you can use this https://github.com/LanceAdd/nacos-gf temporarily