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

时间:2019-11-14 16:09:51

标签: go microservices opentracing distributed-tracing

我正在尝试实现基于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
}

1 个答案:

答案 0 :(得分:1)

查看您的代码,我发现您在创建跟踪器时错过了添加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}在目标服务中提取跨度上下文时找不到}。