From 3259b95055d75153859c76a86e568f1724ea7efb Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 2 Sep 2024 13:54:50 +0200 Subject: [PATCH 1/4] chore(maintenance): switch to unmanaged log group for functions --- .../src/resources/TestNodejsFunction.ts | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/packages/testing/src/resources/TestNodejsFunction.ts b/packages/testing/src/resources/TestNodejsFunction.ts index 66ff703e8b..971ea53dde 100644 --- a/packages/testing/src/resources/TestNodejsFunction.ts +++ b/packages/testing/src/resources/TestNodejsFunction.ts @@ -2,7 +2,7 @@ import { randomUUID } from 'node:crypto'; import { CfnOutput, Duration } from 'aws-cdk-lib'; import { Tracing } from 'aws-cdk-lib/aws-lambda'; import { NodejsFunction, OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs'; -import { RetentionDays } from 'aws-cdk-lib/aws-logs'; +import { RetentionDays, LogGroup } from 'aws-cdk-lib/aws-logs'; import type { TestStack } from '../TestStack.js'; import { TEST_ARCHITECTURES, TEST_RUNTIMES } from '../constants.js'; import { @@ -25,8 +25,17 @@ class TestNodejsFunction extends NodejsFunction { ) { const isESM = extraProps.outputFormat === 'ESM'; const { bundling, ...restProps } = props; + const functionName = concatenateResourceName({ + testName: stack.testName, + resourceName: extraProps.nameSuffix, + }); + const resourceId = randomUUID().substring(0, 5); - super(stack.stack, `fn-${randomUUID().substring(0, 5)}`, { + const logGroup = new LogGroup(this, `log-${resourceId}`, { + logGroupName: `/aws/lambda/${functionName}`, + retention: RetentionDays.ONE_DAY, + }); + super(stack.stack, `fn-${resourceId}`, { timeout: Duration.seconds(30), memorySize: 512, tracing: Tracing.ACTIVE, @@ -41,13 +50,10 @@ class TestNodejsFunction extends NodejsFunction { : '', }, ...restProps, - functionName: concatenateResourceName({ - testName: stack.testName, - resourceName: extraProps.nameSuffix, - }), + functionName, runtime: TEST_RUNTIMES[getRuntimeKey()], architecture: TEST_ARCHITECTURES[getArchitectureKey()], - logRetention: RetentionDays.ONE_DAY, + logGroup, }); new CfnOutput(this, extraProps.nameSuffix, { From d810d8c2f390c06e81398be3c2ec78c7abc5afbd Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Mon, 2 Sep 2024 18:20:11 +0100 Subject: [PATCH 2/4] chore: fix this usage --- packages/testing/src/resources/TestNodejsFunction.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/testing/src/resources/TestNodejsFunction.ts b/packages/testing/src/resources/TestNodejsFunction.ts index 971ea53dde..b1123adaa9 100644 --- a/packages/testing/src/resources/TestNodejsFunction.ts +++ b/packages/testing/src/resources/TestNodejsFunction.ts @@ -2,7 +2,7 @@ import { randomUUID } from 'node:crypto'; import { CfnOutput, Duration } from 'aws-cdk-lib'; import { Tracing } from 'aws-cdk-lib/aws-lambda'; import { NodejsFunction, OutputFormat } from 'aws-cdk-lib/aws-lambda-nodejs'; -import { RetentionDays, LogGroup } from 'aws-cdk-lib/aws-logs'; +import { LogGroup, RetentionDays } from 'aws-cdk-lib/aws-logs'; import type { TestStack } from '../TestStack.js'; import { TEST_ARCHITECTURES, TEST_RUNTIMES } from '../constants.js'; import { @@ -31,7 +31,7 @@ class TestNodejsFunction extends NodejsFunction { }); const resourceId = randomUUID().substring(0, 5); - const logGroup = new LogGroup(this, `log-${resourceId}`, { + const logGroup = new LogGroup(stack.stack, `log-${resourceId}`, { logGroupName: `/aws/lambda/${functionName}`, retention: RetentionDays.ONE_DAY, }); From 32d2f0898ca51be568fa529ac1f0064b5658bd54 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 5 Sep 2024 12:30:41 +0200 Subject: [PATCH 3/4] chore(testing): use retry options in xray trace retrieval --- packages/testing/src/xray-traces-utils.ts | 30 +++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/packages/testing/src/xray-traces-utils.ts b/packages/testing/src/xray-traces-utils.ts index 9fb04c9137..0af1cfa467 100644 --- a/packages/testing/src/xray-traces-utils.ts +++ b/packages/testing/src/xray-traces-utils.ts @@ -49,8 +49,7 @@ const getTraceIds = async ( ); } - const ids = []; - + const ids: string[] = []; for (const summary of summaries) { if (summary.Id === undefined) { throw new Error( @@ -83,10 +82,15 @@ const retriableGetTraceIds = (options: GetXRayTraceIdsOptions) => endTime.getTime() / 1000 )} --filter-expression 'resource.arn ENDSWITH ":function:${options.resourceName}"'` ); + + throw new Error( + `Failed to get trace IDs for ${options.resourceName} after ${retryOptions.retries} retries`, + { cause: error } + ); } retry(error); } - }); + }, retryOptions); /** * Parse and sort the trace segments by start time @@ -168,13 +172,25 @@ const getTraceDetails = async ( * @param options - The options to get trace details, including the trace IDs and expected segments count */ const retriableGetTraceDetails = (options: GetXRayTraceDetailsOptions) => - promiseRetry(async (retry) => { + promiseRetry(async (retry, attempt) => { try { return await getTraceDetails(options); } catch (error) { + if (attempt === retryOptions.retries) { + console.log( + `Manual query: aws xray get-trace-summaries --start-time ${ + options.traceIds + }` + ); + + throw new Error( + `Failed to get trace details for ${options.traceIds} after ${retryOptions.retries} retries`, + { cause: error } + ); + } retry(error); } - }); + }, retryOptions); /** * Find the main function segment in the trace identified by the `## index.` suffix @@ -292,7 +308,7 @@ const getTraces = async ( const { resourceName } = options; - const mainSubsegments = []; + const mainSubsegments: EnrichedXRayTraceDocumentParsed[] = []; for (const trace of traces) { const mainSubsegment = findPowertoolsFunctionSegment(trace, resourceName); const enrichedMainSubsegment = { @@ -319,7 +335,7 @@ const getTracesWithoutMainSubsegments = async ( const { resourceName } = options; - const lambdaFunctionSegments = []; + const lambdaFunctionSegments: EnrichedXRayTraceDocumentParsed[] = []; for (const trace of traces) { const functionSegment = trace.Segments.find( (segment) => segment.Document.origin === 'AWS::Lambda::Function' From 2dc5006b6be45e094d2d3563d0e44af08743f629 Mon Sep 17 00:00:00 2001 From: Andrea Amorosi Date: Thu, 5 Sep 2024 13:01:09 +0200 Subject: [PATCH 4/4] chore(testing): add debug log --- packages/tracer/tests/e2e/allFeatures.middy.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tracer/tests/e2e/allFeatures.middy.test.ts b/packages/tracer/tests/e2e/allFeatures.middy.test.ts index 9d07a6a651..184def950d 100644 --- a/packages/tracer/tests/e2e/allFeatures.middy.test.ts +++ b/packages/tracer/tests/e2e/allFeatures.middy.test.ts @@ -295,6 +295,7 @@ describe('Tracer E2E tests, all features with middy instantiation', () => { expect(subsegments.has('## index.handler')).toBe(false); if (shouldThrowAnError) { + console.log(JSON.stringify(lambdaFunctionSegment, null, 2)); expect(lambdaFunctionSegment.error).toBe(true); } }