Opentracing span与golang microservice一起失败
这个问题与以下问题直接相关。他们都没有解决这个问题: 这是我目前的配置 在第一个微服务(API网关)中,我有以下代码:Opentracing span与golang microservice一起失败,go,microservices,opentracing,distributed-tracing,Go,Microservices,Opentracing,Distributed Tracing,这个问题与以下问题直接相关。他们都没有解决这个问题: 这是我目前的配置 在第一个微服务(API网关)中,我有以下代码: func startTracing(service string) (opentracing.Tracer, io.Closer) { cfg := &config.Configuration{ Sampler: &config.SamplerConfig{ Type: "const",
func startTracing(service string) (opentracing.Tracer, io.Closer) {
cfg := &config.Configuration{
Sampler: &config.SamplerConfig{
Type: "const",
Param: 1,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
},
}
tracer, closer, err := cfg.New(service, config.Logger(jaeger.StdLogger))
if err != nil {
panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))
}
return tracer, closer
}
func main() {
http.HandleFunc("/getemail", validatemail)
http.ListenAndServe(":7070", nil)
}
func validatemail(res http.ResponseWriter, req *http.Request) {
gatewayTracer, gatewayTracerClose := startTracing("Validate Email")
validateEmailSpan := gatewayTracer.StartSpan("Email address checking")
// Check method
if req.Method != "POST" {
log.Panic("Email form data is not Post")
}
email := req.FormValue("email")
validEmail := regexp.MustCompile(`^[a-z0-9._%+\-]+@[a-z0-9.\-]+\.[a-z]{2,4}$`) // regex to validate email address
if validEmail.MatchString(email) {
httpClient := http.Client{}
form := url.Values{}
form.Set("email", email)
userserviceUrl := "http://user:7071/checkemail"
checkEmailReq, err := http.NewRequest("POST", userserviceUrl, strings.NewReader(form.Encode()))
if err != nil {
log.Println(err)
}
ext.SpanKindRPCClient.Set(validateEmailSpan)
ext.HTTPUrl.Set(validateEmailSpan, userserviceUrl)
ext.HTTPMethod.Set(validateEmailSpan, "POST")
validateEmailSpan.Tracer().Inject(
validateEmailSpan.Context(),
opentracing.HTTPHeaders,
opentracing.HTTPHeadersCarrier(req.Header),
)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
resp, err := httpClient.Do(checkEmailReq)
if err != nil {
log.Println("Couldnt verify email address user service sends an error : ", err)
}
defer resp.Body.Close()
} else {
log.Println("Wrong email address format")
}
defer gatewayTracerClose.Close()
defer validateEmailSpan.Finish()
}
在我的第二个微服务(用户服务)中
此处输出来自**从上下文开始**:nil
我错过了什么?我对
opentracing
非常陌生。这里发布的代码取自 将您的代码与教程进行比较,我注意到两件事。首先是在处理程序中声明tracer
和closer
(这意味着对于每个请求),而在教程中,它是在main
方法中声明的。第二件事是在网关中创建span时应该使用ext.RPCServerOption(spanCtx)
,而不是您的目标服务。@Eminala问题是,如果我在main
中定义tracer/closer
,我应该如何传递到validatemail()
您可以尝试使用Tracer
属性定义Ctrl
结构。在main
中创建一个Ctrl
对象,并将初始化的跟踪器分配给它的tracer
属性。接下来,您可以将validateemail
定义为func(ctrl*ctrl)validateemail
,并在其中提供跟踪程序。您可以查看此链接:@eminala谢谢,但现在我对从辅助服务端提取的有问题。在示例中,他们已经在那个里启动了一个单独的跟踪程序。你们是否在那个里启动了一个单独的跟踪程序实例,因为它应该为每个服务单独启动?
func CheckEmail(res http.ResponseWriter, req *http.Request) {
checkEmailTracer, checkemailtracerClose := startTracing("Registering Service") // Same startTracing function as API-Gateway
spanCtx, _ := checkEmailTracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
span := checkEmailTracer.StartSpan("format", ext.RPCServerOption(spanCtx))
defer span.Finish()
req.ParseForm()
log.Println("Start from context :", spanCtx)
}