0

现在我在 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 上运行我的应用程序,出现Span.Export()可能从Span.End().

所以,我想知道是否有人知道在特定环境(在我的情况下,在 docker 上)禁用堆栈驱动程序跟踪的方法。

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

    if trace.projectId != "" {

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

1 回答 1

1

谷歌在跟踪代码中添加您需要的额外逻辑是没有意义的,GAE 应用程序被检测到,以便在 GAE 应用程序在第三方环境(如 Docker on-prem)的某处执行时禁用该跟踪代码. 这个问题的答案很可能是“不,没有魔法配置”。因此,如何解决这个问题取决于您。

作为一个总体思路:遵循Emile Pels提供的 [NoopExporter] 方法,并承认如果我用 Python 开发我的应用程序,我会考虑使用装饰器作为包装器将智能带入 Trace 调用中,或将它们重新定义为模拟函数。似乎 Golang 没有直接模拟 Python 装饰器,但这个功能可以以某种方式实现。互联网上正在讨论这个问题,例如这里:

Go 装饰器功能模式

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

于 2020-03-11T13:35:54.137 回答