go - 如何使用OpenCensus跟踪称为函数的子函数?

标签 go trace jaeger opencensus

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

最佳答案

除了在要检测的每个函数中开始跨度外,实际上没有太多选择:

func something(ctx context.Context) {
  ctx, span := trace.StartSpan(ctx, "something")
  defer span.End()
}

如果您的函数具有 public 调用签名,或者可以将函数合并为 public 调用签名,则可以编写包装器。有关示例,请参见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结构可以应用类似的模式。

关于go - 如何使用OpenCensus跟踪称为函数的子函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60846142/

相关文章:

arrays - 将结构数组转换为字符串数组以显示为表格

java - 打印堆栈跟踪干扰打印行

mongodb - 如何使用 mongodb 3.6 中的新 URL 从 golang 连接

java - JDK 1.5 是否支持 -Xdebug 选项?

c# - System.Diagnostics.Trace,最简单的编程配置

elasticsearch - 如何删除 Elasticsearch 中 Jaeger 的旧索引?

spring - 在 Spring 应用程序中配置 Jaeger

java - 向 jaeger 代理发送跟踪时出现问题

go make slice 比 []{1,1,1,1} 慢一点

regex - 禁止空字符串和逗号的正则表达式