是否有任何不在特定环境中使用跟踪的配置



现在我已经在GAE上部署了一个Golang应用程序,带有stackdriver跟踪。关于stackdriver Trace,为了获得自定义跨度数据,我在代码上进行了设置,比如

exporter, err := stackdriver.NewExporter(stackdriver.Options{
ProjectID: os.Getenv("GOOGLE_CLOUD_PROJECT"),
})
if err != nil {
log.Fatal(err)
}
trace.RegisterExporter(exporter)
client := &http.Client{
Transport: &ochttp.Transport{
// Use Google Cloud propagation format.
Propagation: &propagation.HTTPFormat{},
},
}

参考。https://cloud.google.com/trace/docs/setup/go

在GAE上,我成功地在GCP控制台上查看了跟踪。

但是,我不想在我的本地开发环境中跟踪这些日志(我使用的是docker(。目前,我试图在docker上运行我的应用程序,零指针恐慌显示在Span.Export()上,它可能从Span.End()调用。

所以,我想知道是否有人知道在特定环境下禁用stackdriver跟踪的方法(在我的案例中,在docker中(。

否则,我应该检查跟踪配置的条件吗,如下所示?

if trace.projectId != "" {
ctx := reque.Context()
_, span := trace.StartSpan(ctx,"Span blahblah")
defer span.End()
}

当GAE应用程序在Docker on-prem等第三方环境中执行时,为了禁用跟踪代码,谷歌在跟踪代码中添加所需的额外逻辑是没有意义的。这个问题的答案很可能是"不,没有神奇的配置"。因此,如何解决这个问题取决于你自己。

总的来说:遵循Emile Pels提供的[NoopExporter]的方法,并承认我们无法用"magic config"去除Trace代码,如果我用Python开发我的应用程序,我会考虑使用decorator作为包装器,将智能片段引入Trace调用,或将其重新定义为模拟函数。Golang似乎没有Python装饰器的直接模拟,但这个功能可以以某种方式实现。互联网上正在讨论这一点,例如:

Go装饰器功能模式

重新定义函数,使其引用自己的

最新更新