Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opentracing span与golang microservice一起失败_Go_Microservices_Opentracing_Distributed Tracing - Fatal编程技术网

Opentracing span与golang microservice一起失败

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",

这个问题与以下问题直接相关。他们都没有解决这个问题:

这是我目前的配置

在第一个微服务(API网关)中,我有以下代码:

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)

}