2017-03-23 5 views
2

StreamClientInterceptor関数を記述するとき、呼び出し元がRPCを終了したときを判断する最善の方法は何ですか?これは、単なるインターセプタやRPCを実行するhandlerが渡されたサーバ側では簡単ですが、クライアント側でClientStreamを返すクライアント側でこれを行う最良の方法が不明です。StreamClientInterceptorを使用してRPCセッションが終了するときを判断する最善の方法は何ですか?

この用途の1つの用途は、OpenTracingをインストルメントすることです。ここでの目的は、RPCの開始と終了を示すスパンを開始および終了することです。

私が検討している戦略は、ストリームインターセプタがデコレートされたClientStreamを返すことです。この新しいClientStreamは、インターフェイスメソッドHeader,CloseSendSendMsgRecvMsgのいずれかがエラーを返した場合、またはContextがキャンセルされた場合にRPCが完了したとみなします。さらに、それはRecvMsgにこのロジックを追加します。

func (cs *DecoratedClientStream) RecvMsg(m interface{}) error { 
    err := cs.ClientStream.RecvMsg(m) 
    if err == io.EOF { 
     // Consider the RPC as complete 
     return err 
    } else if err != nil { 
     // Consider the RPC as complete 
     return err 
    } 
    if !cs.isResponseStreaming { 
     // Consider the RPC as complete 
    } 
    return err 
} 

それはほとんどの場合に動作しますが、私の理解が実行者が、それが結果はio.EOFになります知っている場合(Are you required to call Recv until you get io.EOF when interacting with grpc.ClientStreams?を参照)Recvを呼び出すために必要とされていないということです、すべての場合にうまくいくわけではありません。これを達成するより良い方法はありますか?

答えて

3

私はgRPCコールのストリーミングをトレースしたいという非常に似た問題がありました。あなたが自分自身を言及したようにストリームを飾る以外に、私はストリームの終わりを検出するための良い方法を見つけることができませんでした。つまり、grpc-go(https://godoc.org/google.golang.org/grpc/stats)によって提供されている統計フックに出くわすまでです。統計APIはRPC呼び出しに関する統計を収集するためのものですが、提供するフックはトレースにも非常に役立ちます。

ストリーミングコールをトレースする方法を探している場合は、統計フック: https://github.com/charithe/otgrpcを使用して、gRPCのOpenTracing計測用ライブラリを作成しました。しかし、このアプローチはおそらく長寿命のストリームを作成するシステムには適していないことに注意してください。

関連する問題