现在我在 GAE 上部署了一个 Golang 应用程序,带有堆栈驱动程序跟踪。
关于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 上运行我的应用程序,nil 指针 panic 出现在
Span.Export()
可以从 Span.End()
调用.所以,我想知道是否有人知道在特定环境(在我的情况下,在 docker 上)禁用堆栈驱动程序跟踪的方法。
否则,我应该检查跟踪配置的条件,如下所示?
if trace.projectId != "" {
ctx := reque.Context()
_, span := trace.StartSpan(ctx,"Span blahblah")
defer span.End()
}
最佳答案
谷歌在跟踪代码中添加您需要的额外逻辑是没有意义的,GAE 应用程序被检测到,以便在 GAE 应用程序在第三方环境(如 Docker on-prem)的某个地方执行时禁用该跟踪代码.这个问题的答案很可能是“不,没有魔法配置”。因此,如何解决这个问题取决于您。
作为一个总体思路:使用 Emile Pels 提供的 [NoopExporter] 跟进方法并承认我们无法使用“魔术配置”摆脱 Trace 代码,如果我用 Python 开发我的应用程序,我会考虑使用装饰器作为包装器将智能带入 Trace 调用中,或者重新定义它们作为模拟函数。似乎 Golang 没有直接模拟 Python 装饰器,但这个功能可以以某种方式实现。互联网上正在讨论这个问题,例如这里:
Go Decorator Function Pattern
Redefine function so that it references its own self
关于go - 是否有任何配置不要在特定环境中使用跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60594764/