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 という環境変数を見ているようだ。

終わり。