RabbitMQ Propagationの修正

15 minutes

このステップでは、メッセージの producerconsumerアプリケーションコードを編集し、W3C Trace ContextがRabbitMQ AMQPヘッダーを通じて伝播されるようにします。

注意

RabbitMQにはブローカーレベルのトレース設定がありません。伝播は常にアプリケーションコードで実装します。

payment-apiからfulfillment-workerへの非同期ハンドオフには、AMQPメッセージヘッダーでの手動コンテキストインジェクションとエクストラクションが必要です。

どちらか一方がこれを省略すると、消費された各メッセージは新しいルートTraceを開始します。これは本番環境で最も一般的な非同期オブザーバビリティのギャップの1つです。

修正方法

1. Producer -(payment-api)

プロジェクトルート[~/workshop/context-propagation]から、ファイルを開いて編集します。

text
vi services/payment-api/server.js

buildFulfillmentMessageHeaders() を見つけ、戻り値を injectTraceHeaders() でラップします。

javascript
function buildFulfillmentMessageHeaders(order, payment) {
  return {
    'x-order-id': order.orderId,
    'x-payment-id': payment.paymentId,
  };
}

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

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

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

2. Consumer -(fulfillment-worker)

プロジェクトルート[~/workshop/context-propagation]から、ファイルを開いて編集します。

text
vi services/fulfillment-worker/worker.js

ファイルの先頭にimportを追加します。

javascript
import { extractTraceContext } from './shared/propagation.js';

extractMessageContext() スタブを共有エクストラクターに置き換えます。

javascript
// Remove this stub:
function extractMessageContext(_headers) {
  return context.active(); // ignores AMQP headers
}

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

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

bash
diff ./services/fulfillment-worker/worker.js  ./services/fulfillment-worker/worker-fixed.js