Golang使用Stackdriver时遇到报错问题如何解决

Golang使用Stackdriver时遇到报错问题如何解决

import(
"go.opencensus.io/exporter/stackdriver"
"go.opencensus.io/trace"
)

exporter, err := stackdriver.NewExporter(stackdriver.Options{
	ProjectID:            "Google-project-ID",
	BundleDelayThreshold: time.Second / 10,
	BundleCountThreshold: 10})
if err != nil {
	log.Println(err)
}
trace.RegisterExporter(exporter)
_, span := trace.StartSpan(context.Background(), "main")
defer span.End()

当我尝试将 Stackdriver 集成到我的代码中时,出现以下错误: panic: http: multiple registrations for /debug/requests

goroutine 1 [running]: net/http.(*ServeMux).Handle(0x1c78bc0, 0x17daff4, 0xf, 0x1853420, 0x1803d28) /usr/local/Cellar/go/1.10.2/libexec/src/net/http/server.go:2353 +0x239 net/http.(*ServeMux).HandleFunc(0x1c78bc0, 0x17daff4, 0xf, 0x1803d28) /usr/local/Cellar/go/1.10.2/libexec/src/net/http/server.go:2368 +0x55 net/http.HandleFunc(0x17daff4, 0xf, 0x1803d28) /usr/local/Cellar/go/1.10.2/libexec/src/net/http/server.go:2380 +0x4b golang.org/x/net/trace.init.0()


更多关于Golang使用Stackdriver时遇到报错问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang使用Stackdriver时遇到报错问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个错误是由于在 Go 程序中多次注册了 /debug/requests HTTP 端点导致的。Stackdriver exporter 内部使用了 golang.org/x/net/trace 包,该包在初始化时会自动注册这个端点。当你的代码中其他地方也导入了这个包,或者有其他库也使用了它,就会导致冲突。

以下是几种解决方案:

方案1:检查并移除重复的导入 检查你的代码中是否有多个地方导入了 golang.org/x/net/trace 包,或者是否有其他库也使用了这个包。确保只在一个地方初始化。

import (
    "context"
    "log"
    "time"
    
    "go.opencensus.io/exporter/stackdriver"
    "go.opencensus.io/trace"
    // 确保没有在其他地方重复导入 golang.org/x/net/trace
)

func main() {
    exporter, err := stackdriver.NewExporter(stackdriver.Options{
        ProjectID:            "Google-project-ID",
        BundleDelayThreshold: time.Second / 10,
        BundleCountThreshold: 10,
    })
    if err != nil {
        log.Fatal(err)
    }
    trace.RegisterExporter(exporter)
    
    _, span := trace.StartSpan(context.Background(), "main")
    defer span.End()
}

方案2:禁用 trace 的 HTTP 处理器 如果确实需要在多个地方使用,可以在导入 golang.org/x/net/trace 前设置环境变量来禁用 HTTP 处理器:

import (
    _ "golang.org/x/net/trace" // 确保在其他导入之前
    "os"
)

func init() {
    os.Setenv("NET_TRACE_DISABLE_HTTP", "1")
}

方案3:使用 Once 确保单次初始化 如果你的代码被多次调用,可以使用 sync.Once 来确保 Stackdriver exporter 只注册一次:

import (
    "context"
    "log"
    "sync"
    "time"
    
    "go.opencensus.io/exporter/stackdriver"
    "go.opencensus.io/trace"
)

var once sync.Once

func setupStackdriver() {
    once.Do(func() {
        exporter, err := stackdriver.NewExporter(stackdriver.Options{
            ProjectID:            "Google-project-ID",
            BundleDelayThreshold: time.Second / 10,
            BundleCountThreshold: 10,
        })
        if err != nil {
            log.Fatal(err)
        }
        trace.RegisterExporter(exporter)
    })
}

func main() {
    setupStackdriver()
    
    _, span := trace.StartSpan(context.Background(), "main")
    defer span.End()
}

这个错误通常发生在以下情况:

  1. 代码中多次调用了 trace.RegisterExporter
  2. 测试代码中重复初始化
  3. 多个库都依赖了 golang.org/x/net/trace

检查你的导入和初始化逻辑,确保 Stackdriver exporter 只被注册一次。

回到顶部