如何在Go中将自定义跨度添加到Trace中

时间:2018-06-21 11:46:02

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

我的应用程序在App Engine 标准和Go运行时上运行。 我最近的请求有以下跟踪信息:

Trace of my request in Stackdriver Trace

“ urlfetch”跨度和“ datastore_v3”跨度之间有很大的差距,因为我的应用程序在〜1000ms的时间内处理了一些CPU限制的计算。

我很乐意以编程方式将自己的计算作为自定义范围添加到“跟踪”视图中,并获得以下信息:

enter image description here

在用go编写的应用程序中是否可以做到这一点? (source here

2 个答案:

答案 0 :(得分:0)

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

  

Alpha

     

这是Go语言OpenCensus软件包的Alpha版本。这些   库可能会以向后不兼容的方式更改,但不会   推荐用于生产。他们不受任何SLA或   弃用政策。

     

Stackdriver Trace可以由Go应用程序使用   OpenCensus的Go软件包。

     

Stackdriver Trace的Go支持由OpenCensus(一组)提供   跟踪和应用程序度量工具检测库   具有多个后端。有关OpenCensus for Go的最新详细信息,   以及其他文档和示例,可以在其上找到   GitHub page

默认情况下,在灵活的环境中启用支持,但是文档没有提及标准环境(如果您是这种情况,我想试试看)。来自App Engine

  

在Google App Engine灵活环境中,Stackdriver Trace API   访问范围默认情况下处于启用状态,并且OpenCensus客户端   可以使用库而无需提供凭据或   项目ID。

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

答案 1 :(得分:0)

我可以使其与the new AppEngine runtime for Go 1.11(当前处于beta版)和OpenCensusStackdriver exporter一起使用。

enter image description here

为了将我的自定义范围附加到请求的主跟踪,我使用此实用程序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

由于需要先开始然后再终止,所以开始功能返回一个“结束”回调,以及一个新的上下文。

多次调用startSpanfWRT很好,它们可能会重叠。它需要传递*http.Request,这不是很方便(通常我们仅传递Context)。

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

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

Span having child span

Span with child span