Skip to content

Commit bec06a0

Browse files
committed
chore(middleware-recursion-detection): read trace id from Labda Invoke Store
1 parent 72e241f commit bec06a0

File tree

2 files changed

+60
-14
lines changed

2 files changed

+60
-14
lines changed

packages/middleware-recursion-detection/src/index.spec.ts

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { InvokeStore } from "@aws/lambda-invoke-store";
12
import { HttpRequest } from "@smithy/protocol-http";
23
import { afterAll, beforeEach, describe, expect, test as it, vi } from "vitest";
34

@@ -6,31 +7,71 @@ import { recursionDetectionMiddleware } from "./index";
67
describe(recursionDetectionMiddleware.name, () => {
78
const mockNextHandler = vi.fn();
89
const originEnv = process.env;
10+
911
const TRACE_ID_HEADER_NAME = "X-Amzn-Trace-Id";
1012

1113
beforeEach(() => {
1214
vi.clearAllMocks();
15+
vi.spyOn(InvokeStore, "getXRayTraceId").mockImplementation(() => undefined);
1316
process.env = {};
1417
});
1518

1619
afterAll(() => {
1720
process.env = originEnv;
1821
});
1922

20-
it(`sets ${TRACE_ID_HEADER_NAME} header when function name and trace id environmental variables are set`, async () => {
21-
process.env = {
22-
AWS_LAMBDA_FUNCTION_NAME: "some-function",
23-
_X_AMZN_TRACE_ID: "some-trace-id",
24-
};
25-
const handler = recursionDetectionMiddleware({ runtime: "node" })(mockNextHandler, {} as any);
26-
await handler({
27-
input: {},
28-
request: new HttpRequest({}),
23+
describe(`sets ${TRACE_ID_HEADER_NAME} header when function name and`, () => {
24+
const mockTraceIdEnv = "trace-id-from-env";
25+
const mockTraceIdInvokeStore = "trace-id-from-invoke-store";
26+
27+
it("trace id environmental variables is set", async () => {
28+
process.env = {
29+
AWS_LAMBDA_FUNCTION_NAME: "some-function",
30+
_X_AMZN_TRACE_ID: mockTraceIdEnv,
31+
};
32+
const handler = recursionDetectionMiddleware({ runtime: "node" })(mockNextHandler, {} as any);
33+
await handler({
34+
input: {},
35+
request: new HttpRequest({}),
36+
});
37+
const { calls } = (mockNextHandler as any).mock;
38+
expect(calls.length).toBe(1);
39+
const { request } = mockNextHandler.mock.calls[0][0];
40+
expect(request.headers[TRACE_ID_HEADER_NAME]).toBe(mockTraceIdEnv);
41+
});
42+
43+
it("trace id value is set in InvokeStore", async () => {
44+
vi.spyOn(InvokeStore, "getXRayTraceId").mockImplementation(() => mockTraceIdInvokeStore);
45+
process.env = {
46+
AWS_LAMBDA_FUNCTION_NAME: "some-function",
47+
};
48+
const handler = recursionDetectionMiddleware({ runtime: "node" })(mockNextHandler, {} as any);
49+
await handler({
50+
input: {},
51+
request: new HttpRequest({}),
52+
});
53+
const { calls } = (mockNextHandler as any).mock;
54+
expect(calls.length).toBe(1);
55+
const { request } = mockNextHandler.mock.calls[0][0];
56+
expect(request.headers[TRACE_ID_HEADER_NAME]).toBe(mockTraceIdInvokeStore);
57+
});
58+
59+
it("favors trace id value from InvokeStore over that from env variable", async () => {
60+
vi.spyOn(InvokeStore, "getXRayTraceId").mockImplementation(() => mockTraceIdInvokeStore);
61+
process.env = {
62+
AWS_LAMBDA_FUNCTION_NAME: "some-function",
63+
_X_AMZN_TRACE_ID: mockTraceIdEnv,
64+
};
65+
const handler = recursionDetectionMiddleware({ runtime: "node" })(mockNextHandler, {} as any);
66+
await handler({
67+
input: {},
68+
request: new HttpRequest({}),
69+
});
70+
const { calls } = (mockNextHandler as any).mock;
71+
expect(calls.length).toBe(1);
72+
const { request } = mockNextHandler.mock.calls[0][0];
73+
expect(request.headers[TRACE_ID_HEADER_NAME]).toBe(mockTraceIdInvokeStore);
2974
});
30-
const { calls } = (mockNextHandler as any).mock;
31-
expect(calls.length).toBe(1);
32-
const { request } = mockNextHandler.mock.calls[0][0];
33-
expect(request.headers[TRACE_ID_HEADER_NAME]).toBe("some-trace-id");
3475
});
3576

3677
it(`should NOT set ${TRACE_ID_HEADER_NAME} header when function name environmental variable is NOT set`, async () => {

packages/middleware-recursion-detection/src/index.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { InvokeStore } from "@aws/lambda-invoke-store";
12
import { HttpRequest } from "@smithy/protocol-http";
23
import {
34
AbsoluteLocation,
@@ -38,7 +39,11 @@ export const recursionDetectionMiddleware =
3839
return next(args);
3940
}
4041
const functionName = process.env[ENV_LAMBDA_FUNCTION_NAME];
41-
const traceId = process.env[ENV_TRACE_ID];
42+
43+
const traceIdFromEnv = process.env[ENV_TRACE_ID];
44+
const traceIdFromInvokeStore = InvokeStore.getXRayTraceId();
45+
const traceId = traceIdFromInvokeStore ?? traceIdFromEnv;
46+
4247
const nonEmptyString = (str: unknown): str is string => typeof str === "string" && str.length > 0;
4348
if (nonEmptyString(functionName) && nonEmptyString(traceId)) {
4449
request.headers[TRACE_ID_HEADER_NAME] = traceId;

0 commit comments

Comments
 (0)