【问题标题】:How to add custom span into Trace, in go如何在跟踪中添加自定义跨度
【发布时间】:2018-11-30 17:51:35
【问题描述】:

我的应用在 App Engine 标准 和 Go 运行时上运行。 我最近的请求有这个跟踪:

“urlfetch”跨度和“datastore_v3”跨度之间存在很大差距,因为我的应用处理一些 CPU 密集型计算大约需要 1000 毫秒。

我希望以编程方式将我的计算作为自定义跨度添加到 Trace 视图中,并获得如下内容:

有没有办法在我用 go 编写的应用程序中执行此操作? (source here)

【问题讨论】:

  • @Flimzy 我将不得不再次编辑标题和问题,因为它特别适用于 GAE standard 和 go 运行时。标签只是部分解决了这个问题。同一个问题与 Java、Python、Go、Php 和 NodeJS 运行时相关,但在每种情况下需要不同的答案,因此我打算创建 5 个类似的问题。
  • 没关系,但仍然没有理由在标题中加上“in go”——标签涵盖了这一点。阅读this 以获得进一步的解释。
  • 感谢 META 链接,它确实是明确的。在这种情况下,我们最终会得到 5 个标题相同的问题,我希望这不会造成太多混乱。

标签: google-app-engine go google-cloud-platform trace google-cloud-stackdriver


【解决方案1】:

看来它可能是可能的。来自Setting Up Stackdriver Trace for Go

阿尔法

这是用于 Go 的 OpenCensus 包的 alpha 版本。这些 库可能会以向后不兼容的方式进行更改,并且不会 推荐用于生产。他们不受任何 SLA 或 弃用政策。

Go 应用可以通过 Stackdriver Trace 使用 OpenCensus Go 包。

Stackdriver Trace 的 Go 支持由 OpenCensus 提供,一组 有效的跟踪和应用程序指标检测库 有多个后端。关于 OpenCensus for Go 的最新详情, 连同其他文档和示例,可以在其上找到 GitHub page.

在柔性环境中默认启用支持,但是文档没有提及标准环境(如果这是您的情况,我会说尝试一下)。来自App Engine

在 Google App Engine 柔性环境中,Stackdriver Trace API 访问范围默认启用,OpenCensus 客户端 库可以使用,而无需提供凭据或 项目 ID。

在同一页面上提供了一个应用程序code sample

【讨论】:

  • 根据本文档,确实没有明确支持 GAE 标准。我尝试了这个包,但(截至 2018 年 6 月)go.opencensus.io/exporter/stackdriver 抱怨“恐慌:不是 App Engine 上下文”,我无法解决。
【解决方案2】:

我可以使它与the new AppEngine runtime for Go 1.11(目前处于测试阶段)和OpenCensusStackdriver exporter 一起工作。

为了将我的自定义 span 附加到请求的主 Trace,我使用了这个实用程序 func:

// Start a new span "With Remote Parent"
func startSpanfWRT(r *http.Request, msg string, args ...interface{}) (c2 context.Context, endSpan func()) {
    caption := fmt.Sprintf(msg, args...)
    c := r.Context()

    spanContext, ok := (&propagation.HTTPFormat{}).SpanContextFromRequest(r)
    if !ok {
        return c, func() {}
    }
    var span *trace.Span
    c2, span = trace.StartSpanWithRemoteParent(c, caption, spanContext)
    endSpan = func() {
        span.End()
    }
    return c2, endSpan
}

请注意,它需要 *http.Request 作为参数(context.Context 在这里不够用)。

这里是the sample app source code

由于一个 span 需要开始然后停止,因此 start func 返回一个“end”回调,以及一个新的 Context。

可以多次调用startSpanfWRT,它们可能会重叠。它需要传递*http.Request,这不是超级方便(通常我们只传递上下文)。

但是,在调用startSpanfWRT 之后,您可以方便地添加子跨度,只需注意各自的上下文:

c2, childSpan := trace.StartSpan(c, caption)

【讨论】:

    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2012-12-06
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多