Google Cloud Load Balancer を使うと分散トレーシングができない問題
メディア統括本部 サービスリライアビリティグループ(SRG)の長谷川(@rarirureluis)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、Google Cloud の Load Balancer を利用している環境で、分散トレーシングが期待通りに機能しない問題について解説します。
はじめに
Google Cloud の Load Balancer を利用している環境で、分散トレーシングが期待通りに機能しない問題が発生することがあります。
具体的には、 ヘッダーに含まれるサンプリングフラグが、Load Balancer を通過する際に意図せず変更されてしまう現象が確認されています。
この記事では、この問題の原因と具体的な回避策について解説します。
問題の現象:traceparent ヘッダーのフラグが変わる
分散トレーシングシステムでは、リクエストの経路を追跡するために という HTTP ヘッダーが広く利用されています。
このヘッダーは W3C Trace Context 標準で定義されており、トレースID、スパンID、そしてサンプリングフラグなどの情報を含みます。
問題となるのは、この ヘッダーの末尾にあるサンプリングフラグです。
例えば、サンプリング対象を示す というフラグが付いたリクエストを Google Cloud Load Balancer を通して送信すると、バックエンドのサービスに到達した際にはフラグが (サンプリング対象外)に変わってしまうことがあります。
これにより、本来トレースしたかったリクエストがサンプリングされず、分散トレーシングシステムで追跡できなくなるという問題が発生します。
原因:Load Balancer の既知のバグ
この現象は、Google Cloud Load Balancer に存在する既知のバグに起因するものです。
この問題は Google の Issue Tracker に登録されており、現在も解決に向けて対応が進められています。
Google Cloud では、 ヘッダーが普及する前から、独自の ヘッダーを使用してリクエストのトレースを行っていました。
この ヘッダーには、サンプリングを強制するためのオプション ( でサンプリング対象、 で対象外) があります。
現在の Google Cloud Load Balancer は、 ヘッダーを受け取った際に、このフラグ部分を正しく処理できず、 に書き換えてしまうことがあるようです。
一方で、 ヘッダーで を指定してリクエストを送信すると、Load Balancer はこれを正しく解釈し、サンプリング対象として扱います。
この場合、Load Balancer は適切な ヘッダー(末尾が )を生成してバックエンドに送信します。
回避策:CDN でヘッダーを書き換える
この問題に対する有効な回避策として、Google Cloud Load Balancer の前段に CDN が配置されている環境では、CDN の機能を利用して HTTP ヘッダーを書き換える方法があります。
具体的には、CDN の設定で以下のようなルールを追加します。
- クライアントからのリクエストに ヘッダーが含まれているか確認する。
- ヘッダーが存在する場合、その値を基にして ヘッダーを生成し、リクエストに追加(または上書き)する。 この際、サンプリングフラグが であれば、 ヘッダーのオプション部分を に設定します。
ヘッダーのフォーマットは以下の通りです。
X-Cloud-Trace-Context: TRACE_ID/SPAN_ID;o=OPTIONS
- : 32文字の16進数文字列で表現されるトレースID。 ヘッダーから抽出します。
- : 符号なし64ビット整数で表現されるスパンID。 ヘッダーから抽出した親スパンIDを使用するか、新しいスパンIDを生成します(Cloud Trace は通常新しいスパンIDを生成します)。 のスパンIDは16進数ですが、 では10進数で表現する必要がある点に注意してください。
- : サンプリングフラグ。 のフラグが の場合は を設定します。
この書き換えルールにより、 ヘッダーで送られてきたリクエストも、Google Cloud Load Balancer が正しく解釈できる の形式で伝達されるため、意図した通りにリクエストがサンプリングされるようになります。
終わりに
Google Cloud Load Balancer を利用する際に ヘッダーのサンプリングフラグが書き換わってしまう問題は、現在も未解決のバグによるものです。
しかし、CDN を利用している環境であれば、CDN のヘッダー書き換え機能を用いて ヘッダーを ヘッダーに変換することで、この問題を回避し、期待通りの分散トレーシングを実現できます。
Google Cloud Load Balancer を利用したシステムで分散トレーシングの実装にお困りの場合は、この回避策の導入を検討してみてください。
SRG では一緒に働く仲間を募集しています。
ご興味ありましたらぜひこちらからご連絡ください。