Payment Gatewayのコンテキスト伝播を修正する

15 minutes

このステップでは、payment gatewayプロキシの アプリケーションコードを編集 し、W3C Trace Contextをpayment-apiに転送するようにしてから、サービスを リビルドして再デプロイ します。

注意

エッジNGINXゲートウェイの修正(ステップ06)後、トレースはブラウザからfrontend-apiを経由してorder-apiまで接続される場合があります。しかし、 frontend-apipayment-gateway経由で支払いを送信する際、プロキシはW3Cトレースヘッダー なしで payment-apiに転送します。

この断絶は一般的な Node.jsプロキシのバグ です。サービスは計装されておりAPMで確認できますが、送信側のfetchがトレースコンテキストを伝播しません。

Splunk APMでは以下の動作が確認できます

nginx-aft1

payment gatewayは独自の Span を生成するため(サービスマップには表示されます)、上流の呼び出しはpayment-apiで新しいトレースを開始します。これは、カスタムBFF/プロキシを追加して送信HTTPコールでのコンテキスト伝播を忘れた実際のチームや、「二重Span」を避けるためにsuppressTracing()を使用して誤って伝播を壊してしまうケースを再現しています。

修正方法

プロジェクトルート[~/workshop/context-propagation]から、server.jsファイルを開き buildUpstreamHeaders() を見つけます。

text
vi services/payment-gateway/server.js

W3Cトレースコンテキストを上流ヘッダーに注入する

  1. returnの前にpropagation.inject()のコメントを解除/追加します
  2. 上流fetchのsuppressTracingを削除します
javascript
function buildUpstreamHeaders() {
  const headers = {
    'Content-Type': 'application/json',
  };
  return headers;
}

const upstreamContext = suppressTracing(context.active());

次に進む前に作業を確認してください

./workshop/context-propagationフォルダから以下のコマンドを実行して、変更内容を期待される解答と比較します

bash
diff ./services/payment-gateway/server.js ./services/payment-gateway/server-fixed.js