RabbitMQ Propagationの修正
このステップでは、メッセージの producer と consumer のアプリケーションコードを編集し、W3C Trace ContextがRabbitMQ AMQPヘッダーを通じて伝播されるようにします。
注意
RabbitMQにはブローカーレベルのトレース設定がありません。伝播は常にアプリケーションコードで実装します。
payment-apiからfulfillment-workerへの非同期ハンドオフには、AMQPメッセージヘッダーでの手動コンテキストインジェクションとエクストラクションが必要です。
どちらか一方がこれを省略すると、消費された各メッセージは新しいルートTraceを開始します。これは本番環境で最も一般的な非同期オブザーバビリティのギャップの1つです。
修正方法 #
1. Producer -(payment-api) #
プロジェクトルート[~/workshop/context-propagation]から、ファイルを開いて編集します。
vi services/payment-api/server.jsbuildFulfillmentMessageHeaders() を見つけ、戻り値を injectTraceHeaders() でラップします。
function buildFulfillmentMessageHeaders(order, payment) {
return {
'x-order-id': order.orderId,
'x-payment-id': payment.paymentId,
};
}function buildFulfillmentMessageHeaders(order, payment) {
return injectTraceHeaders({
'x-order-id': order.orderId,
'x-payment-id': payment.paymentId,
});
}次に進む前に作業を確認してください
./workshop/context-propagationフォルダから以下のコマンドを実行して、変更内容を期待される解答と比較します。
diff ./services/payment-api/server.js ./services/payment-api/server-fixed.js2. Consumer -(fulfillment-worker) #
プロジェクトルート[~/workshop/context-propagation]から、ファイルを開いて編集します。
vi services/fulfillment-worker/worker.jsファイルの先頭にimportを追加します。
import { extractTraceContext } from './shared/propagation.js';extractMessageContext() スタブを共有エクストラクターに置き換えます。
// Remove this stub:
function extractMessageContext(_headers) {
return context.active(); // ignores AMQP headers
}import { extractTraceContext } from './shared/propagation.js';
// Instead of ignoring AMQP headers, use the shared helper in processFulfillment instead:
const parentContext = extractTraceContext(msg.properties.headers ?? {});次に進む前に作業を確認してください
./workshop/context-propagationフォルダから以下のコマンドを実行して、変更内容を期待される解答と比較します。
diff ./services/fulfillment-worker/worker.js ./services/fulfillment-worker/worker-fixed.js
