Skip to content

Commit 3b83b2b

Browse files
committed
add unit tests
1 parent 28b2307 commit 3b83b2b

File tree

3 files changed

+78
-33
lines changed

3 files changed

+78
-33
lines changed

aws-distro-opentelemetry-node-autoinstrumentation/src/patches/instrumentation-patch.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,10 +311,10 @@ function patchAwsSdkInstrumentation(instrumentation: Instrumentation): void {
311311
// Need to set capitalized version of the trace id to ensure that the Recursion Detection Middleware
312312
// of aws-sdk-js-v3 will detect the propagated X-Ray Context
313313
// See: https://github.com/aws/aws-sdk-js-v3/blob/v3.768.0/packages/middleware-recursion-detection/src/index.ts#L13
314-
const xray_trace_id = middlewareArgs.request.headers[AWSXRAY_TRACE_ID_HEADER];
314+
const xrayTraceId = middlewareArgs.request.headers[AWSXRAY_TRACE_ID_HEADER];
315315

316-
if (xray_trace_id) {
317-
middlewareArgs.request.headers[AWSXRAY_TRACE_ID_HEADER_CAPITALIZED] = xray_trace_id;
316+
if (xrayTraceId) {
317+
middlewareArgs.request.headers[AWSXRAY_TRACE_ID_HEADER_CAPITALIZED] = xrayTraceId;
318318
delete middlewareArgs.request.headers[AWSXRAY_TRACE_ID_HEADER];
319319
}
320320
const result = await next(middlewareArgs);

aws-distro-opentelemetry-node-autoinstrumentation/test/patches/instrumentation-patch.test.ts

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -535,34 +535,67 @@ describe('InstrumentationPatchTest', () => {
535535
let lambda: Lambda;
536536
const region = 'us-east-1';
537537

538-
it('overridden _getV3SmithyClientSendPatch updates MiddlewareStack', async () => {
539-
const mockedMiddlewareStackInternal: any = [];
540-
const mockedMiddlewareStack = {
541-
add: (arg1: any, arg2: any) => mockedMiddlewareStackInternal.push([arg1, arg2]),
542-
};
543-
const send = extractAwsSdkInstrumentation(PATCHED_INSTRUMENTATIONS)
544-
['_getV3SmithyClientSendPatch']((...args: unknown[]) => Promise.resolve())
545-
.bind({ middlewareStack: mockedMiddlewareStack });
546-
sinon
547-
.stub(AWSXRayPropagator.prototype, 'inject')
548-
.callsFake((context: OtelContext, carrier: unknown, setter: TextMapSetter) => {
549-
(carrier as any)['isCarrierModified'] = 'carrierIsModified';
550-
});
538+
describe('overridden _getV3SmithyClientSendPatch updates MiddlewareStack', async () => {
539+
let mockedMiddlewareStackInternal: any;
540+
let mockedMiddlewareStack;
541+
let send;
542+
543+
beforeEach(async () => {
544+
// Clear environment variables before each test
545+
mockedMiddlewareStackInternal = [];
546+
mockedMiddlewareStack = {
547+
add: (arg1: any, arg2: any) => mockedMiddlewareStackInternal.push([arg1, arg2]),
548+
};
549+
send = extractAwsSdkInstrumentation(PATCHED_INSTRUMENTATIONS)
550+
['_getV3SmithyClientSendPatch']((...args: unknown[]) => Promise.resolve())
551+
.bind({ middlewareStack: mockedMiddlewareStack });
552+
553+
sinon
554+
.stub(AWSXRayPropagator.prototype, 'inject')
555+
.callsFake((context: OtelContext, carrier: unknown, setter: TextMapSetter) => {
556+
(carrier as any)['isCarrierModified'] = 'carrierIsModified';
557+
});
558+
559+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
560+
// @ts-ignore
561+
await send({}, null);
562+
});
551563

552-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
553-
// @ts-ignore
554-
await send({}, null);
564+
it('Injecting with existing X-Ray header', async () => {
565+
const existingHeader = 'test-trace-header';
566+
const middlewareArgsWithHeader: any = {
567+
request: {
568+
headers: { [AWSXRAY_TRACE_ID_HEADER]: existingHeader },
569+
},
570+
};
571+
await mockedMiddlewareStackInternal[0][0]((arg: any) => Promise.resolve(), null)(middlewareArgsWithHeader);
555572

556-
const middlewareArgs: any = {
557-
request: {
558-
headers: {},
559-
},
560-
};
561-
await mockedMiddlewareStackInternal[0][0]((arg: any) => Promise.resolve(), null)(middlewareArgs);
573+
sinon.restore();
574+
575+
expect(middlewareArgsWithHeader.request.headers['isCarrierModified']).toEqual('carrierIsModified');
576+
expect(middlewareArgsWithHeader.request.headers).not.toHaveProperty(AWSXRAY_TRACE_ID_HEADER);
577+
expect(middlewareArgsWithHeader.request.headers).toHaveProperty('X-Amzn-Trace-Id');
578+
expect(middlewareArgsWithHeader.request.headers['X-Amzn-Trace-Id']).toEqual(existingHeader);
579+
580+
expect(mockedMiddlewareStackInternal[0][1].name).toEqual('_adotInjectXrayContextMiddleware');
581+
});
562582

563-
sinon.restore();
564-
expect(middlewareArgs.request.headers['isCarrierModified']).toEqual('carrierIsModified');
565-
expect(mockedMiddlewareStackInternal[0][1].name).toEqual('_adotInjectXrayContextMiddleware');
583+
it('Injecting without existing X-Ray header', async () => {
584+
const middlewareArgsNoHeader: any = {
585+
request: {
586+
headers: {},
587+
},
588+
};
589+
590+
await mockedMiddlewareStackInternal[0][0]((arg: any) => Promise.resolve(), null)(middlewareArgsNoHeader);
591+
592+
sinon.restore();
593+
594+
expect(middlewareArgsNoHeader.request.headers['isCarrierModified']).toEqual('carrierIsModified');
595+
expect(middlewareArgsNoHeader.request.headers).not.toHaveProperty('X-Amzn-Trace-Id');
596+
597+
expect(mockedMiddlewareStackInternal[0][1].name).toEqual('_adotInjectXrayContextMiddleware');
598+
});
566599
});
567600

568601
it('injects trace context header into request via propagator', async () => {

sample-applications/simple-express-server/sample-app-express-server.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@
22

33
const http = require('http');
44
const express = require('express');
5+
const bunyan = require('bunyan');
56
const { S3Client, ListObjectsCommand } = require('@aws-sdk/client-s3');
67

78
const PORT = parseInt(process.env.SAMPLE_APP_PORT || '8080', 10);
89

910
const app = express();
1011

12+
// Uses bunyan logger
13+
const logger = bunyan.createLogger({name: 'express-app', level: 'info'});
14+
1115
async function getRandomNumber(min, max) {
1216
return Math.floor(Math.random() * (max - min) + min);
1317
}
1418

19+
// Generate logs in your endpoints
1520
app.get('/rolldice', (req, res) => {
21+
1622
getRandomNumber(1, 6).then((val) => {
17-
res.send(`rolldice: ${val.toString()}`);
23+
const msg = `rolldice: ${val.toString()}`
24+
logger.info(msg);
25+
res.send(msg);
1826
});
1927
});
2028

@@ -29,7 +37,9 @@ app.get('/http', (req, res) => {
2937
const httpRequest = http.request(options, (rs) => {
3038
rs.setEncoding('utf8');
3139
rs.on('data', (result) => {
32-
res.send(`random value from http request: ${result}`);
40+
const msg = `random value from http request: ${result}`
41+
logger.info(msg);
42+
res.send(msg);
3343
});
3444
rs.on('error', console.log);
3545
});
@@ -45,14 +55,16 @@ app.get('/aws-sdk-s3', async (req, res) => {
4555
Bucket: bucketName,
4656
}),
4757
).then((data) => {
48-
console.log(data);
58+
logger.info(data);
4959
});
5060
} catch (e) {
5161
if (e instanceof Error) {
52-
console.error('Exception thrown: ', e.message);
62+
logger.error(`Exception thrown: ${e.message}`);
5363
}
5464
} finally {
55-
res.send('done aws sdk s3 request');
65+
const msg = 'done aws sdk s3 request'
66+
logger.info(msg);
67+
res.send(msg);
5668
}
5769
});
5870

0 commit comments

Comments
 (0)