下面是一个使用 GoFrame 框架并集成 Jaeger 进行 HTTP 请求链路跟踪的示例。在此示例中,我们将创建一个 HTTP 服务并模拟多个服务间的调用,以观察链路跟踪信息。

1. 安装 Jaeger:

   首先确保你已经按照 Jaeger 的[安装指南](https://www.jaegertracing.io/docs/1.28/getting-started/)安装并运行了 Jaeger 服务。

2. 安装依赖库:

   使用以下命令安装 GoFrame、Jaeger 客户端等相关库:
   go get -u github.com/gogf/gf
   go get -u github.com/opentracing/opentracing-go
   go get -u github.com/uber/jaeger-client-go

3. 创建 GoFrame HTTP 服务:

   创建一个名为 main.go 的文件,内容如下:
   package main

   import (
       "context"
       "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"
       "time"
   )

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

           // 模拟业务处理
           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()
   }

4. 启动服务:

   在终端中运行以下命令启动 GoFrame 服务:
   go run main.go

   服务将在默认端口 8080 上启动。

5. 模拟服务间调用:

   在另一个终端中使用 curl 或其他 HTTP 工具模拟多个服务间的调用:
   curl http://localhost:8080/hello

   访问多次,以触发多个链路跟踪 Span。

6. 查看 Jaeger UI:

   打开浏览器访问 Jaeger UI,地址为 [http://localhost:16686](http://localhost:16686)。在 Jaeger UI 中,你应该能够看到相应的链路跟踪信息。

这是一个简单的示例,演示了如何在 GoFrame 中集成 Jaeger 进行 HTTP 请求链路跟踪。在实际应用中,你可能需要根据项目的需求更详细地配置和使用链路跟踪。


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