理系学生日記

おまえはいつまで学生気分なのか

gRPC 関連でデバッグを行うときに指定すると便利かもしれない環境変数たち

Go で gRPC 周りをデバッグするときに設定しているとデバッグするのが楽になる環境変数がいくつかあります。このあたり、情報が色んな所に散財しているので、ちょっとまとめますね。

GODEBUG

GODEBUG は golang の runtime に対してデバッグ情報をログ出力することを指示できる環境変数です。key=value の形の指示をコンマ区切りでいろいろ指定できて、その詳細については以下を参照。

gRPC、というか実際には HTTP/2 におけるデバッグで最も助けられたのは、上記ではなく net/http パッケージでひっそりとドキュメントされている http2debug

$ export GODEBUG=http2debug=2

上記の様に指定することで、HTTP/2 の状況とともに frame dump も出力されるようになります。何が起こっているのか、非常にわかりやすくなるので、本当におすすめ。

2019/05/12 06:25:14 http2: Framer 0xc0001ba000: read HEADERS flags=END_HEADERS stream=1 len=239
2019/05/12 06:25:14 http2: decoded hpack field header field ":scheme" = "http"
2019/05/12 06:25:14 http2: decoded hpack field header field ":method" = "POST"
2019/05/12 06:25:14 http2: decoded hpack field header field ":authority" = "localhost:50050"
2019/05/12 06:25:14 http2: decoded hpack field header field ":path" = "/Greeter/SayHellos"
2019/05/12 06:25:14 http2: decoded hpack field header field "te" = "trailers"
2019/05/12 06:25:14 http2: decoded hpack field header field "content-type" = "application/grpc"
2019/05/12 06:25:14 http2: decoded hpack field header field "user-agent" = "grpc-node/1.20.3 grpc-c/7.0.0 (osx; chttp2; godric)"
2019/05/12 06:25:14 http2: decoded hpack field header field "grpc-accept-encoding" = "identity,deflate,gzip"
2019/05/12 06:25:14 http2: decoded hpack field header field "accept-encoding" = "identity,gzip"
2019/05/12 06:25:14 http2: Framer 0xc0001ba000: wrote SETTINGS flags=ACK len=0
2019/05/12 06:25:14 http2: Framer 0xc0001ba000: wrote PING flags=ACK len=8 ping="\x00\x00\x00\x00\x00\x00\x00\x00"
2019/05/12 06:25:14 http2: Framer 0xc0001ba000: read WINDOW_UPDATE stream=1 len=4 incr=5
2019/05/12 06:25:14 http2: Framer 0xc0001ba000: read DATA flags=END_STREAM stream=1 len=17 data="\x00\x00\x00\x00\f\n\nkiririmode"

その他

以下、あまり僕自身が助けられたわけではないので、簡単にドキュメントの場所だけ。

GRPC_VERBOSITY, GRPC_TRACE

grpc リポジトリの TROUBLESHOOTING.md にドキュメントがある。

何でもかんでもログ出しておきたい場合は、以下がよさそう。

$ export GRPC_VERBOSITY=DEBUG
$ export GRPC_TRACE=all

GRPC_GO_LOG_SEVERITY_LEVEL, GRPC_GO_LOG_SEVERITY_LEVEL

こちらは grpc の go 実装の方のロギング。 grpc/grpclog の go doc に記載がありますが、何を設定すれば良いのかは書いてないという…。詳細なログを出したいときは以下のように指定する。

$ export GRPC_GO_LOG_SEVERITY_LEVEL=info
$ export GRPC_GO_LOG_VERBOSITY_LEVEL=2

GRPC_TRACE

これちゃんと効いてるのかよくわからないが、ドキュメントもあるし stackoverflow にもいくつかコメントが存在しているので、役に立つときは役に立つようです。ぼくのトラブルはだいたい HTTP/2 のレイヤで発生していて gRPC のレイヤではなかったので、有効ではありませんでした。

$ export GRPC_TRACE=all

この環境変数を含め、gRPC の core 実装における有効な環境変数 はそれなりにあります。