我正在尝试实现基于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"))
,则会得到与Service-One相同的正确Uber-Trace-Id
值。
请求标头设置为application/x-www-form-urlencoded
as suggested here
编辑:@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
}