下面是一个简单的 Go 代码示例,演示链路追踪(使用 opentracing 库)以及定义一个 demoFunc 函数,可用于指定固定的 traceId 并返回上下文给外部使用:
package mainimport ("fmt""log""net/http"opentracing "github.com/opentracing/opentracing-go""github.com/opentracing/opentracing-go/ext""github.com/opentracing/opentracing-go/log"jaegercfg "github.com/uber/jaeger-client-go/config")func main() {// 初始化 Jaeger 配置cfg, err := jaegercfg.FromEnv()if err != nil {log.Fatal(err)}tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))if err != nil {log.Fatal(err)}defer closer.Close()opentracing.SetGlobalTracer(tracer)http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {ctx := r.Context()// 获取传入请求中的 traceIdparentSpan := opentracing.SpanFromContext(ctx)var traceId stringif parentSpan != nil {spanCtx := parentSpan.Context()traceId = spanCtx.(jaeger.SpanContext).TraceID().String()} else {// 若未指定则生成新的 traceIdspan := tracer.StartSpan("demo")defer span.Finish()ctx = opentracing.ContextWithSpan(ctx, span)traceId = span.Context().(jaeger.SpanContext).TraceID().String()}// 执行其他操作...fmt.Fprintf(w, "Trace ID: %s\n", traceId)})log.Fatal(http.ListenAndServe(":8080", nil))}func demoFunc(traceId string) {// 创建一个新的 Span,设置指定的 traceIdspan := opentracing.StartSpan("demoFunc")defer span.Finish()ext.SpanKindRPCServer.Set(span)span.LogFields(log.String("event", "demoFunc"),log.String("traceId", traceId),)// 执行其他操作...}
这个示例演示了如何使用 Jaeger 和 opentracing 库进行链路追踪。在 / 路由处理函数中,我们首先尝试从传入请求的上下文中获取已有的 span,并从中提取 traceId。如果未提供 traceId,则生成一个新的,并将其用于记录日志和返回给客户端。
在 demoFunc 函数中,可以将指定的 traceId 用于创建新的 Span,并执行其他操作。
内容由零声教学AI助手提供,问题来源于学员提问




