使用otel sdk上报方式
在使用otel sdk上报go应用链路数据的时候。明明是存在a调用b再调用c的情况,但是在上报的数据里面只能看到a->b和b->c这两条独立的链路。
出现这种情况是因为构造httpclient的时候缺少了如下WithClientTrace:详细client构造方式如下:
client := http.Client{
Transport: otelhttp.NewTransport(
http.DefaultTransport,
// 必须加上这个配置才会透传trace
otelhttp.WithClientTrace(func(ctx context.Context) *httptrace.ClientTrace {
return otelhttptrace.NewClientTrace(ctx)
}),
),
}
使用jaeger sdk上报方式
使用jaeger sdk方式上报go应用链路数据的时候。明明是存在a调用b再调用c的情况,但是在上报的数据里面只能看到a->b和b->c这两条独立的链路。
出现这种情况是因为构造httpclient的时候缺少了如下children span的构建和traceId的透传,具体方式如下:
//获取头信息
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
//设置子span
span = tracer.StartSpan(spanName, opentracing.ChildOf(spanCtx))
//透传traceId
tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))