猿问

微服务中提取载体未找到SpanContext

我正在尝试实现一个基于Go的微服务系统。我有两个服务,我尝试Inject跨越Extract数据。


在我的第一次服务中,我有:


func (apitracer apiTracer) validatemail(res http.ResponseWriter, req *http.Request) {


    validateEmailSpan := apitracer.tracer.StartSpan("Validate Email")


    apitracer.tracer.Inject(

            validateEmailSpan.Context(),

            opentracing.HTTPHeaders,

            opentracing.HTTPHeadersCarrier(req.Header))

        req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

        resp, err := httpClient.Do(req)

服务二:


wireContext, err := opentracing.GlobalTracer().Extract(

        opentracing.HTTPHeaders,

        opentracing.HTTPHeadersCarrier(req.Header))

我收到以下错误:


在提取载体中找不到 SpanContext


如果我 dump ,我会得到与 Service-One 相同的log.Println("Form values : ", req.Header.Get("Uber-Trace-Id"))正确值。Uber-Trace-Id


请求标头设置application/x-www-form-urlencoded 为此处建议的


杨__羊羊
浏览 105回答 1
1回答

米琪卡哇伊

查看您的代码,我发现您在创建跟踪器时错过了添加Injector和选项。Extractor它应该看起来像这样:zipkinPropagator := zipkin.NewZipkinB3HTTPHeaderPropagator() tracer, _, err := cfg.New(         e.ServiceName, config.Logger(jaeger.StdLogger), config.ZipkinSharedRPCSpan(true),         config.Injector(opentracing.HTTPHeaders, zipkinPropagator),         config.Extractor(opentracing.HTTPHeaders, zipkinPropagator)) opentracing.SetGlobalTracer(tracer)ZipkinPropagator来自github.com/uber/jaeger-client-go/zipkin包。您应该尝试一下,ZipkinPropagator因为它的配置比普通的HTTPHeaderPropagator. ZipkinPropagator接收的参数较少,但灵活性也较差。此外,您收到的错误来自该Extract方法,其类型为opentracing.ErrSpanContextNotFound。Extract的方法ZipkinPropagator不太复杂,因为它仅在TraceID发送opentracing.ErrSpanContextNotFound错误之前(当 时carrier.TraceID()==0)检查。您也可以使用HTTPHeaderPropagator,但它的设置稍微复杂一些,并且方法会检查除发送错误之前Extract之外的更多内容(检查和是从 中提取的)。TraceIDopentracing.ErrSpanContextNotFounddebugIDbaggageHeadersConfig
随时随地看视频慕课网APP

相关分类

Go
我要回答