在微服务的提取载体中找不到SpanContext

我正在尝试实现基于Go的微服务系统。我有两项服务,我尝试InjectExtract跨数据。

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

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

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

请求标头设置为application/x-www-form-urlencoded as suggested here

编辑:@eminlala之后

跟踪程序初始化步骤。

type apiTracer struct {
    tracer opentracing.Tracer
}

// Tracing function
func startTracing(service string) opentracing.Tracer {

    cfg := config.Configuration{
        Sampler: &config.SamplerConfig{
            Type:  "const",Param: 1,},Reporter: &config.ReporterConfig{
            LogSpans:            true,BufferFlushInterval: 1 * time.Second,}
    tracer,_,_ := cfg.New(
        service,config.Logger(jaeger.StdLogger),)
    opentracing.SetGlobalTracer(tracer)

    return tracer
}
ert345 回答:在微服务的提取载体中找不到SpanContext

查看您的代码,我发现您在创建跟踪器时错过了添加InjectorExtractor选项的操作。它应该看起来像这样:

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的{​​{1}}方法较为简单,因为它仅在发送ZipkinPropagator错误(当TraceID时)之前检查opentracing.ErrSpanContextNotFound

您也可以使用carrier.TraceID()==0,但是它的设置稍微复杂一些,并且HTTPHeaderPropagator方法在发送Extract之前会检查TraceID以外的其他内容错误(检查从opentracing.ErrSpanContextNotFound中提取的debugIDbaggage)。

编辑:

回顾一下先前关于HeadersConfig的{​​{3}},如果您没有包括opentracingInjector设置,那可能就是{{1}在目标服务中提取跨度上下文时找不到}。

本文链接:https://www.f2er.com/3101018.html

大家都在问