我的应用程序在App Engine 标准和Go运行时上运行。 我最近的请求有以下跟踪信息:
“ urlfetch”跨度和“ datastore_v3”跨度之间有很大的差距,因为我的应用程序在〜1000ms的时间内处理了一些CPU限制的计算。
我很乐意以编程方式将自己的计算作为自定义范围添加到“跟踪”视图中,并获得以下信息:
在用go编写的应用程序中是否可以做到这一点? (source here)
答案 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版)和OpenCensus与Stackdriver exporter一起使用。
为了将我的自定义范围附加到请求的主跟踪,我使用此实用程序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)