SkyAPM / go2sky

Distributed tracing and monitor SDK in Go for Apache SkyWalking APM
https://skywalking.apache.org/
Apache License 2.0
448 stars 122 forks source link

[Broken] CROSS_PROCESS #143

Closed Struggleee closed 2 years ago

Struggleee commented 2 years ago

我在追蹤grpc service, 當我沒加sleep時會出現 [Broken] CROSS_PROCESS

func sendRequest(client hello.HelloClient) {
    ctx := context.Background()
    exSpan, err := tracer.CreateExitSpan(ctx, "grpc-server", "grpc-server-domain:5051", func(headerKey, headerValue string) error {
        ctx = metadata.AppendToOutgoingContext(ctx, headerKey, headerValue)
        return nil
    })
    if err != nil {
        log.Fatalln(err)
    }
    exSpan.SetComponent(23)
    exSpan.SetSpanLayer(2)
    req := &hello.HelloRequest{
        Value: "test",
    }
    res, err := client.Hello(ctx, req)
    if err != nil {
        log.Fatalln(err)
    }
    exSpan.End()
    log.Println(res.Value)
}

image image

當我加sleep 200ms 在 span.End()之後時,就正常運作。

func sendRequest(client hello.HelloClient) {
    fmt.Println("Starting to do a RPC")
    ctx := context.Background()
    exSpan, err := tracer.CreateExitSpan(ctx, "grpc-server", "grpc-server-domain:5051", func(headerKey, headerValue string) error {
        ctx = metadata.AppendToOutgoingContext(ctx, headerKey, headerValue)
        return nil
    })
    if err != nil {
        log.Fatalln(err)
    }
    exSpan.SetComponent(23)
    exSpan.SetSpanLayer(2)
    req := &hello.HelloRequest{
        Value: "test",
    }
    res, err := client.Hello(ctx, req)
    if err != nil {
        log.Fatalln(err)
    }
    exSpan.End()
        time.Sleep(200 * time.Millisecond)
    log.Println(res.Value)
}

image image

請問這是我寫法有問題嗎? 謝謝。

wu-sheng commented 2 years ago

Please use English on GitHub. go2sky relies on your codes(go's context) to propagate the tracing context. And you should make sure all spans are closed properly.

The ASF upstream doc provides explanation about what is VNode, https://skywalking.apache.org/docs/main/latest/en/faq/vnode/#what-is-vnode