Payment Gatewayのコンテキスト伝播を修正する
このステップでは、payment gatewayプロキシの アプリケーションコードを編集 し、W3C Trace Contextをpayment-apiに転送するようにしてから、サービスを リビルドして再デプロイ します。
注意
エッジNGINXゲートウェイの修正(ステップ06)後、トレースはブラウザからfrontend-apiを経由してorder-apiまで接続される場合があります。しかし、 frontend-api がpayment-gateway経由で支払いを送信する際、プロキシはW3Cトレースヘッダー なしで payment-apiに転送します。
この断絶は一般的な Node.jsプロキシのバグ です。サービスは計装されておりAPMで確認できますが、送信側のfetchがトレースコンテキストを伝播しません。
Splunk APMでは以下の動作が確認できます
frontend-api→payment-gateway- 接続済みpayment-gateway→payment-api- 未接続

payment gatewayは独自の Span を生成するため(サービスマップには表示されます)、上流の呼び出しはpayment-apiで新しいトレースを開始します。これは、カスタムBFF/プロキシを追加して送信HTTPコールでのコンテキスト伝播を忘れた実際のチームや、「二重Span」を避けるためにsuppressTracing()を使用して誤って伝播を壊してしまうケースを再現しています。
修正方法 #
プロジェクトルート[~/workshop/context-propagation]から、server.jsファイルを開き buildUpstreamHeaders() を見つけます。
vi services/payment-gateway/server.jsW3Cトレースコンテキストを上流ヘッダーに注入する #
- returnの前に
propagation.inject()のコメントを解除/追加します - 上流fetchの
suppressTracingを削除します
function buildUpstreamHeaders() {
const headers = {
'Content-Type': 'application/json',
};
return headers;
}
const upstreamContext = suppressTracing(context.active());function buildUpstreamHeaders() {
const headers = {
'Content-Type': 'application/json',
};
propagation.inject(context.active(), headers, {
set: (carrier, key, value) => {
carrier[key] = value;
},
});
return headers;
}
const upstreamContext = context.active();次に進む前に作業を確認してください
./workshop/context-propagationフォルダから以下のコマンドを実行して、変更内容を期待される解答と比較します
diff ./services/payment-gateway/server.js ./services/payment-gateway/server-fixed.js
