以下是一个使用 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