kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Envoy の generate_request_id パラメータがデフォルト true であることを検証した

前に Try Envoy で Envoy と Jaeger を組み合わせた「トレーシング」を試したときに,Envoy の設定ファイル envoy.yamlgenerate_request_id: true を設定した.そのときは generate_request_id: true を設定すると Envoy が x-request-id ヘッダを自動的に付けてくれるという理解だった.

kakakakakku.hatenablog.com

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.

www.envoyproxy.io

検証環境

実際に検証環境を構築して,動作確認をした.今回は Docker Compose で「Envoy コンテナ(フロントエンド)」「Sinatra コンテナ(バックエンド)」を起動し,Sinatra で x-request-id ヘッダを表示するプロトタイプ実装にした.構成図は以下のようになる.

f:id:kakku22:20200227130721p:plain

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 に置いてある.自由に使ってもらえればと!

github.com

検証結果

計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 を使って簡単に検証環境を作れるのは便利だし,今後もドキュメントを読んで終わりにするのではなく,積極的に検証する気持ちを大切にしていく!