在微服务中的 Extract carrier 中找不到 SpanContext
SpanContext not found in Extract carrier in microservice
我正在尝试实现一个 Go-based 微服务系统。我有两个服务,我尝试 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 not found in Extract carrier
如果我转储 log.Println("Form values : ", req.Header.Get("Uber-Trace-Id"))
,我会得到与 Service-One.
相同的正确 Uber-Trace-Id
值
请求 headers 设置为 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
}
查看您的代码,我发现您在创建跟踪器时错过了添加 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
。 ZipkinPropagator
的 Extract
方法不太复杂,因为它仅在发送 opentracing.ErrSpanContextNotFound
错误之前检查 TraceID
(当 carrier.TraceID()==0
时)。
您也可以使用 HTTPHeaderPropagator
,但它的设置有点复杂,并且 Extract
方法在发送 [=19] 之前会检查 TraceID
之外的更多内容=] 错误(检查从 HeadersConfig
中提取的 debugID
和 baggage
)。
编辑:
回顾你之前关于 opentracing
的 question,如果你没有包括 Injector
和 Extractor
设置,这可能就是为什么 [=在目标服务中提取跨度上下文时未找到 35=]。
我正在尝试实现一个 Go-based 微服务系统。我有两个服务,我尝试 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 not found in Extract carrier
如果我转储 log.Println("Form values : ", req.Header.Get("Uber-Trace-Id"))
,我会得到与 Service-One.
Uber-Trace-Id
值
请求 headers 设置为 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
}
查看您的代码,我发现您在创建跟踪器时错过了添加 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
。 ZipkinPropagator
的 Extract
方法不太复杂,因为它仅在发送 opentracing.ErrSpanContextNotFound
错误之前检查 TraceID
(当 carrier.TraceID()==0
时)。
您也可以使用 HTTPHeaderPropagator
,但它的设置有点复杂,并且 Extract
方法在发送 [=19] 之前会检查 TraceID
之外的更多内容=] 错误(检查从 HeadersConfig
中提取的 debugID
和 baggage
)。
编辑:
回顾你之前关于 opentracing
的 question,如果你没有包括 Injector
和 Extractor
设置,这可能就是为什么 [=在目标服务中提取跨度上下文时未找到 35=]。