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..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 @@ -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-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 2e02fda6486e..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 @@ -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-lambda-layer:@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..a918e6bbae18 100644 --- a/packages/aws-serverless/scripts/buildLambdaLayer.ts +++ b/packages/aws-serverless/scripts/buildLambdaLayer.ts @@ -43,6 +43,8 @@ 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 @@ -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-lambda-layer' to identify that this is the AWS Lambda layer + content = content.replace( + "/* __SENTRY_SDK_SOURCE__ */ return 'npm';", + "/* __SENTRY_SDK_SOURCE__ */ return 'aws-lambda-layer';", + ); + + 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..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'; +export type SdkSource = 'npm' | 'cdn' | 'loader' | 'aws-lambda-layer'; /** * Figures out if we're building a browser bundle.