Envoy の gRPC-JSON transcoder を使っているときにアクセスログでハマったのでメモっておきます。
gRPC-JSON transcoder というのは、簡単にいうとRESTful な JSON API としてリクエストすると gRPC の形式に変換した上で upstream のサーバーにプロキシしてくれて、レスポンスについても gRPC の形式から JSON に戻してくれるという機能です。
www.envoyproxy.io
例えばこのような protobuf を定義して Envoy に取り込むと GET /shoes/{item_id}
という JSON API のエンドポイントが有効になりリクエストを送れるようになります。
syntax = "proto3";
package shoes;
import "google/api/annotations.proto";
service Shoes {
rpc GetShoeInfo(GetShoeInfoRequest) returns (ShoeInfo) {
option (google.api.http) = {
get : "/shoes/{item_id}"
};
}
}
message GetShoeInfoRequest { string item_id = 1; }
message ShoeInfo {
string item_id = 1;
string name = 2;
string type = 3;
repeated string size_labels = 4;
}
で、実際にリクエストを送ってみると以下のようなアクセスログが出力されました。パスが正しいので見落としていたのですがよく見ると GET でリクエストしたにも関わらず POST と出力されているのに気付き、調べてみることにしました。
$ curl -v http://localhost:8080/shoes/123456
> GET /shoes/123456 HTTP/1.1
---
[2021-02-20T06:56:41.536Z] "POST /shoes/123456 HTTP/1.1" 200 - 0 120 19 15 "-" "curl/7.64.1" "7f86f233-e658-400d-bb8f-999dea810924" "localhost:8080" "172.19.0.2:50051"
続きを読む