我正在尝试实现基于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
}
答案 0 :(得分: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
的{{1}}方法较为简单,因为它仅在发送ZipkinPropagator
错误(当TraceID
时)之前检查opentracing.ErrSpanContextNotFound
。
您也可以使用carrier.TraceID()==0
,但是它的设置稍微复杂一些,并且HTTPHeaderPropagator
方法在发送Extract
之前会检查TraceID
以外的其他内容错误(检查从opentracing.ErrSpanContextNotFound
中提取的debugID
和baggage
)。
编辑:
回顾一下先前关于HeadersConfig
的{{3}},如果您没有包括opentracing
和Injector
设置,那可能就是{{1}在目标服务中提取跨度上下文时找不到}。