前提条件
获取接入点信息。
- 登录链路追踪TAS控制台。
- 在左侧导航栏单击「 链路配置 」,然后在右侧页面单击「 接入点信息 」页签。
- 打开显示Token开关。
- 在客户端采集工具区域选择 Jaeger 。在下方表格的相关信息列中,获取接入点信息。
通过Jaeger SDK上报数据
- 引入go依赖包。
import ( "github.com/opentracing/opentracing-go" "github.com/uber/jaeger-client-go" "github.com/uber/jaeger-client-go/transport" )
- 初始化Jaeger SDK。
func NewJaegerTracer(service string) opentracing.Tracer { auth := map[string]string{ "x-ctg-authorization": "", //上面获取到的token } sender := transport.NewHTTPTransport( "", //jaeger 上报的http地址 transport.HTTPHeaders(auth), ) tracer, _ := jaeger.NewTracer(service, jaeger.NewConstSampler(true), jaeger.NewRemoteReporter(sender, jaeger.ReporterOptions.Logger(jaeger.StdLogger)),) return tracer }
- client 端上报demo。
func runClient(tracer opentracing.Tracer, httpUrl string, spanName string, r *http.Request) { c := &http.Client{Transport: &nethttp.Transport{}} span := tracer.StartSpan(spanName) if r != nil { spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span = tracer.StartSpan(spanName, opentracing.ChildOf(spanCtx)) } span.SetTag(string(ext.Component), spanName) defer span.Finish() ctx := opentracing.ContextWithSpan(context.Background(), span) req, err := http.NewRequest( "GET", httpUrl, nil, ) tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) if err != nil { onError(span, err) return } req = req.WithContext(ctx) // wrap the request in nethttp.TraceRequest req, ht := nethttp.TraceRequest(tracer, req) defer ht.Finish() res, err := c.Do(req) if err != nil { onError(span, err) return } defer res.Body.Close() body, err := ioutil.ReadAll(res.Body) if err != nil { onError(span, err) return } fmt.Printf("Received result: %s\n", string(body)) } func run() { for { time.Sleep(3 * time.Second) tracer := NewJaegerTracer(HttpClientName) runClient(tracer, "http://localhost:" + *serverPort + "/", HttpClientName, nil) } }
- server端上报demo。
//server端接收到请求后继续再向java服务发起请求,最终实现client-》go_server-》java_server的请求链路 func getJavaDemo(tracer opentracing.Tracer) func(http.ResponseWriter, *http.Request) { return func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.Header) fmt.Println(opentracing.HTTPHeadersCarrier(r.Header)) runClient(tracer, "http://10.50.208.131:9986/", HttpServerName, r) time.Sleep(10*time.Millisecond) runClient(tracer, "http://10.50.208.131:9986/error", HttpServerName, r) log.Print("Received getTime request") io.WriteString(w, "get java demo") } } func runServer(tracer opentracing.Tracer) { http.HandleFunc("/", getJavaDemo(tracer)) log.Printf("Starting server on port %s", *serverPort) err := http.ListenAndServe( fmt.Sprintf(":%s", *serverPort), // use nethttp.Middleware to enable OpenTracing for server nethttp.Middleware(tracer, http.DefaultServeMux)) if err != nil { log.Fatalf("Cannot start server: %s", err) } }
- 通过以上例子,我们就可以实现jaeger的方式采集go的链路数据,最终实现的效果是HttpClient -> httpGoServer -> httpJavaServer这样的trace链路。
更多详细使用方法,请参见Go Doc。