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

Are there any config NOT to use trace on specific environment

现在我在 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 pointer panic 出现在 Span.Export() 上,可以从 Span.End().

调用

所以,我想知道是否有人知道在特定环境中禁用 stackdriver trace 的方法(对于我的情况,docker)。

否则,我是否应该检查跟踪配置的情况,如下所示?

    if trace.projectId != "" {

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

Google 没有必要在跟踪代码中添加您需要的额外逻辑,GAE 应用程序被检测,以便在 GAE 应用程序在某处执行时禁用该跟踪代码第三方环境,如 Docker 本地。该问题的答案很可能是 "No, there is no magic config for that"。因此,如何解决这个问题取决于您。

作为一个总体思路:遵循 Emile Pels 提供的 [NoopExporter] 的方法并承认我们无法使用 "magic config" 摆脱跟踪代码的事实,如果我开发我在 Python 中的应用程序 我考虑过使用装饰器作为包装器将智能部分带入 Trace 调用,或将它们重新定义为模拟函数。似乎 Golang 没有直接模拟 Python 装饰器,但这个功能可以以某种方式实现。 Internet 上正在对此进行讨论,例如此处:

Go Decorator Function Pattern