From 547987a5cb0be112ea37a5856e99871c0b20f1ec Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Mon, 21 Oct 2024 13:47:43 +0000 Subject: [PATCH 1/8] fix(nextjs): Fix matching logic for file convention type for root level components --- packages/nextjs/src/config/loaders/wrappingLoader.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/nextjs/src/config/loaders/wrappingLoader.ts b/packages/nextjs/src/config/loaders/wrappingLoader.ts index d3c1d62c9330..13d35c24c07a 100644 --- a/packages/nextjs/src/config/loaders/wrappingLoader.ts +++ b/packages/nextjs/src/config/loaders/wrappingLoader.ts @@ -182,8 +182,10 @@ export default function wrappingLoader( const componentTypeMatch = path.posix .normalize(path.relative(appDir, this.resourcePath)) + // Replace all backslashes with forward slashes (windows) + .replace(/\\/g, '/') // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor - .match(new RegExp(`/\\/?([^/]+)\\.(?:${pageExtensionRegex})$`)); + .match(new RegExp(`(^|/)/?([^/]+)\\.(?:${pageExtensionRegex})$`)); if (componentTypeMatch && componentTypeMatch[1]) { let componentType: ServerComponentContext['componentType']; From 4406cdb5e58261155a0193b63c1cfccac9525222 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Mon, 21 Oct 2024 14:43:48 +0000 Subject: [PATCH 2/8] fix --- packages/nextjs/src/config/loaders/wrappingLoader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/src/config/loaders/wrappingLoader.ts b/packages/nextjs/src/config/loaders/wrappingLoader.ts index 13d35c24c07a..2cf85965e9dc 100644 --- a/packages/nextjs/src/config/loaders/wrappingLoader.ts +++ b/packages/nextjs/src/config/loaders/wrappingLoader.ts @@ -185,7 +185,7 @@ export default function wrappingLoader( // Replace all backslashes with forward slashes (windows) .replace(/\\/g, '/') // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor - .match(new RegExp(`(^|/)/?([^/]+)\\.(?:${pageExtensionRegex})$`)); + .match(new RegExp(`(^|/)?([^/]+)\\.(?:${pageExtensionRegex})$`)); if (componentTypeMatch && componentTypeMatch[1]) { let componentType: ServerComponentContext['componentType']; From d97ad45d60f5316edf59ebe6310ed5d3926b56ff Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Mon, 21 Oct 2024 15:40:40 +0000 Subject: [PATCH 3/8] fix --- packages/nextjs/src/config/loaders/wrappingLoader.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nextjs/src/config/loaders/wrappingLoader.ts b/packages/nextjs/src/config/loaders/wrappingLoader.ts index 2cf85965e9dc..e298a459d16e 100644 --- a/packages/nextjs/src/config/loaders/wrappingLoader.ts +++ b/packages/nextjs/src/config/loaders/wrappingLoader.ts @@ -185,7 +185,7 @@ export default function wrappingLoader( // Replace all backslashes with forward slashes (windows) .replace(/\\/g, '/') // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor - .match(new RegExp(`(^|/)?([^/]+)\\.(?:${pageExtensionRegex})$`)); + .match(new RegExp(`(?:^|/)?([^/]+)\\.(?:${pageExtensionRegex})$`)); if (componentTypeMatch && componentTypeMatch[1]) { let componentType: ServerComponentContext['componentType']; From 620ca325160151f830fecaab2799b24967e3c158 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 22 Oct 2024 10:21:04 +0000 Subject: [PATCH 4/8] . --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5fc8f9d55e5c..26f86081e5fb 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1043,6 +1043,7 @@ jobs: path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/event-dumps overwrite: true retention-days: 7 + if-no-files-found: ignore - name: Upload test results to Codecov if: cancelled() == false From 7ecaeb1f8b6e05c081f82584fb7e52ea8b555441 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 22 Oct 2024 10:40:04 +0000 Subject: [PATCH 5/8] sneaking this in because it is too useful --- .github/workflows/build.yml | 4 + ...malize-e2e-test-dump-transaction-events.js | 150 ++++++++++-------- 2 files changed, 86 insertions(+), 68 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 26f86081e5fb..4dae85921874 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1035,6 +1035,10 @@ jobs: overwrite: true retention-days: 7 + - name: Pre-process E2E Test Dumps + run: | + node ./scripts/normalize-e2e-test-dump-transaction-events.js + - name: Upload E2E Test Event Dumps uses: actions/upload-artifact@v4 if: always() diff --git a/scripts/normalize-e2e-test-dump-transaction-events.js b/scripts/normalize-e2e-test-dump-transaction-events.js index ba06a63fa020..771dcccd8f87 100644 --- a/scripts/normalize-e2e-test-dump-transaction-events.js +++ b/scripts/normalize-e2e-test-dump-transaction-events.js @@ -1,81 +1,95 @@ +// @ts-check /* eslint-disable no-console */ const fs = require('fs'); const path = require('path'); +const glob = require('glob'); + +glob.glob( + '../dev-packages/e2e-tests/test-applications/*/event-dumps/*.dump', + { + cwd: __dirname, + absolute: true, + }, + (err, dumpPaths) => { + if (err) { + throw err; + } -if (process.argv.length < 4) { - throw new Error('Please provide an input and output file path as an argument.'); -} - -const resolvedInputPath = path.resolve(process.argv[2]); -const resolvedOutputPath = path.resolve(process.argv[3]); - -const fileContents = fs.readFileSync(resolvedInputPath, 'utf8'); - -const transactionNodes = []; - -fileContents.split('\n').forEach(serializedEnvelope => { - let envelope; - try { - envelope = JSON.parse(serializedEnvelope); - } catch (e) { - return; - // noop - } + dumpPaths.forEach(dumpPath => { + const fileContents = fs.readFileSync(dumpPath, 'utf8'); - const envelopeItems = envelope[1]; - - envelopeItems.forEach(([envelopeItemHeader, transaction]) => { - if (envelopeItemHeader.type === 'transaction') { - const rootNode = { - runtime: transaction.contexts.runtime?.name, - op: transaction.contexts.trace.op, - name: transaction.transaction, - children: [], - }; - - const spanMap = new Map(); - spanMap.set(transaction.contexts.trace.span_id, rootNode); - - transaction.spans.forEach(span => { - const node = { - op: span.data['sentry.op'], - name: span.description, - parent_span_id: span.parent_span_id, - children: [], - }; - spanMap.set(span.span_id, node); - }); + const transactionNodes = []; - transaction.spans.forEach(span => { - const node = spanMap.get(span.span_id); - if (node && node.parent_span_id) { - const parentNode = spanMap.get(node.parent_span_id); - parentNode.children.push(node); + fileContents.split('\n').forEach(serializedEnvelope => { + let envelope; + try { + envelope = JSON.parse(serializedEnvelope); + } catch (e) { + return; + // noop } - }); - transactionNodes.push(rootNode); - } - }); -}); - -const output = transactionNodes - .sort((a, b) => { - const aSerialized = serializeNode(a); - const bSerialized = serializeNode(b); - if (aSerialized < bSerialized) { - return -1; - } else if (aSerialized > bSerialized) { - return 1; - } else { - return 0; - } - }) - .map(node => buildDeterministicStringFromNode(node)) - .join('\n\n-----------------------\n\n'); + const envelopeItems = envelope[1]; + + envelopeItems.forEach(([envelopeItemHeader, transaction]) => { + if (envelopeItemHeader.type === 'transaction') { + const rootNode = { + runtime: transaction.contexts.runtime?.name, + op: transaction.contexts.trace.op, + name: transaction.transaction, + children: [], + }; + + const spanMap = new Map(); + spanMap.set(transaction.contexts.trace.span_id, rootNode); + + transaction.spans.forEach(span => { + const node = { + op: span.data['sentry.op'], + name: span.description, + parent_span_id: span.parent_span_id, + children: [], + }; + spanMap.set(span.span_id, node); + }); + + transaction.spans.forEach(span => { + const node = spanMap.get(span.span_id); + if (node && node.parent_span_id) { + const parentNode = spanMap.get(node.parent_span_id); + parentNode.children.push(node); + } + }); + + transactionNodes.push(rootNode); + } + }); + }); -fs.writeFileSync(resolvedOutputPath, output, 'utf-8'); + const output = transactionNodes + .sort((a, b) => { + const aSerialized = serializeNode(a); + const bSerialized = serializeNode(b); + if (aSerialized < bSerialized) { + return -1; + } else if (aSerialized > bSerialized) { + return 1; + } else { + return 0; + } + }) + .map(node => buildDeterministicStringFromNode(node)) + .join('\n\n-----------------------\n\n'); + + fs.writeFileSync( + path.join(path.dirname(dumpPath), `normalized-transactions-${path.basename(dumpPath, '.dump')}.txt`), + output, + 'utf-8', + ); + }); + }, +); // ------- utility fns ---------- From ea1a932d7766369d5edae8f2bce2dd28d048d30f Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 22 Oct 2024 10:57:06 +0000 Subject: [PATCH 6/8] Fix v4 upload to same file --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4dae85921874..986b9164cfb0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1043,7 +1043,7 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: e2e-test-event-dumps + name: E2E Test Dump ${{ matrix.label || matrix.test-application }} path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/event-dumps overwrite: true retention-days: 7 From f32bc72b066e0fd995773d93e6ae116d7b5b8201 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 22 Oct 2024 10:57:46 +0000 Subject: [PATCH 7/8] Formatting --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 986b9164cfb0..37d993cbea07 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1043,7 +1043,7 @@ jobs: uses: actions/upload-artifact@v4 if: always() with: - name: E2E Test Dump ${{ matrix.label || matrix.test-application }} + name: E2E Test Dump (${{ matrix.label || matrix.test-application }}) path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/event-dumps overwrite: true retention-days: 7 From bbd4b38ac27d2033c8501aca600b62c66c8f51d6 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 22 Oct 2024 11:25:41 +0000 Subject: [PATCH 8/8] Don't run certain things twice and also upload for canary tests --- .github/workflows/build.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 37d993cbea07..8fd537898b28 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1088,10 +1088,6 @@ jobs: 'react-send-to-sentry', 'node-express-send-to-sentry', 'debug-id-sourcemaps', - 'nextjs-app-dir', - 'nextjs-13', - 'nextjs-14', - 'nextjs-15', ] build-command: - false @@ -1189,6 +1185,20 @@ jobs: timeout-minutes: 10 run: pnpm ${{ matrix.assert-command || 'test:assert' }} + - name: Pre-process E2E Test Dumps + run: | + node ./scripts/normalize-e2e-test-dump-transaction-events.js + + - name: Upload E2E Test Event Dumps + uses: actions/upload-artifact@v4 + if: always() + with: + name: E2E Test Dump (${{ matrix.label || matrix.test-application }}) + path: dev-packages/e2e-tests/test-applications/${{ matrix.test-application }}/event-dumps + overwrite: true + retention-days: 7 + if-no-files-found: ignore + - name: Deploy Astro to Cloudflare uses: cloudflare/pages-action@v1 if: matrix.test-application == 'cloudflare-astro'