2

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

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

请求标头设置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
}
4

1 回答 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,因为它的配置比普通的少HTTPHeaderPropagatorZipkinPropagator接收的参数更少,但它也不太灵活。此外,您收到的错误来自该Extract方法的 type opentracing.ErrSpanContextNotFoundExtractfor 的方法ZipkinPropagator不那么复杂,因为它只TraceID在发送opentracing.ErrSpanContextNotFound错误之前(when carrier.TraceID()==0)检查。

您也可以使用HTTPHeaderPropagator,但它的设置要复杂一些,并且方法会在发送错误之前Extract检查更多的东西(检查和提取自)。TraceIDopentracing.ErrSpanContextNotFounddebugIDbaggageHeadersConfig

编辑:

回顾您之前关于的问题opentracing,如果您没有包含InjectorExtractor设置,那可能是uber-trace-id在目标服务中提取跨度上下文时未找到的问题。

于 2019-11-15T10:09:14.207 回答