100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 分布式链路追踪opentracing-go jaeger小示例

分布式链路追踪opentracing-go jaeger小示例

时间:2021-06-17 02:44:54

相关推荐

分布式链路追踪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 mainimport (//"context""fmt""io""io/ioutil""net/http""os""time""/uber/jaeger-client-go""/opentracing/opentracing-go"//"/opentracing/opentracing-go/log""/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 addressLogSpans: 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_APItracer, 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 tagdefer span.Finish()var err errorreq, err := http.NewRequest("GET", reqURL, nil)if err != nil {fmt.Println(err)os.Exit(1)}//将trace信息添加到http request headerspan.Tracer().Inject(span.Context(),opentracing.HTTPHeaders,opentracing.HTTPHeadersCarrier(req.Header),)fmt.Println(req.Header)sendRequest(req)<-flag}

服务器端代码:

package mainimport ("fmt""io""net/http""strings""time""/uber/jaeger-client-go""/opentracing/opentracing-go""/opentracing/opentracing-go/ext""/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.Closertracer, closer = TraceInit("Trace-Server", "const", 1)defer closer.Close()http.HandleFunc("/getList", GetListProc)http.ListenAndServe(":8080", nil)}

运行结果

服务端:

go run .\main.go/07/30 15:07:44 debug logging disabled/07/30 15:07:44 Initializing logging reporter/07/30 15:07:44 debug logging disabledGet request getListl1,l2,l3,l4,l5/07/30 15:09:12 Reporting span 2be328063be80f70:2669e721d49e49a0:2be328063be80f70:1

客户端:

go run .\main.go /07/30 15:09:12 debug logging disabled/07/30 15:09:12 Initializing logging reporter/07/30 15:09:12 debug logging disabledmap[Uber-Trace-Id:[2be328063be80f70:2be328063be80f70:0000000000000000:1]]Response:l1,l2,l3,l4,l5/07/30 15:09:12 Reporting span 2be328063be80f70:2be328063be80f70:0000000000000000:1

在Jaeger UI查看跟踪数据:

从结果中可看出每个span的tag数据及耗时

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。