Go 我可以用OpenCensus跟踪子调用函数吗?

Go 我可以用OpenCensus跟踪子调用函数吗?,go,trace,jaeger,opencensus,Go,Trace,Jaeger,Opencensus,我想用Opencensus和Jaeger追踪整个项目。我在entry services中添加了HTTP跟踪,并在中间件中添加了stratspan,这两个span在Jaeger上调用并显示。我的问题是每个服务都包含很多功能,我希望看到我所有功能的跟踪,但这样就不会显示整个服务,也不会显示每个功能。我不喜欢每个函数添加一个stratspan。我使用ctx context.context输入我所有的功能,但没有区别 除了在每个要插入仪器的函数中启动一个量程外,实际上没有太多选项: func somet

我想用Opencensus和Jaeger追踪整个项目。我在entry services中添加了HTTP跟踪,并在中间件中添加了
stratspan
,这两个span在Jaeger上调用并显示。我的问题是每个服务都包含很多功能,我希望看到我所有功能的跟踪,但这样就不会显示整个服务,也不会显示每个功能。我不喜欢每个函数添加一个
stratspan
。我使用
ctx context.context
输入我所有的功能,但没有区别

除了在每个要插入仪器的函数中启动一个量程外,实际上没有太多选项:

func something(ctx context.Context) {
  ctx, span := trace.StartSpan(ctx, "something")
  defer span.End()
}
如果函数具有公共调用签名,或者可以将函数合并为公共调用签名,则可以编写包装器。这方面的例子可以在http中看到

以http.Handler为例,您可以为处理span生命周期的函数编写一个:

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))

    }

}

结构也可以应用类似的模式。

除了在每个要插入指令的函数中启动一个跨度之外,实际上没有太多选项:

func something(ctx context.Context) {
  ctx, span := trace.StartSpan(ctx, "something")
  defer span.End()
}
如果函数具有公共调用签名,或者可以将函数合并为公共调用签名,则可以编写包装器。这方面的例子可以在http中看到

以http.Handler为例,您可以为处理span生命周期的函数编写一个:

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))

    }

}

structs也可以应用类似的模式。

我使用Gokit和包
github.com/go kit/kit/tracing/opencensus的同一yo中间件
opencensus.TraceEndpoint('service_name')
,使用相同的方式使用中间件包围了所有服务功能,但只需添加一个span而不是每个span添加一个span!我将Gokit与包
github.com/go kit/kit/tracing/opencensus的同一yo中间件
opencensus.TraceEndpoint('service_name')
一起使用,使用相同的方式使用中间件包围了所有服务功能,但只需为每个功能添加一个span!