searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

如何通过jaeger sdk实现go语言调用链路数据上报

2023-10-30 01:55:12
19
0
  1. 引入go依赖包
import (
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/transport"
)
  1. 初始化Jaeger SDK
func NewJaegerTracer(service string) opentracing.Tracer {
auth := map[string]string{
"": "", //
}
sender := transport.NewHTTPTransport(
"", //jaeger 上报的
transport.HTTPHeaders(auth),
)
tracer, _ := jaeger.NewTracer(service,
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(sender, jaeger.ReporterOptions.Logger(jaeger.StdLogger)),)
return tracer
}
  1. 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, "localhost:" + *serverPort + "/", HttpClientName, nil)
}
}
  1. 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, "", HttpServerName, r)
time.Sleep(10*time.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)
}
}

5、通过以上例子,我们就可以实现jaeger的方式采集go的链路数据,最终实现的效果是HttpClient -> httpGoServer -> httpJavaServer这样的trace链路

0条评论
0 / 1000
李****涛
13文章数
0粉丝数
李****涛
13 文章 | 0 粉丝
原创

如何通过jaeger sdk实现go语言调用链路数据上报

2023-10-30 01:55:12
19
0
  1. 引入go依赖包
import (
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/transport"
)
  1. 初始化Jaeger SDK
func NewJaegerTracer(service string) opentracing.Tracer {
auth := map[string]string{
"": "", //
}
sender := transport.NewHTTPTransport(
"", //jaeger 上报的
transport.HTTPHeaders(auth),
)
tracer, _ := jaeger.NewTracer(service,
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(sender, jaeger.ReporterOptions.Logger(jaeger.StdLogger)),)
return tracer
}
  1. 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, "localhost:" + *serverPort + "/", HttpClientName, nil)
}
}
  1. 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, "", HttpServerName, r)
time.Sleep(10*time.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)
}
}

5、通过以上例子,我们就可以实现jaeger的方式采集go的链路数据,最终实现的效果是HttpClient -> httpGoServer -> httpJavaServer这样的trace链路

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0