2017-03-25 7 views
1

stackdriver 추적자를 gRPC과 작동 시키려고하는데 도움이 필요합니다. 내가 참조를 위해이 두 링크에서 찾고있다 그리고 난 여전히 동작하지 않습니다 : 간단하게하기 위해, 난 그냥 hello world gRPC example 함께 일하고gRPC - GoLang - Stackdriver tracer

.

func main() { 

    // Set up a connection to the server. 
    conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure(), grpc.WithUnaryInterceptor(grpc.UnaryClientInterceptor(clientInterceptor))) 
    if err != nil { 
     log.Fatalf("did not connect: %v", err) 
    } 
    defer conn.Close() 
    c := pb.NewGreeterClient(conn) 

    ctx := context.Background() 

    tc, err := trace.NewClient(ctx, "{PROJECT-ID}") 
    if err != nil { 
     log.Fatal(err) 
    } 

    span := tc.NewSpan("/greeter/SayHello") 
    defer span.Finish() 

    ctx = trace.NewContext(ctx, span) 

    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "world"}) 
    if err != nil { 
     log.Fatalf("could not greet: %v", err) 
    } 

    println("Response:", r.Message) 
} 

func clientInterceptor(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { 
    // trace current request w/ child span 
    span := trace.FromContext(ctx).NewChild(method) 
    defer span.Finish() 

    // new metadata, or copy of existing 
    md, ok := metadata.FromContext(ctx) 
    if !ok { 
     md = metadata.New(nil) 
    } else { 
     md = md.Copy() 
    } 

    // append trace header to context metadata 
    // header specification: https://cloud.google.com/trace/docs/faq 
    md["X-Cloud-Trace-Context"] = append(
     md["X-Cloud-Trace-Context"], fmt.Sprintf("%s/%d;o=1", span.TraceID(), 0), 
    ) 
    ctx = metadata.NewContext(ctx, md) 

    return invoker(ctx, method, req, reply, cc, opts...) 
} 

.. 내 gRPC 서버 : 여기 내 클라이언트의 나 '

rpc error: code = 13 desc = stream terminated by RST_STREAM with error code: 1 

:

// server is used to implement helloworld.GreeterServer. 
type server struct{} 

// SayHello implements helloworld.GreeterServer 
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { 
    println("HERE") 
    return &pb.HelloReply{Message: "Hello " + in.Name}, nil 
} 

func main() { 
    lis, err := net.Listen("tcp", ":50051") 
    if err != nil { 
     log.Fatalf("failed to listen: %v", err) 
    } 

    ctx := context.Background() 
    tc, err := trace.NewClient(ctx, "{PROJECT-ID}") 
    if err != nil { 
     log.Fatal(err) 
    } 

    s := grpc.NewServer(EnableGRPCTracingServerOption(tc)) 
    pb.RegisterGreeterServer(s, &server{}) 

    println("listening on :50051") 
    if err := s.Serve(lis); err != nil { 
     log.Fatalf("failed to serve: %v", err) 
    } 
} 

// EnableGRPCTracingServerOption enables parsing google trace header from metadata 
// and adds a new child span to the incoming request context. 
func EnableGRPCTracingServerOption(traceClient *trace.Client) grpc.ServerOption { 
    return grpc.UnaryInterceptor(serverInterceptor(traceClient)) 
} 

func serverInterceptor(traceClient *trace.Client) grpc.UnaryServerInterceptor { 
    return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { 
     // fetch metadata from request context 
     md, ok := metadata.FromContext(ctx) 
     if !ok { 
      md = metadata.New(nil) 
     } 
     header := strings.Join(md["X-Cloud-Trace-Context"], "") 

     // create new child span from google trace header, add to 
     // current request context 
     span := traceClient.SpanFromHeader(info.FullMethod, header) 
     defer span.Finish() 
     ctx = trace.NewContext(ctx, span) 

     return handler(ctx, req) 
    } 
} 

내가 추적을 시작하기 위해 클라이언트를 실행할 때, 나는 오류 나는 인증에 대해 다른 것을 보지 못하기 때문에 혼란 스럽다. 특정 프로젝트에 대한 추적을 시작하기에 충분하지 않은 프로젝트 ID 만 제공합니다. 내가 뭘 놓치고 있니?

+0

당신은 무엇을 보았으며 무엇을 기대 했습니까? 귀하의 질문은 모호합니다. –

+0

내 프로젝트의 스택 드라이버 추적 페이지에 흔적이 보이기를 기대하며 흔적이 보이지 않습니다. –

+0

다음의 답변을 통해 문제를 해결할 수 있습니까? –

답변

1

문제는 함께 있었다 추적이 업로드되기 전에 종료되었습니다. 나는 https://rakyll.org/grpc-trace/의 저자에게 연락하고 그녀는 실제로 사용할 수있는 옵션과 함께 그녀의 게시물을 업데이트 :

defer span.FinishWait() 

을 차단하고 그 프로그램이 종료되기 전에 흔적이 성공적으로 업로드 할 수 있도록하여 고정.

또한 웹 서버가 오래 실행되면 프로세스가 종료되지 않았으므로 문제가되지 않습니다.

0

동일한 자습서를 따라도 비슷한 문제가 발생했습니다.

헤더 키는 소문자로 변환됩니다. header := strings.Join(md["x-cloud-trace-context"], "")으로 서버 측에서 검색하면 좋을 것입니다.

당신은 또한 당신의 메타 데이터 헤더를 정의 할 수 있습니다 : 하나는 내 프로그램을 호출로 난 그냥 예비 테스트를하고 있었기 때문에 그렇게 차단하지 않습니다 전화

defer span.Finish() 

:

span := trace.FromContext(ctx).NewChild(method) 
defer span.Finish() 

md := metadata.Pairs(
    "x-cloud-trace-context", fmt.Sprintf("%s/%d;o=1", span.TraceID(), 0), 
) 

ctx = metadata.NewContext(ctx, md)