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