前に Try Envoy で Envoy と Jaeger を組み合わせた「トレーシング」を試したときに,Envoy の設定ファイル envoy.yaml
に generate_request_id: true
を設定した.そのときは generate_request_id: true
を設定すると Envoy が x-request-id
ヘッダを自動的に付けてくれるという理解だった.
generate_request_id はデフォルト true
だった
最近 Envoy のドキュメントを読み直す機会があり,HTTP connection manager のパラメータを確認したところ,generate_request_id
はデフォルト true
だった.よって,明示的に generate_request_id
を設定しなくても x-request-id
ヘッダは付くことになる.むしろ「UUID4 の生成コスト」を考慮すると,ハイパフォーマンスを求める場面では false
にするという内容も書いてあった.
(BoolValue) Whether the connection manager will generate the x-request-id header if it does not exist. This defaults to true. Generating a random UUID4 is expensive so in high throughput scenarios where this feature is not desired it can be disabled.
検証環境
実際に検証環境を構築して,動作確認をした.今回は Docker Compose で「Envoy コンテナ(フロントエンド)」と「Sinatra コンテナ(バックエンド)」を起動し,Sinatra で x-request-id
ヘッダを表示するプロトタイプ実装にした.構成図は以下のようになる.
envoy.yaml
の一部を以下に載せておく.generate_request_id
の部分を修正しながら動作確認をした.
generate_request_id
なしgenerate_request_id: true
generate_request_id: false
(中略) filter_chains: - filters: - name: envoy.http_connection_manager config: codec_type: auto stat_prefix: ingress_http generate_request_id: true (中略)
バックエンド実装の一部を以下に載せておく.Sinatra でヘッダを取得するために request.env
を使った.
get '/' do { HTTP_X_REQUEST_ID: request.env['HTTP_X_REQUEST_ID'] }.to_json end
なお,検証環境の設定などは全て GitHub に置いてある.自由に使ってもらえればと!
検証結果
計3パターンを検証した.挙動は(当然ながら)ドキュメントの通りだったけど,実際に確認できて良かった.
generate_request_id
なし :x-request-id
ヘッダ "あり"generate_request_id: true
:x-request-id
ヘッダ "あり"generate_request_id: false
:x-request-id
ヘッダ "なし"
# `generate_request_id` なし $ curl http://localhost:8080 {"HTTP_X_REQUEST_ID":"6075e8ae-9b4a-4ffd-b820-8113307bfd61"} $ curl http://localhost:8080 {"HTTP_X_REQUEST_ID":"ed90417b-711c-4d7a-93b7-9f710864706e"} # `generate_request_id: true` $ curl http://localhost:8080 {"HTTP_X_REQUEST_ID":"cae38cdb-ac80-45c2-8de1-ca1d3463f762"} $ curl http://localhost:8080 {"HTTP_X_REQUEST_ID":"e313e08f-4542-4214-b10b-8dce9fad7b5f"} # `generate_request_id: false` $ curl http://localhost:8080 {"HTTP_X_REQUEST_ID":null} $ curl http://localhost:8080 {"HTTP_X_REQUEST_ID":null}
まとめ
個人的な検証記事だけど,Envoy の generate_request_id
パラメータの動作確認をした.Docker Compose を使って簡単に検証環境を作れるのは便利だし,今後もドキュメントを読んで終わりにするのではなく,積極的に検証する気持ちを大切にしていく!