Skip to content

Commit 0963c1a

Browse files
authored
Merge pull request #722 from jj22ee/xray-header-from-context-support
Support extracting X-Ray Trace Header Lambda Invoke Store
2 parents 7bd6075 + ec63e26 commit 0963c1a

File tree

4 files changed

+73
-2
lines changed

4 files changed

+73
-2
lines changed

package-lock.json

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/lib/env/aws_lambda.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ var SegmentUtils = require('../segments/segment_utils');
88
var logger = require('../logger');
99
const TraceID = require('../segments/attributes/trace_id');
1010

11+
const { InvokeStore } = require('@aws/lambda-invoke-store');
12+
1113
/**
1214
* @namespace
1315
* @ignore
@@ -80,7 +82,9 @@ var facadeSegment = function facadeSegment() {
8082
};
8183

8284
segment.resolveLambdaTraceData = function resolveLambdaTraceData() {
83-
var xAmznLambda = process.env._X_AMZN_TRACE_ID;
85+
const traceIdFromInvokeStore = InvokeStore.getXRayTraceId();
86+
const traceIdFromEnv = process.env._X_AMZN_TRACE_ID;
87+
var xAmznLambda = traceIdFromInvokeStore ?? traceIdFromEnv;
8488

8589
if (xAmznLambda) {
8690

packages/core/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"//": "@types/cls-hooked is exposed in API so must be in dependencies, not devDependencies",
2525
"dependencies": {
2626
"@aws-sdk/types": "^3.4.1",
27+
"@aws/lambda-invoke-store": "^0.0.1",
2728
"@smithy/service-error-classification": "^2.0.4",
2829
"@types/cls-hooked": "^4.3.3",
2930
"atomic-batcher": "^1.0.2",
@@ -55,4 +56,4 @@
5556
],
5657
"license": "Apache-2.0",
5758
"repository": "https://github.com/aws/aws-xray-sdk-node/tree/master/packages/core"
58-
}
59+
}

packages/core/test/unit/env/aws_lambda.test.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ var chai = require('chai');
33
var sinon = require('sinon');
44
var sinonChai = require('sinon-chai');
55

6+
chai.should();
67
chai.use(sinonChai);
78

89
var contextUtils = require('../../../lib/context_utils');
@@ -13,6 +14,7 @@ var Segment = require('../../../lib/segments/segment');
1314
var SegmentUtils = require('../../../lib/segments/segment_utils');
1415
var SegmentEmitter = require('../../../lib/segment_emitter');
1516
const TraceID = require('../../../lib/segments/attributes/trace_id');
17+
const { InvokeStore } = require('@aws/lambda-invoke-store');
1618

1719
describe('AWSLambda', function() {
1820
var sandbox;
@@ -147,6 +149,8 @@ describe('AWSLambda', function() {
147149

148150
describe('#resolveLambdaTraceData', function() {
149151
var sandbox, traceId;
152+
var INVOKE_STORE_TRACE_ID = 'Root=1-12345678-12345678901234567890abcd;Parent=abcdef0123456789;Sampled=1';
153+
var ENV_TRACE_ID = 'Root=1-87654321-09876543210987654321dcba;Parent=fedcba9876543210;Sampled=0';
150154

151155
beforeEach(function() {
152156
sandbox = sinon.createSandbox();
@@ -197,6 +201,47 @@ describe('AWSLambda', function() {
197201
facade.resolveLambdaTraceData();
198202
populateStub.should.have.not.been.called;
199203
});
204+
205+
it('should prioritize InvokeStore trace ID over environment variable if both are defined', function() {
206+
process.env._X_AMZN_TRACE_ID = ENV_TRACE_ID;
207+
Lambda.init();
208+
209+
sandbox.stub(InvokeStore, 'getXRayTraceId').returns(INVOKE_STORE_TRACE_ID);
210+
populateStub.reset();
211+
212+
var facade = setSegmentStub.args[0][0];
213+
facade.resolveLambdaTraceData();
214+
215+
populateStub.should.have.been.calledWith(facade, INVOKE_STORE_TRACE_ID);
216+
});
217+
218+
it('should use InvokeStore trace ID when environment variable is undefined', function() {
219+
delete process.env._X_AMZN_TRACE_ID;
220+
221+
Lambda.init();
222+
223+
sandbox.stub(InvokeStore, 'getXRayTraceId').returns(INVOKE_STORE_TRACE_ID);
224+
populateStub.reset();
225+
226+
var facade = setSegmentStub.args[0][0];
227+
facade.resolveLambdaTraceData();
228+
229+
populateStub.should.have.been.calledWith(facade, INVOKE_STORE_TRACE_ID);
230+
});
231+
232+
it('should use environment variable when InvokeStore returns undefined', function() {
233+
process.env._X_AMZN_TRACE_ID = INVOKE_STORE_TRACE_ID;
234+
Lambda.init();
235+
236+
process.env._X_AMZN_TRACE_ID = ENV_TRACE_ID;
237+
sandbox.stub(InvokeStore, 'getXRayTraceId').returns(undefined);
238+
populateStub.reset();
239+
240+
var facade = setSegmentStub.args[0][0];
241+
facade.resolveLambdaTraceData();
242+
243+
populateStub.should.have.been.calledWith(facade, ENV_TRACE_ID);
244+
});
200245
});
201246
});
202247

0 commit comments

Comments
 (0)