LambdaでX-Rayトレースが出てこない? ~パッシブ計測にお気を付けください~

はじめに

下図のようなイベント駆動の構成で、赤枠で囲ったLambda関数のパフォーマンスを計測しようと思います。

ここで私は単純に「赤枠で囲ったLambda関数にだけX-Rayを有効化してEventBridgeの実行を待って結果を確認しよう」と考えました。

AWS X-Rayの公式ドキュメントです。
AWS X-Ray の概要

弊社コラムでもX-Rayを取り上げています。
AWS X-Rayとは?アプリケーションを分析および、デバッグ

目次

X-Rayトレースが出てこない

EventBridgeからSQSを経由して赤枠のLambda起動を確認し、X-Rayのトレース結果を確認しに行きました。
すると…

結果が0件でした。

何が起こったのか

SQSは、別のサービスで既にサンプリングされているリクエストを計測する、パッシブ・インストルメンテーションのようです。
インテグレーションAWS X-Ray他とAWS のサービス

Amazon Simple Queue Service — パッシブ計測。サービスが X-Ray SDK を使用してリクエストをトレースする場合、Amazon SQS はトレースヘッダーを送信し、整合性のあるトレース ID を持つコンシューマーに、送信者から元のトレースを伝達し続けます。

私はSQSのコンシューマーにのみX-Rayを設定して、プロデューサーには設定していませんでした。
図に表すとこのような感じでしょうか。

どうすればよいか

プロデューサーにX-Rayを設定するとX-Rayのトレース結果が出力されます。
早速、下図の赤枠で囲ったLambda関数にX-Rayを設定します。

すると…


結果が出てきました!
プロデューサー、コンシューマー2件分が表示されています。

ちなみに、SQSにはトレースを自動的にリンクする機能が備わっており、コンシューマーにX-Rayを設定していなくても問題ありません。
Amazon SQS および AWS X-Ray

上流のメッセージプロデューサーからのトレースは、下流の Lambda コンシューマーノードからのトレースに自動的にリンクされ、アプリケーションのエンドツーエンドビューが作成されます。

もしくは、X-Rayの計測にSQSを経由しないようにすればOKです。
例えば、Lambdaコンソール画面からテストイベントを実行することでアクティブ計測となり、X-Rayのトレース結果が出力されます。



こちらはコンシューマーのみの計測となるので1件分です。

おまけ

トレースを自動的にリンクするSQSの機能は2022年のアップデートで追加されたようです。
AWS X-Ray では、Amazon SQS と AWS Lambda に基づいて構築されたイベント駆動型アプリケーションにトレースリンクを追加
このような細かいところもアップデートしてくれるのは素晴らしいですね!

投稿者プロフィール

nagura
2021年4月からスカイアーチに中途入社しました。
AWSともっと仲良くなるべく日々勉強中です。