From abbfb2119bdb8be4e43e928b88fea4df336fd559 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 15:44:07 +0200 Subject: [PATCH 1/7] test(e2e): Add e2e test for AWS lambda in ESM mode --- dev-packages/e2e-tests/package.json | 3 +- packages/aws-serverless/package.json | 3 ++ yarn.lock | 81 +++++++++------------------- 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/dev-packages/e2e-tests/package.json b/dev-packages/e2e-tests/package.json index 9d66b82c4888..c29bdd12f8ee 100644 --- a/dev-packages/e2e-tests/package.json +++ b/dev-packages/e2e-tests/package.json @@ -23,7 +23,8 @@ "esbuild": "0.20.0", "glob": "8.0.3", "ts-node": "10.9.1", - "yaml": "2.2.2" + "yaml": "2.2.2", + "rimraf": "^5.0.0" }, "volta": { "extends": "../../package.json", diff --git a/packages/aws-serverless/package.json b/packages/aws-serverless/package.json index ed8d7ad25b8c..7befab8a1828 100644 --- a/packages/aws-serverless/package.json +++ b/packages/aws-serverless/package.json @@ -41,6 +41,9 @@ "./awslambda-auto": { "require": { "default": "./build/npm/cjs/awslambda-auto.js" + }, + "import": { + "default": "./build/npm/esm/awslambda-auto.js" } }, "./dist/awslambda-auto": { diff --git a/yarn.lock b/yarn.lock index 676d0b52bbf0..e18300447d39 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9467,17 +9467,7 @@ dependencies: "@types/unist" "*" -"@types/history-4@npm:@types/history@4.7.8": - version "4.7.8" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" - integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== - -"@types/history-5@npm:@types/history@4.7.8": - version "4.7.8" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" - integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== - -"@types/history@*": +"@types/history-4@npm:@types/history@4.7.8", "@types/history-5@npm:@types/history@4.7.8", "@types/history@*": version "4.7.8" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.8.tgz#49348387983075705fe8f4e02fb67f7daaec4934" integrity sha512-S78QIYirQcUoo6UJZx9CSP0O2ix9IaeAXwQi26Rhr/+mg7qqPy8TzaxHSUut7eGjL8WmLccT7/MXf304WjqHcA== @@ -9836,15 +9826,7 @@ "@types/history" "^3" "@types/react" "*" -"@types/react-router-4@npm:@types/react-router@5.1.14": - version "5.1.14" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.14.tgz#e0442f4eb4c446541ad7435d44a97f8fe6df40da" - integrity sha512-LAJpqYUaCTMT2anZheoidiIymt8MuX286zoVFPM3DVb23aQBH0mAkFvzpd4LKqiolV8bBtZWT5Qp7hClCNDENw== - dependencies: - "@types/history" "*" - "@types/react" "*" - -"@types/react-router-5@npm:@types/react-router@5.1.14": +"@types/react-router-4@npm:@types/react-router@5.1.14", "@types/react-router-5@npm:@types/react-router@5.1.14": version "5.1.14" resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.14.tgz#e0442f4eb4c446541ad7435d44a97f8fe6df40da" integrity sha512-LAJpqYUaCTMT2anZheoidiIymt8MuX286zoVFPM3DVb23aQBH0mAkFvzpd4LKqiolV8bBtZWT5Qp7hClCNDENw== @@ -19643,6 +19625,18 @@ glob@^10.3.4: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob@^10.3.7: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + glob@^5.0.10: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" @@ -29020,7 +29014,7 @@ react-is@^18.0.0: dependencies: "@remix-run/router" "1.0.2" -"react-router-6@npm:react-router@6.3.0": +"react-router-6@npm:react-router@6.3.0", react-router@6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== @@ -29035,13 +29029,6 @@ react-router-dom@^6.2.2: history "^5.2.0" react-router "6.3.0" -react-router@6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.3.0.tgz#3970cc64b4cb4eae0c1ea5203a80334fdd175557" - integrity sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ== - dependencies: - history "^5.2.0" - react@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" @@ -29964,6 +29951,13 @@ rimraf@^4.4.1: dependencies: glob "^9.2.0" +rimraf@^5.0.0: + version "5.0.9" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.9.tgz#c3baa1b886eadc2ec7981a06a593c3d01134ffe9" + integrity sha512-3i7b8OcswU6CpU8Ej89quJD4O98id7TtVM5U4Mybh84zQXdrFmDLouWBEEaD/QfO3gDDfH+AGFCGsR7kngzQnA== + dependencies: + glob "^10.3.7" + rimraf@~2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" @@ -31567,16 +31561,7 @@ string-template@~0.2.1: resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@4.2.3, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@4.2.3, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -31688,14 +31673,7 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@6.0.1, strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -34788,16 +34766,7 @@ workerpool@^6.4.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.4.0.tgz#f8d5cfb45fde32fa3b7af72ad617c3369567a462" integrity sha512-i3KR1mQMNwY2wx20ozq2EjISGtQWDIfV56We+yGJ5yDs8jTwQiLLaqHlkBHITlCuJnYlVRmXegxFxZg7gqI++A== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@7.0.0, wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From d14934efe115cd99034335c65e0e3ae9a8152bda Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 15:45:02 +0200 Subject: [PATCH 2/7] add to CI --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fdaa607f0411..91e40645e0fc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -995,6 +995,7 @@ jobs: 'angular-17', 'angular-18', 'aws-lambda-layer-cjs', + 'aws-serverless-esm', 'node-express', 'create-react-app', 'create-next-app', From 9b282ed8f7d623eac9e806ea5943ec92aecc3773 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 15:58:44 +0200 Subject: [PATCH 3/7] add test app lol --- .../aws-serverless-esm/.npmrc | 2 + .../aws-serverless-esm/package.json | 24 ++++++ .../aws-serverless-esm/playwright.config.ts | 79 +++++++++++++++++++ .../aws-serverless-esm/src/instrument.mjs | 7 ++ .../src/lambda-function.mjs | 26 ++++++ .../aws-serverless-esm/src/package.json | 5 ++ .../aws-serverless-esm/src/run-lambda.mjs | 10 +++ .../aws-serverless-esm/src/run.mjs | 14 ++++ .../aws-serverless-esm/start-event-proxy.mjs | 7 ++ .../aws-serverless-esm/tests/basic.test.ts | 69 ++++++++++++++++ 10 files changed, 243 insertions(+) create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/.npmrc create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/lambda-function.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/package.json create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run-lambda.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/start-event-proxy.mjs create mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/tests/basic.test.ts diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/.npmrc b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/.npmrc new file mode 100644 index 000000000000..070f80f05092 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/.npmrc @@ -0,0 +1,2 @@ +@sentry:registry=http://127.0.0.1:4873 +@sentry-internal:registry=http://127.0.0.1:4873 diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json new file mode 100644 index 000000000000..54ad06d64771 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json @@ -0,0 +1,24 @@ +{ + "name": "node-express-app", + "version": "1.0.0", + "private": true, + "scripts": { + "start": "node src/run.mjs", + "test": "playwright test", + "clean": "npx rimraf node_modules pnpm-lock.yaml", + "test:build": "pnpm install", + "test:assert": "pnpm test" + }, + "dependencies": { + "@sentry/aws-serverless": "* || latest" + }, + "devDependencies": { + "@sentry-internal/test-utils": "link:../../../test-utils", + "@playwright/test": "^1.41.1", + "wait-port": "1.0.4", + "rimraf": "^5.0.8" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts new file mode 100644 index 000000000000..7b14daadc6d1 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts @@ -0,0 +1,79 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { devices } from '@playwright/test'; + +// Fix urls not resolving to localhost on Node v17+ +// See: https://github.com/axios/axios/issues/3821#issuecomment-1413727575 +import { setDefaultResultOrder } from 'dns'; +setDefaultResultOrder('ipv4first'); + +const eventProxyPort = 3031; +const lambdaPort = 3030; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +const config: PlaywrightTestConfig = { + testDir: './tests', + /* Maximum time one test can run for. */ + timeout: 150_000, + expect: { + /** + * Maximum time expect() should wait for the condition to be met. + * For example in `await expect(locator).toHaveText();` + */ + timeout: 5000, + }, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: 0, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'list', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ + actionTimeout: 0, + + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: `http://localhost:${lambdaPort}`, + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { + ...devices['Desktop Chrome'], + }, + }, + // For now we only test Chrome! + // { + // name: 'firefox', + // use: { + // ...devices['Desktop Firefox'], + // }, + // }, + // { + // name: 'webkit', + // use: { + // ...devices['Desktop Safari'], + // }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: [ + { + command: `node start-event-proxy.mjs && pnpm wait-port ${eventProxyPort}`, + port: eventProxyPort, + stdout: 'pipe', + }, + ], +}; + +export default config; diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs new file mode 100644 index 000000000000..e46b62bde76b --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs @@ -0,0 +1,7 @@ +import * as Sentry from '@sentry/aws-serverless'; + +Sentry.init({ + dsn: 'http://public@localhost:3031/1337', + tracesSampleRate: 1.0, + debug: true, +}); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/lambda-function.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/lambda-function.mjs new file mode 100644 index 000000000000..4d248c4432c7 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/lambda-function.mjs @@ -0,0 +1,26 @@ +import * as http from 'node:http'; +import * as Sentry from '@sentry/aws-serverless'; + +const handler = Sentry.wrapHandler(async () => { + await new Promise(resolve => { + const req = http.request( + { + host: 'example.com', + }, + res => { + res.on('data', d => { + process.stdout.write(d); + }); + + res.on('end', () => { + resolve(); + }); + }, + ); + req.end(); + }); + + Sentry.startSpan({ name: 'manual-span', op: 'manual' }, () => {}); +}); + +export { handler }; diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/package.json b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/package.json new file mode 100644 index 000000000000..43afe1b9fe77 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/package.json @@ -0,0 +1,5 @@ +{ + "//": "This is a mock package.json file which is usually created by AWS when deploying the lambda. OTEL instrumentation tries to read this file to get the lambda version", + "name": "lambda", + "version": "1.0.0" +} diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run-lambda.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run-lambda.mjs new file mode 100644 index 000000000000..8356a5ef9bff --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run-lambda.mjs @@ -0,0 +1,10 @@ +import { handler } from './lambda-function.mjs'; + +// Simulate minimal event and context objects being passed to the handler by the AWS runtime +const event = {}; +const context = { + invokedFunctionArn: 'arn:aws:lambda:us-east-1:123453789012:function:my-lambda', + functionName: 'my-lambda', +}; + +await handler(event, context); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs new file mode 100644 index 000000000000..85d6d9fb99f2 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs @@ -0,0 +1,14 @@ +import child_process from 'child_process'; + +child_process.execSync('node ./src/run-lambda.mjs', { + stdio: 'inherit', + env: { + ...process.env, + // On AWS, LAMBDA_TASK_ROOT is usually /var/task but for testing, we set it to the CWD to correctly apply our handler + LAMBDA_TASK_ROOT: process.cwd(), + _HANDLER: 'src/lambda-function.handler', + + NODE_OPTIONS: '--import ./src/instrument.mjs', + }, + cwd: process.cwd(), +}); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/start-event-proxy.mjs new file mode 100644 index 000000000000..e74f395b6237 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/start-event-proxy.mjs @@ -0,0 +1,7 @@ +import { startEventProxyServer } from '@sentry-internal/test-utils'; + +startEventProxyServer({ + port: 3031, + proxyServerName: 'aws-serverless-esm', + forwardToSentry: false, +}); 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 new file mode 100644 index 000000000000..8e507a469235 --- /dev/null +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/tests/basic.test.ts @@ -0,0 +1,69 @@ +import * as child_process from 'child_process'; +import { expect, test } from '@playwright/test'; +import { waitForTransaction } from '@sentry-internal/test-utils'; + +test('AWS Serverless SDK sends events in ESM mode', async ({ request }) => { + const transactionEventPromise = waitForTransaction('aws-serverless-esm', transactionEvent => { + return transactionEvent?.transaction === 'my-lambda'; + }); + + // Waiting for 1s here because attaching the listener for events in `waitForTransaction` is not synchronous + // Since in this test, we don't start a browser via playwright, we don't have the usual delays (page.goto, etc) + // which are usually enough for us to never have noticed this race condition before. + // This is a workaround but probably sufficient as long as we only experience it in this test. + await new Promise(resolve => + setTimeout(() => { + resolve(); + }, 1000), + ); + + child_process.execSync('pnpm start', { + stdio: 'ignore', + }); + + const transactionEvent = await transactionEventPromise; + + // shows the SDK sent a transaction + expect(transactionEvent.transaction).toEqual('my-lambda'); // name should be the function name + expect(transactionEvent.contexts?.trace).toEqual({ + data: { + 'sentry.sample_rate': 1, + 'sentry.source': 'component', + 'sentry.origin': 'auto.function.serverless', + 'sentry.op': 'function.aws.lambda', + 'otel.kind': 'INTERNAL', + }, + op: 'function.aws.lambda', + origin: 'auto.function.serverless', + span_id: expect.any(String), + status: 'ok', + trace_id: expect.any(String), + }); + + expect(transactionEvent.spans).toHaveLength(2); + + // shows that the Otel Http instrumentation is working + expect(transactionEvent.spans).toContainEqual( + expect.objectContaining({ + data: expect.objectContaining({ + 'sentry.op': 'http.client', + 'sentry.origin': 'auto.http.otel.http', + url: 'http://example.com/', + }), + description: 'GET http://example.com/', + op: 'http.client', + }), + ); + + // shows that the manual span creation is working + expect(transactionEvent.spans).toContainEqual( + expect.objectContaining({ + data: expect.objectContaining({ + 'sentry.op': 'manual', + 'sentry.origin': 'manual', + }), + description: 'manual-span', + op: 'manual', + }), + ); +}); From 9d0c1862c23b661187ba272066dff7bda400240a Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 16:18:00 +0200 Subject: [PATCH 4/7] switch to option 2 --- .../aws-serverless-esm/src/instrument.mjs | 7 ------- .../test-applications/aws-serverless-esm/src/run.mjs | 4 +++- 2 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs deleted file mode 100644 index e46b62bde76b..000000000000 --- a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/instrument.mjs +++ /dev/null @@ -1,7 +0,0 @@ -import * as Sentry from '@sentry/aws-serverless'; - -Sentry.init({ - dsn: 'http://public@localhost:3031/1337', - tracesSampleRate: 1.0, - debug: true, -}); diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs index 85d6d9fb99f2..2f67c14a54f7 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/src/run.mjs @@ -8,7 +8,9 @@ child_process.execSync('node ./src/run-lambda.mjs', { LAMBDA_TASK_ROOT: process.cwd(), _HANDLER: 'src/lambda-function.handler', - NODE_OPTIONS: '--import ./src/instrument.mjs', + NODE_OPTIONS: '--import @sentry/aws-serverless/awslambda-auto', + SENTRY_DSN: 'http://public@localhost:3031/1337', + SENTRY_TRACES_SAMPLE_RATE: '1.0', }, cwd: process.cwd(), }); From 6f93dc32df0004efe60d6dce53dc8784bce324c6 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 16:26:53 +0200 Subject: [PATCH 5/7] streamline playwright config --- .../aws-serverless-esm/playwright.config.ts | 78 ++++--------------- 1 file changed, 13 insertions(+), 65 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts index 7b14daadc6d1..9b4853af2033 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/playwright.config.ts @@ -1,5 +1,4 @@ -import type { PlaywrightTestConfig } from '@playwright/test'; -import { devices } from '@playwright/test'; +import { getPlaywrightConfig } from '@sentry-internal/test-utils'; // Fix urls not resolving to localhost on Node v17+ // See: https://github.com/axios/axios/issues/3821#issuecomment-1413727575 @@ -7,73 +6,22 @@ import { setDefaultResultOrder } from 'dns'; setDefaultResultOrder('ipv4first'); const eventProxyPort = 3031; -const lambdaPort = 3030; /** * See https://playwright.dev/docs/test-configuration. */ -const config: PlaywrightTestConfig = { - testDir: './tests', - /* Maximum time one test can run for. */ - timeout: 150_000, - expect: { - /** - * Maximum time expect() should wait for the condition to be met. - * For example in `await expect(locator).toHaveText();` - */ - timeout: 5000, - }, - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: 0, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'list', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ - actionTimeout: 0, - - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: `http://localhost:${lambdaPort}`, - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { - ...devices['Desktop Chrome'], +const config = getPlaywrightConfig( + { startCommand: '' }, + { + /* Run your local dev server before starting the tests */ + webServer: [ + { + command: `node start-event-proxy.mjs && pnpm wait-port ${eventProxyPort}`, + port: eventProxyPort, + stdout: 'pipe', }, - }, - // For now we only test Chrome! - // { - // name: 'firefox', - // use: { - // ...devices['Desktop Firefox'], - // }, - // }, - // { - // name: 'webkit', - // use: { - // ...devices['Desktop Safari'], - // }, - // }, - ], - - /* Run your local dev server before starting the tests */ - webServer: [ - { - command: `node start-event-proxy.mjs && pnpm wait-port ${eventProxyPort}`, - port: eventProxyPort, - stdout: 'pipe', - }, - ], -}; + ], + }, +); export default config; From 8d1fa8fb5f2f2edca2caf5eae8a0ecfd38741fcd Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 16:28:24 +0200 Subject: [PATCH 6/7] remove unnecessary e2e test app dependency --- .../test-applications/aws-serverless-esm/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json index 54ad06d64771..ebd28b380d68 100644 --- a/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json +++ b/dev-packages/e2e-tests/test-applications/aws-serverless-esm/package.json @@ -15,8 +15,7 @@ "devDependencies": { "@sentry-internal/test-utils": "link:../../../test-utils", "@playwright/test": "^1.41.1", - "wait-port": "1.0.4", - "rimraf": "^5.0.8" + "wait-port": "1.0.4" }, "volta": { "extends": "../../package.json" From a69a6645be47bfb0e0789564e5fd8eb9dc5c6a81 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Tue, 9 Jul 2024 16:41:17 +0200 Subject: [PATCH 7/7] empty commit - CI pls start