AWS X-Rayを有効にしてLambdaで実行した場合に `X-Amzn-Trace-Id` はどこからやってくるのか
調べたのでメモしておく。
結論: 環境変数から取ってきている。
node での使用例を見ると 以下のような形で利用できる模様
// これでAWSの呼び出しがX-Rayに記録される var AWS = AWSXRay.captureAWS(require('aws-sdk'));
これをソースコードから追ってみる
エントリポイントはこの辺から始まる 次にこの辺に飛ばされる。
そこに書かれているコードに、以下のようなコードがある。
for (var prop in awssdk) { if (awssdk[prop].serviceIdentifier) { var Service = awssdk[prop]; Service.prototype.customizeRequests(captureAWSRequest); } }
customizeRequests(captureAWSRequest)
でAWSへのリクエストをフックして何かやっているように見える。
captureAWSRequestを参照してみると
以下のような記述があるので、また次のソースを読んでみる
var parent = contextUtils.resolveSegment(contextUtils.resolveManualSegmentParams(req.params));
この辺になる。
この辺から getSegment
を追っていくと、この辺にくる
resolveLambdaTraceData
といういかにもそれっぽい関数をよびだしている。
resolveLambdaTraceDataのあるソースコードから以下を抜粋してきた。
segment.resolveLambdaTraceData = function resolveLambdaTraceData() { var xAmznLambda = process.env._X_AMZN_TRACE_ID; if (xAmznLambda) { if (xAmznLambda != xAmznTraceIdPrev) { this.reset(); if (LambdaUtils.populateTraceData(segment, xAmznLambda)) xAmznTraceIdPrev = xAmznLambda; } } else { this.reset(); contextUtils.contextMissingStrategy.contextMissing('Missing AWS Lambda trace data for X-Ray. Expected _X_AMZN_TRACE_ID to be set.'); } };
X_AMZN_TRACE_ID
という環境変数を見ているようだ。
終わり。