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

标签 go google-cloud-platform google-cloud-stackdriver opencensus

现在我在 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/

相关文章:

google-cloud-platform - Google Cloud Monitoring 组包含已短暂关闭的实例

go - 在 channel 变量初始化后创建缓冲 channel

go - 有没有更优雅的方式来声明新的var并同时使用global

kubernetes - Google Kubernetes Engine (GKE) 默认指标服务器部署更新

google-cloud-platform - GCP 警报过滤器不会影响公开事件

java - Google Cloud Datastore 删除给定键的命名空间内的所有实体

google-cloud-platform - 数据流项目中的堆栈驱动程序监控 API

go - 自定义 OpenCensus 指标未出现在 Stackdriver 上

python - Golang 与 Python - 十六进制字符串到 Int

go - 如何中断 channel 上的发送