From 0ef1de100e84589bcfbdd802030f73b9a8dd790d Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Mon, 21 Jul 2025 17:38:04 +0200 Subject: [PATCH 1/3] feat(aws): Detect SDK source for AWS Lambda layer --- .../aws-lambda-layer-cjs/tests/basic.test.ts | 5 +++ .../aws-lambda-layer-esm/tests/basic.test.ts | 5 +++ .../aws-serverless-esm/tests/basic.test.ts | 5 +++ .../scripts/buildLambdaLayer.ts | 31 ++++++++++++++++++- packages/aws-serverless/src/sdk.ts | 3 +- packages/core/src/utils/env.ts | 2 +- 6 files changed, 48 insertions(+), 3 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts index 3393b2a559dd..dc48464cc3b7 100644 --- a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts @@ -69,4 +69,9 @@ test('Lambda layer SDK bundle sends events', async ({ request }) => { op: 'test', }), ); + + // shows that the SDK source is correctly detected + expect(transactionEvent.sdk?.packages).toContainEqual( + expect.objectContaining({ name: 'aws:@sentry/aws-serverless' }), + ); }); diff --git a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts index 2e02fda6486e..92b8e240580b 100644 --- a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts @@ -69,4 +69,9 @@ test('Lambda layer SDK bundle sends events', async ({ request }) => { op: 'test', }), ); + + // shows that the SDK source is correctly detected + expect(transactionEvent.sdk?.packages).toContainEqual( + expect.objectContaining({ name: 'aws:@sentry/aws-serverless' }), + ); }); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/tests/basic.test.ts b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/tests/basic.test.ts index b27e16bdaa85..803484881837 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/tests/basic.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/tests/basic.test.ts @@ -82,4 +82,9 @@ test('AWS Serverless SDK sends events in ESM mode', async ({ request }) => { op: 'manual', }), ); + + // shows that the SDK source is correctly detected + expect(transactionEvent.sdk?.packages).toContainEqual( + expect.objectContaining({ name: 'npm:@sentry/aws-serverless' }), + ); }); diff --git a/packages/aws-serverless/scripts/buildLambdaLayer.ts b/packages/aws-serverless/scripts/buildLambdaLayer.ts index 388cc4a0b238..5084ef94662a 100644 --- a/packages/aws-serverless/scripts/buildLambdaLayer.ts +++ b/packages/aws-serverless/scripts/buildLambdaLayer.ts @@ -43,10 +43,12 @@ async function buildLambdaLayer(): Promise { 'build/aws/dist-serverless/nodejs/node_modules/@sentry/aws-serverless/dist/awslambda-auto.js', ); + replaceSDKSource(); + const zipFilename = `sentry-node-serverless-${version}.zip`; console.log(`Creating final layer zip file ${zipFilename}.`); // need to preserve the symlink above with -y - run(`zip -r -y ${zipFilename} .`, { cwd: 'build/aws/dist-serverless' }); + run(`zip -r -y -q ${zipFilename} .`, { cwd: 'build/aws/dist-serverless' }); } // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -178,3 +180,30 @@ function buildPackageJson(): void { const packageJsonPath = './build/aws/dist-serverless/nodejs/package.json'; fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); } + +function replaceSDKSource(): void { + console.log('Replacing SDK source.'); + + const envFiles = [ + './build/aws/dist-serverless/nodejs/node_modules/@sentry/core/build/cjs/utils/env.js', + './build/aws/dist-serverless/nodejs/node_modules/@sentry/core/build/esm/utils/env.js', + ]; + + for (const envFile of envFiles) { + try { + let content = fs.readFileSync(envFile, 'utf-8'); + + // Replace the line marked with __SENTRY_SDK_SOURCE__ comment + // Change from 'npm' to 'aws' to identify that this is the AWS Lambda layer + content = content.replace( + "/* __SENTRY_SDK_SOURCE__ */ return 'npm';", + "/* __SENTRY_SDK_SOURCE__ */ return 'aws';", + ); + + fs.writeFileSync(envFile, content); + console.log(`Updated SDK source in ${envFile}`); + } catch { + console.warn(`Warning: Could not update SDK source in ${envFile}`); + } + } +} diff --git a/packages/aws-serverless/src/sdk.ts b/packages/aws-serverless/src/sdk.ts index dafaf780ed99..f64b62b9a373 100644 --- a/packages/aws-serverless/src/sdk.ts +++ b/packages/aws-serverless/src/sdk.ts @@ -2,6 +2,7 @@ import type { Integration, Options, Scope, Span } from '@sentry/core'; import { applySdkMetadata, debug, + getSDKSource, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, } from '@sentry/core'; @@ -81,7 +82,7 @@ export function init(options: NodeOptions = {}): NodeClient | undefined { ...options, }; - applySdkMetadata(opts, 'aws-serverless'); + applySdkMetadata(opts, 'aws-serverless', ['aws-serverless'], getSDKSource()); return initWithoutDefaultIntegrations(opts); } diff --git a/packages/core/src/utils/env.ts b/packages/core/src/utils/env.ts index 6f8c7ca8e946..723e50dc2a98 100644 --- a/packages/core/src/utils/env.ts +++ b/packages/core/src/utils/env.ts @@ -15,7 +15,7 @@ declare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined; -export type SdkSource = 'npm' | 'cdn' | 'loader'; +export type SdkSource = 'npm' | 'cdn' | 'loader' | 'aws'; /** * Figures out if we're building a browser bundle. From 2ab5f59c42c29a1e5af2c80691de9ff47dacad65 Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Wed, 23 Jul 2025 11:15:52 +0200 Subject: [PATCH 2/3] remove zip -q flag --- packages/aws-serverless/scripts/buildLambdaLayer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/aws-serverless/scripts/buildLambdaLayer.ts b/packages/aws-serverless/scripts/buildLambdaLayer.ts index 5084ef94662a..052d483eeaab 100644 --- a/packages/aws-serverless/scripts/buildLambdaLayer.ts +++ b/packages/aws-serverless/scripts/buildLambdaLayer.ts @@ -48,7 +48,7 @@ async function buildLambdaLayer(): Promise { const zipFilename = `sentry-node-serverless-${version}.zip`; console.log(`Creating final layer zip file ${zipFilename}.`); // need to preserve the symlink above with -y - run(`zip -r -y -q ${zipFilename} .`, { cwd: 'build/aws/dist-serverless' }); + run(`zip -r -y ${zipFilename} .`, { cwd: 'build/aws/dist-serverless' }); } // eslint-disable-next-line @typescript-eslint/no-floating-promises From f56e882ddff9f77f7c305f02dd0e6601e0eac359 Mon Sep 17 00:00:00 2001 From: Martin Sonnberger Date: Wed, 23 Jul 2025 11:20:55 +0200 Subject: [PATCH 3/3] switch to `aws-lambda-layer` prefix --- .../aws-lambda-layer-cjs/tests/basic.test.ts | 2 +- .../aws-lambda-layer-esm/tests/basic.test.ts | 2 +- packages/aws-serverless/scripts/buildLambdaLayer.ts | 4 ++-- packages/core/src/utils/env.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts index dc48464cc3b7..9f88e3961a5a 100644 --- a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-cjs/tests/basic.test.ts @@ -72,6 +72,6 @@ test('Lambda layer SDK bundle sends events', async ({ request }) => { // shows that the SDK source is correctly detected expect(transactionEvent.sdk?.packages).toContainEqual( - expect.objectContaining({ name: 'aws:@sentry/aws-serverless' }), + expect.objectContaining({ name: 'aws-lambda-layer:@sentry/aws-serverless' }), ); }); diff --git a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts index 92b8e240580b..a9711880ab79 100644 --- a/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts +++ b/dev-packages/e2e-tests/test-applications/aws-lambda-layer-esm/tests/basic.test.ts @@ -72,6 +72,6 @@ test('Lambda layer SDK bundle sends events', async ({ request }) => { // shows that the SDK source is correctly detected expect(transactionEvent.sdk?.packages).toContainEqual( - expect.objectContaining({ name: 'aws:@sentry/aws-serverless' }), + expect.objectContaining({ name: 'aws-lambda-layer:@sentry/aws-serverless' }), ); }); diff --git a/packages/aws-serverless/scripts/buildLambdaLayer.ts b/packages/aws-serverless/scripts/buildLambdaLayer.ts index 052d483eeaab..a918e6bbae18 100644 --- a/packages/aws-serverless/scripts/buildLambdaLayer.ts +++ b/packages/aws-serverless/scripts/buildLambdaLayer.ts @@ -194,10 +194,10 @@ function replaceSDKSource(): void { let content = fs.readFileSync(envFile, 'utf-8'); // Replace the line marked with __SENTRY_SDK_SOURCE__ comment - // Change from 'npm' to 'aws' to identify that this is the AWS Lambda layer + // Change from 'npm' to 'aws-lambda-layer' to identify that this is the AWS Lambda layer content = content.replace( "/* __SENTRY_SDK_SOURCE__ */ return 'npm';", - "/* __SENTRY_SDK_SOURCE__ */ return 'aws';", + "/* __SENTRY_SDK_SOURCE__ */ return 'aws-lambda-layer';", ); fs.writeFileSync(envFile, content); diff --git a/packages/core/src/utils/env.ts b/packages/core/src/utils/env.ts index 723e50dc2a98..86872017707a 100644 --- a/packages/core/src/utils/env.ts +++ b/packages/core/src/utils/env.ts @@ -15,7 +15,7 @@ declare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined; -export type SdkSource = 'npm' | 'cdn' | 'loader' | 'aws'; +export type SdkSource = 'npm' | 'cdn' | 'loader' | 'aws-lambda-layer'; /** * Figures out if we're building a browser bundle.