Я пытаюсь реализовать систему микросервисов на основе 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
}
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