gpt4 book ai didi

google-app-engine - 如何将自定义跟踪添加到 Go 中的第二代 App Engine 应用程序?

转载 作者:IT王子 更新时间:2023-10-29 02:01:18 25 4
gpt4 key购买 nike

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

即使我已经创建了一个 stackdriver 导出器并注册了跟踪,我也没有在附加到入站请求的 stackdriver 控制台中看到自定义跟踪信息。

最佳答案

我缺少的关键是了解跨度上下文如何与服务应用程序通信。 Google 利用 X-Cloud-Trace-Context header 在发送到您的服务实例的请求中传播跨度上下文,并且 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
}

使用它,我能够将自定义 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!")
}

关于google-app-engine - 如何将自定义跟踪添加到 Go 中的第二代 App Engine 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com