我想用Opencensus和Jaeger追踪整个项目。我在入口服务中添加了HTTP跟踪,并在包围我的服务的中间件中添加了stratspan
,这两个跨区在Jaeger上调用并显示。我的问题是每个服务都包含很多功能,我想查看我所有功能的痕迹,但是这样就无法显示整体服务,而每个功能都没有显示。我不喜欢每个功能添加一个stratspan
。我用ctx context.Context
项输入了我所有的功能,但没有什么不同!
除了要在每个要检测的函数中开始跨度外,实际上没有太多选择:
func something(ctx context.Context) {
ctx, span := trace.StartSpan(ctx, "something")
defer span.End()
}
如果您的函数具有公共调用签名,或者可以将函数合并为公共调用签名,则可以编写包装。有关示例,请参见http "middleware"。
考虑http.Handler,您可以为处理跨度生命周期的函数编写一个decorator:
func WithTraced(handler http.Handler, opName string) http.Handler {
return func(w http.ResponseWriter, r *http.Request) {
ctx, span := trace.StartSpan(ctx, opName)
defer span.End()
handler.ServeHTTP(w, r.WithContext(ctx))
}
}
embedding结构可以应用类似的模式。