以Jeager方式接入 在监控Go应用之前,您需要通过客户端将应用数据上报至APM服务端。本文介绍采用Jaeger SDK方式上报go应用的链路数据,具体如下。 前提条件 完成vpce接入。 接入步骤 1. 引入go依赖包。 plaintext import ( "github.com/opentracing/opentracinggo" "github.com/uber/jaegerclientgo" "github.com/uber/jaegerclientgo/transport" ) 2. 查看接入点信息。 应用列表的接入指引会根据您所在资源池提供“通过 HTTP 上报数据”的ENDPOINT(天翼云vpc网络接入点)、鉴权TOKEN信息。 3. 初始化Jaeger SDK。 注意 需将token和endpoint替换成相应地域的接入点信息。 plaintext func NewJaegerTracer(service string) opentracing.Tracer { auth : map[string]string{ "xctgauthorization":" ", //上面获取到的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 } 4. client 端上报demo。 plaintext 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: %sn", string(body)) } func run() { for { time.Sleep(3 time.Second) tracer : NewJaegerTracer(HttpClientName) runClient(tracer, " + serverPort + "/", HttpClientName, nil) } } 5. server端上报demo。 注意 需将url1和url2替换成下游调用地址。 plaintext //server端接收到请求后继续再向java服务发起请求,最终实现client》goserver》javaserver的请求链路 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)) span : opentracing.SpanFromContext(r.Context()) span.SetTag("http.serveraddr", "serveraddr") //填写您的服务端地址 span.SetTag("http.clientaddr", "clientaddr") //填写您的客户端地址 runClient(tracer, " ", HttpServerName, r) time.Sleep(10time.Millisecond) runClient(tracer, " ", 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) } } 6. 通过以上例子,我们就可以实现jaeger的方式采集go的监控数据。