在微服务中的 Extract carrier 中找不到 SpanContext

SpanContext not found in Extract carrier in microservice

我正在尝试实现一个 Go-based 微服务系统。我有两个服务,我尝试 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 not found in Extract carrier

如果我转储 log.Println("Form values : ", req.Header.Get("Uber-Trace-Id")),我会得到与 Service-One.

相同的正确 Uber-Trace-Id

请求 headers 设置为 application/x-www-form-urlencoded

编辑:在@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
}

查看您的代码,我发现您在创建跟踪器时错过了添加 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.ErrSpanContextNotFoundZipkinPropagatorExtract 方法不太复杂,因为它仅在发送 opentracing.ErrSpanContextNotFound 错误之前检查 TraceID(当 carrier.TraceID()==0 时)。

您也可以使用 HTTPHeaderPropagator,但它的设置有点复杂,并且 Extract 方法在发送 [=19] 之前会检查 TraceID 之外的更多内容=] 错误(检查从 HeadersConfig 中提取的 debugIDbaggage)。

编辑:

回顾你之前关于 opentracingquestion,如果你没有包括 InjectorExtractor 设置,这可能就是为什么 [=在目标服务中提取跨度上下文时未找到 35=]。