【问题标题】:can I trace sub called function with OpenCensus?我可以使用 OpenCensus 跟踪子调用函数吗?
【发布时间】:2020-07-05 20:08:52
【问题描述】:

我想用 Opencensus 和 Jaeger 跟踪整个项目。我在入口服务中添加了 HTTP 跟踪,并在中间件中添加了 stratspan,包围了我的整个服务,这两个跨度调用并显示在 Jaeger 上。我的问题是每个服务都包含很多功能,我想查看我所有功能的踪迹,但是这样不显示整体服务,不显示每个功能。我不喜欢为每个函数添加一个stratspan。我使用ctx context.Context 输入我所有的功能,但没有什么不同!

【问题讨论】:

    标签: go trace jaeger opencensus


    【解决方案1】:

    除了在您想要检测的每个函数中开始一个跨度之外,没有太多选择:

    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 结构可以应用类似的模式。

    【讨论】:

    • 我将 Gokit 与包 opencensus.TraceEndpoint('service_name') 的包 github.com/go-kit/kit/tracing/opencensus 相同的中间件 opencensus.TraceEndpoint('service_name') 使用了相同的方式使用中间件包围了所有服务功能,但只需添加一个跨度而不是每个功能一个跨度!
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多