如何在Go中向第二代App Engine应用程序添加自定义跟踪?

时间:2018-10-22 18:50:21

标签: google-app-engine go tracing google-cloud-stackdriver

Google App Engine现在通过新的second-generation标准环境支持Go 1.11。在将较旧的标准环境应用程序转换为第二代应用程序时,如何将应用程序引擎基础结构中的跟踪信息与我使用OpenCensus添加到应用程序中的自定义跟踪结合起来并不明显。

即使我已经创建了一个堆栈驱动器导出器并注册了跟踪,但是在连接到入站请求的堆栈驱动器控制台中也没有看到自定义跟踪信息。

1 个答案:

答案 0 :(得分:2)

我缺少的关键是了解跨度上下文如何与服务应用通信。 Google利用X-Cloud-Trace-Context标头在发送给您的服务实例的请求中传播跨度上下文,而go.opencensus.io/exporter/stackdriver/propagation库提供了一种实现,可在http请求中提取并保留此信息。

不要忘记create a stackdriver exporter,并向其注册跟踪。导出程序库的文档显示了此示例。

// CreateSpanFromRequest returns a context and span based on the http.Request.
// If no existing spancontext is found, this will start a new span.
// Modifies existing request to contain the generated span's context.
func CreateSpanFromRequest(name string, r *http.Request) (context.Context, *trace.Span) {
    var span *trace.Span
    ctx := r.Context()
    httpFormat := &propagation.HTTPFormat{}
    sc, ok := httpFormat.SpanContextFromRequest(r)
    if ok {
        ctx, span = trace.StartSpanWithRemoteParent(ctx, name, sc)
    } else {
        ctx, span = trace.StartSpan(ctx, name)
    }
    // Write the span context into the http.Request.  We do this to
    // to enable chaining handlers together more easily.
    httpFormat.SpanContextToRequest(span.SpanContext(), r)
    return ctx, span
}

使用此方法,我可以向我的处理程序添加自定义范围,该范围将与stackdriver中的传入请求信息正确关联:

func indexHandler(w http.ResponseWriter, r *http.Request) {
    _, span := CreateSpanFromRequest("indexHandler", r)
    defer span.End()
    if r.URL.Path != "/" {
        http.NotFound(w, r)
        return
    }
    fmt.Fprint(w, "Hello, World!")
}