gRPC のデバッグ方法について (grpc_cli の紹介)
この記事は個人としての記事であり、公式な資料ではありません。
TL;DR
gRPC のデメリットとしてよく curl などが使えないためデバッグが難しいということが挙げられます(手元から容易に挙動を確認できない)。 しかし、gRPC は公式で grpc_cli というツールを配布しており、これを用いることで容易に CLI からサーバーの挙動を確認することができます。
公式ドキュメントにも記載されており、個人的にあまり翻訳のような記事は書きたくないのですが、広く知られていないように感じるので日本語の記事を残しておきます。
同様の日本語記事に以下があります。
grpc_cli について
grpc_cli はその名の通り gRPC のための CLI ツールです。 grpc_cli を用いてサーバーの情報を取得したり RPC したりすることができます。
grpc_cli はそれだけで使用するには proto 定義を cli に渡す必要があり少し面倒です。 しかし、gRPC サーバーから実行時に様々な情報を取得できる reflection service を定義することで、grpc_cli を簡単に使うことができます。
reflection service は個人的に観測できている限り、C++、Go、Java が対応しています。 各言語ごとに tutorial がドキュメントとして存在しているので、その tutorial 通りに実装すればいいです。 reflection service の導入は対応している言語であれば数行で終わってしまう程度です。
grpc_cli を使ってみる
reflection service が有効になっているサーバーに対しては、とても簡単に RPC することができます。 ここでは HelloWorld として提供されているサーバーに対して grpc_cli を使っていきます。
ls
ls で gRPC サーバーで動いている service の一覧が得られます。
$ grpc_cli ls localhost:50051
grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter
さらに -l
オプションをつけることでより詳細な service の定義が得られます。
$ grpc_cli ls localhost:50051 -l
filename: io/grpc/reflection/v1alpha/reflection.proto
package: grpc.reflection.v1alpha;
service ServerReflection {
rpc ServerReflectionInfo(stream grpc.reflection.v1alpha.ServerReflectionRequest) returns (stream grpc.reflection.v1alpha.ServerReflectionResponse) {}
}
filename: helloworld.proto
package: helloworld;
service Greeter {
rpc SayHello(helloworld.HelloRequest) returns (helloworld.HelloReply) {}
}
type
type で特定の message の定義を取得することができます。
$ grpc_cli type localhost:50051 helloworld.HelloRequest
message HelloRequest {
string name = 1;
}
call
call で実際に RPC することができます。
$ grpc_cli call localhost:50051 Greeter.SayHello 'name: "jyane"'
connecting to localhost:50051
message: "Hello jyane"
Rpc succeeded with OK status
ここで渡している文字列は HelloRequest の text format です。 Protocol Buffers の text format の書き方については公式で明確な方法が提供されておらず、気合で対応するしかないようです。