分布式链路追踪opentracing-go jaeger小示例
opentracing是一套分布式链路跟踪规范,jaeger(Uber开源)是该规范的go语言实现,分布式链路跟踪主要用于复杂分布式系统(如微服务)的调用链跟踪及性能分析
jaeger提供了docker的all-in-one包,里面包含了agent,collector,query,ui等组件,安装:
docker run -d -p 5775:5775/udp -p 16686:16686 -p 6831:6831/udp -p 6832:6832/udp -p 5778:5778 -p 14268:14268 jaegertracing/all-in-one:latest
启动后可在http://ip:16686查看跟踪的数据
客户端代码:
package main
import (
// "context"
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
"time"
"github.com/uber/jaeger-client-go"
"github.com/opentracing/opentracing-go"
// "github.com/opentracing/opentracing-go/log"
"github.com/uber/jaeger-client-go/config"
)
const (
URL = "http://localhost:8080"
LIST_API = "/getList"
)
var (
flag = make(chan bool)
)
func TraceInit(serviceName string, samplerType string, samplerParam float64) (opentracing.Tracer, io.Closer) {
cfg := &config.Configuration{
ServiceName: serviceName,
Sampler: &config.SamplerConfig{
Type: samplerType,
Param: samplerParam,
},
Reporter: &config.ReporterConfig{
LocalAgentHostPort: "127.0.0.1:6831", //jaeger agent address
LogSpans: true,
},
}
tracer, closer, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
if err != nil {
panic(fmt.Sprintf("Init failed: %v\n", err))
}
return tracer, closer
}
func sendRequest(req *http.Request) {
go func(req *http.Request) {
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Printf("Do send requst failed(%s)\n", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("ReadAll error(%s)\n", err)
return
}
if resp.StatusCode != 200 {
return
}
time.Sleep(time.Millisecond * 50)
fmt.Printf("Response:%s\n", string(body))
flag <- true
}(req)
}
func main() {
reqURL := URL + LIST_API
tracer, closer := TraceInit("client-tracing", "const", 1)
defer closer.Close()
opentracing.SetGlobalTracer(tracer)
span := tracer.StartSpan(fmt.Sprintf("%s trace", LIST_API))
span.SetTag("请求url", reqURL) //span tag
defer span.Finish()
var err error
req, err := http.NewRequest("GET", reqURL, nil)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
//将trace信息添加到http request header
span.Tracer().Inject(
span.Context(),
opentracing.HTTPHeaders,
opentracing.HTTPHeadersCarrier(req.Header),
)
fmt.Println(req.Header)
sendRequest(req)
<-flag
}
服务器端代码:
package main
import (
"fmt"
"io"
"net/http"
"strings"
"time"
"github.com/uber/jaeger-client-go"
"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/ext"
"github.com/uber/jaeger-client-go/config"
)
var (
tracer opentracing.Tracer
)
func TraceInit(serviceName string, samplerType string, samplerParam float64) (opentracing.Tracer, io.Closer) {
cfg := &config.Configuration{
ServiceName: serviceName,
Sampler: &config.SamplerConfig{
Type: samplerType,
Param: samplerParam,
},
Reporter: &config.ReporterConfig{
LocalAgentHostPort: "127.0.0.1:6831",
LogSpans: true,
},
}
tracer, closer, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
if err != nil {
panic(fmt.Sprintf("Init failed: %v\n", err))
}
return tracer, closer
}
func GetListProc(w http.ResponseWriter, req *http.Request) {
//从http request header 中提取trace信息
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
span := tracer.StartSpan("GetListProc", ext.RPCServerOption(spanCtx))
defer span.Finish()
fmt.Println("Get request getList")
respList := []string{"l1", "l2", "l3", "l4", "l5"}
respString := strings.Join(respList, ",")
time.Sleep(100 * time.Millisecond)
fmt.Println(respString)
io.WriteString(w, respString)
}
func main() {
var closer io.Closer
tracer, closer = TraceInit("Trace-Server", "const", 1)
defer closer.Close()
http.HandleFunc("/getList", GetListProc)
http.ListenAndServe(":8080", nil)
}
运行结果
服务端:
go run .\main.go
2022/07/30 15:07:44 debug logging disabled
2022/07/30 15:07:44 Initializing logging reporter
2022/07/30 15:07:44 debug logging disabled
Get request getList
l1,l2,l3,l4,l5
2022/07/30 15:09:12 Reporting span 2be328063be80f70:2669e721d49e49a0:2be328063be80f70:1
客户端:
go run .\main.go
2022/07/30 15:09:12 debug logging disabled
2022/07/30 15:09:12 Initializing logging reporter
2022/07/30 15:09:12 debug logging disabled
map[Uber-Trace-Id:[2be328063be80f70:2be328063be80f70:0000000000000000:1]]
Response:l1,l2,l3,l4,l5
2022/07/30 15:09:12 Reporting span 2be328063be80f70:2be328063be80f70:0000000000000000:1
在Jaeger UI查看跟踪数据:
从结果中可看出每个span的tag数据及耗时
版权声明:本文为kankan231原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。