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 не найден в носителе извлечения

Если я сбрасываю log.Println("Form values : ", req.Header.Get("Uber-Trace-Id")), я получаю правильное значение Uber-Trace-Id, такое же, как у Service-One.

Для заголовков запросов установлено значение 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
}

person Sachith Muhandiram    schedule 14.11.2019    source источник
comment
вы пробовали использовать github.com/opentracing/opentracing-go/ext? Если нет, попробуйте добавить ext.HTTPMethod.Set(span, r.Method) и ext.HTTPUrl.Set(span, r.URL.String()) перед инъекцией.   -  person Emin Laletovic    schedule 15.11.2019
comment
@eminlala добавил, но результат тот же. SpanContext не найден в носителе извлечения   -  person Sachith Muhandiram    schedule 15.11.2019
comment
не могли бы вы добавить свой код инициализации трассировщика, мне нужно посмотреть, какой пропагатор используется?   -  person Emin Laletovic    schedule 15.11.2019
comment
@eminlala К вопросу добавлены части инициализации трассировщика.   -  person Sachith Muhandiram    schedule 15.11.2019
comment
@Sachith, у вас все еще есть эта проблема, и если да, можете ли вы предоставить прямую ссылку на исходный код?   -  person bsapaka    schedule 20.11.2019
comment
@bsapaka Да, все еще сталкиваюсь с той же проблемой.   -  person Sachith Muhandiram    schedule 20.11.2019


Ответы (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 проверяет больше вещей, кроме TraceID, перед отправкой opentracing.ErrSpanContextNotFound ошибки (проверяет debugID и baggage, извлеченные из HeadersConfig).

РЕДАКТИРОВАТЬ:

Оглядываясь назад на ваш предыдущий вопрос относительно opentracing, если вы еще не включены настройки Injector и Extractor, это могло быть проблемой, почему uber-trace-id не был найден при извлечении контекста диапазона в целевой службе.

person Emin Laletovic    schedule 15.11.2019