Baggage 是分布式系统中用于在跨越多个服务的请求中传递数据的一种机制。在 OpenTracing 中,Baggage 是一组键值对,可以附加到 Span 上,并在整个链路中传递。

以下是一个使用 GoFrame 和 Jaeger 进行 HTTP 请求链路跟踪,并演示 Baggage 传递的示例:
package main

import (
"context"
"fmt"
"net/http"
"time"

"github.com/gogf/gf/frame/g"
"github.com/gogf/gf/net/ghttp"
"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/ext"
"github.com/opentracing/opentracing-go/log"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/config"
)

func main() {
// 初始化Jaeger配置
cfg, _ := config.FromEnv()
cfg.ServiceName = "my-goframe-app"
cfg.Sampler.Type = jaeger.SamplerTypeConst
cfg.Sampler.Param = 1

// 创建Jaeger跟踪器
tracer, closer, _ := cfg.NewTracer(config.Logger(jaeger.StdLogger))
defer closer.Close()

// 设置全局跟踪器
opentracing.SetGlobalTracer(tracer)

// 创建GoFrame应用
app := g.New()

// 注册路由
app.BindHandler("/hello", func(r *ghttp.Request) {
// 从HTTP请求头中提取上下文信息
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Request.Header))

// 创建一个新的Span,作为根Span或者子Span
span := tracer.StartSpan("http-request", ext.RPCServerOption(spanCtx))
defer span.Finish()

// 从Baggage中提取数据
baggageValue := span.BaggageItem("custom-key")
if baggageValue != "" {
fmt.Printf("Received baggage: %s\n", baggageValue)
}

// 模拟业务处理
time.Sleep(100 * time.Millisecond)

// 在Span中记录一些信息
span.SetTag("http.method", r.Method)
span.SetTag("http.url", r.URL.Path)

// 返回响应
r.Response.Write("Hello, World!")

// 在Span中添加日志
span.LogFields(
log.String("event", "request-handled"),
log.String("message", "The request was successfully handled."),
)
})

// 启动Web服务器
app.Run()
}

在这个示例中,我们添加了 Baggage 支持。在处理请求时,我们通过 span.BaggageItem 从当前 Span 的 Baggage 中提取了一个自定义键值对。在实际应用中,你可以使用 Baggage 传递一些额外的上下文信息,例如用户身份标识、请求跟踪信息等。

启动应用并访问 http://localhost:8080/hello,你应该能够看到输出中包含 Baggage 传递的信息。这演示了如何在 GoFrame 中使用 Jaeger 进行 HTTP 请求链路跟踪,并在链路中传递 Baggage 数据。


转载请注明出处:http://www.zyzy.cn/article/detail/7624/GoFrame