From 7846b242fc139ebf0f18db1c9fdc3cf7c4e6815b Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Fri, 6 Dec 2024 11:27:48 +0100 Subject: [PATCH 01/11] ci(v9): Ensure CI runs on v8 & v9 branches (#14604) In order for us to have size-limit comparison etc, we need to ensure CI runs on v8 & v9 branches too. --- .github/workflows/build.yml | 10 ++++++---- .github/workflows/enforce-license-compliance.yml | 13 +++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5df700a2947e..c26be7e5ec96 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,6 +4,8 @@ on: branches: - develop - master + - v9 + - v8 - release/** pull_request: merge_group: @@ -105,7 +107,7 @@ jobs: outputs: commit_label: '${{ env.COMMIT_SHA }}: ${{ env.COMMIT_MESSAGE }}' # Note: These next three have to be checked as strings ('true'/'false')! - is_develop: ${{ github.ref == 'refs/heads/develop' }} + is_base_branch: ${{ github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/v9' || github.ref == 'refs/heads/v8'}} is_release: ${{ startsWith(github.ref, 'refs/heads/release/') }} changed_profiling_node: ${{ steps.changed.outputs.profiling_node == 'true' }} changed_ci: ${{ steps.changed.outputs.workflow == 'true' }} @@ -126,7 +128,7 @@ jobs: timeout-minutes: 15 if: | needs.job_get_metadata.outputs.changed_any_code == 'true' || - needs.job_get_metadata.outputs.is_develop == 'true' || + needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' || (needs.job_get_metadata.outputs.is_gitflow_sync == 'false' && needs.job_get_metadata.outputs.has_gitflow_label == 'false') steps: @@ -171,7 +173,7 @@ jobs: key: nx-Linux-${{ github.ref }}-${{ env.HEAD_COMMIT || github.sha }} # On develop branch, we want to _store_ the cache (so it can be used by other branches), but never _restore_ from it restore-keys: - ${{needs.job_get_metadata.outputs.is_develop == 'false' && env.NX_CACHE_RESTORE_KEYS || 'nx-never-restore'}} + ${{needs.job_get_metadata.outputs.is_base_branch == 'false' && env.NX_CACHE_RESTORE_KEYS || 'nx-never-restore'}} - name: Build packages # Set the CODECOV_TOKEN for Bundle Analysis @@ -219,7 +221,7 @@ jobs: timeout-minutes: 15 runs-on: ubuntu-20.04 if: - github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_develop == 'true' || + github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) diff --git a/.github/workflows/enforce-license-compliance.yml b/.github/workflows/enforce-license-compliance.yml index 8f63b6ca063b..776f8135178d 100644 --- a/.github/workflows/enforce-license-compliance.yml +++ b/.github/workflows/enforce-license-compliance.yml @@ -2,9 +2,18 @@ name: "CI: Enforce License Compliance" on: push: - branches: [master, develop, release/*] + branches: + - develop + - master + - v9 + - v8 + - release/** pull_request: - branches: [master, develop] + branches: + - develop + - master + - v9 + - v8 jobs: enforce-license-compliance: From 22d1f96245fa6e379906282d6725b9bd4210d7d7 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 6 Dec 2024 10:10:33 +0000 Subject: [PATCH 02/11] feat(node)!: Remove fine grained `registerEsmLoaderHooks` option and `addOpenTelemetryInstrumentation()` --- packages/astro/src/index.server.ts | 2 - packages/aws-serverless/src/index.ts | 2 - packages/bun/src/index.ts | 2 - packages/google-cloud-serverless/src/index.ts | 2 - packages/node/src/index.ts | 2 - packages/node/src/sdk/index.ts | 2 +- packages/node/src/sdk/initOtel.ts | 34 +++--------- packages/node/src/types.ts | 52 +------------------ packages/opentelemetry/src/index.ts | 3 -- packages/opentelemetry/src/instrumentation.ts | 15 ------ packages/remix/src/index.server.ts | 2 - packages/solidstart/src/server/index.ts | 2 - packages/sveltekit/src/server/index.ts | 2 - 13 files changed, 9 insertions(+), 113 deletions(-) delete mode 100644 packages/opentelemetry/src/instrumentation.ts diff --git a/packages/astro/src/index.server.ts b/packages/astro/src/index.server.ts index 7eca9de9a41a..268e5037b101 100644 --- a/packages/astro/src/index.server.ts +++ b/packages/astro/src/index.server.ts @@ -12,8 +12,6 @@ export { addEventProcessor, addIntegration, // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, - // eslint-disable-next-line deprecation/deprecation addRequestDataToEvent, amqplibIntegration, anrIntegration, diff --git a/packages/aws-serverless/src/index.ts b/packages/aws-serverless/src/index.ts index 3f167b62a7e3..06f9977dc7e5 100644 --- a/packages/aws-serverless/src/index.ts +++ b/packages/aws-serverless/src/index.ts @@ -121,8 +121,6 @@ export { spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, - // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, zodErrorsIntegration, profiler, amqplibIntegration, diff --git a/packages/bun/src/index.ts b/packages/bun/src/index.ts index 1ba5f2de4786..d244d2178a39 100644 --- a/packages/bun/src/index.ts +++ b/packages/bun/src/index.ts @@ -141,8 +141,6 @@ export { spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, - // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, zodErrorsIntegration, profiler, amqplibIntegration, diff --git a/packages/google-cloud-serverless/src/index.ts b/packages/google-cloud-serverless/src/index.ts index 6f89769c2a37..ffc538084054 100644 --- a/packages/google-cloud-serverless/src/index.ts +++ b/packages/google-cloud-serverless/src/index.ts @@ -118,8 +118,6 @@ export { spanToTraceHeader, spanToBaggageHeader, trpcMiddleware, - // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, zodErrorsIntegration, profiler, amqplibIntegration, diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index fa16ac4e6b3d..26f8d1452719 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -61,8 +61,6 @@ export type { NodeOptions } from './types'; export { addRequestDataToEvent, DEFAULT_USER_INCLUDES, extractRequestData } from '@sentry/core'; export { - // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, // These are custom variants that need to be used instead of the core one // As they have slightly different implementations continueTrace, diff --git a/packages/node/src/sdk/index.ts b/packages/node/src/sdk/index.ts index 8cc3b5ff8609..18aa5b5a5a30 100644 --- a/packages/node/src/sdk/index.ts +++ b/packages/node/src/sdk/index.ts @@ -132,7 +132,7 @@ function _init( } if (!isCjs() && options.registerEsmLoaderHooks !== false) { - maybeInitializeEsmLoader(options.registerEsmLoaderHooks === true ? undefined : options.registerEsmLoaderHooks); + maybeInitializeEsmLoader(); } setOpenTelemetryContextAsyncContextStrategy(); diff --git a/packages/node/src/sdk/initOtel.ts b/packages/node/src/sdk/initOtel.ts index f9b849dbf79a..891d01fb587c 100644 --- a/packages/node/src/sdk/initOtel.ts +++ b/packages/node/src/sdk/initOtel.ts @@ -12,7 +12,6 @@ import { SentryPropagator, SentrySampler, SentrySpanProcessor } from '@sentry/op import { createAddHookMessageChannel } from 'import-in-the-middle'; import { getOpenTelemetryInstrumentationToPreload } from '../integrations/tracing'; import { SentryContextManager } from '../otel/contextManager'; -import type { EsmLoaderHookOptions } from '../types'; import { isCjs } from '../utils/commonjs'; import type { NodeClient } from './client'; @@ -30,30 +29,8 @@ export function initOpenTelemetry(client: NodeClient): void { client.traceProvider = provider; } -type ImportInTheMiddleInitData = Pick & { - addHookMessagePort?: unknown; -}; - -interface RegisterOptions { - data?: ImportInTheMiddleInitData; - transferList?: unknown[]; -} - -function getRegisterOptions(esmHookConfig?: EsmLoaderHookOptions): RegisterOptions { - // TODO(v9): Make onlyIncludeInstrumentedModules: true the default behavior. - if (esmHookConfig?.onlyIncludeInstrumentedModules) { - const { addHookMessagePort } = createAddHookMessageChannel(); - // If the user supplied include, we need to use that as a starting point or use an empty array to ensure no modules - // are wrapped if they are not hooked - // eslint-disable-next-line deprecation/deprecation - return { data: { addHookMessagePort, include: esmHookConfig.include || [] }, transferList: [addHookMessagePort] }; - } - - return { data: esmHookConfig }; -} - /** Initialize the ESM loader. */ -export function maybeInitializeEsmLoader(esmHookConfig?: EsmLoaderHookOptions): void { +export function maybeInitializeEsmLoader(): void { const [nodeMajor = 0, nodeMinor = 0] = process.versions.node.split('.').map(Number); // Register hook was added in v20.6.0 and v18.19.0 @@ -64,8 +41,12 @@ export function maybeInitializeEsmLoader(esmHookConfig?: EsmLoaderHookOptions): if (!GLOBAL_OBJ._sentryEsmLoaderHookRegistered && importMetaUrl) { try { + const { addHookMessagePort } = createAddHookMessageChannel(); // @ts-expect-error register is available in these versions - moduleModule.register('import-in-the-middle/hook.mjs', importMetaUrl, getRegisterOptions(esmHookConfig)); + moduleModule.register('import-in-the-middle/hook.mjs', importMetaUrl, { + data: { addHookMessagePort }, + transferList: [addHookMessagePort], + }); GLOBAL_OBJ._sentryEsmLoaderHookRegistered = true; } catch (error) { logger.warn('Failed to register ESM hook', error); @@ -84,7 +65,6 @@ export function maybeInitializeEsmLoader(esmHookConfig?: EsmLoaderHookOptions): interface NodePreloadOptions { debug?: boolean; integrations?: string[]; - registerEsmLoaderHooks?: EsmLoaderHookOptions; } /** @@ -101,7 +81,7 @@ export function preloadOpenTelemetry(options: NodePreloadOptions = {}): void { } if (!isCjs()) { - maybeInitializeEsmLoader(options.registerEsmLoaderHooks); + maybeInitializeEsmLoader(); } // These are all integrations that we need to pre-load to ensure they are set up before any other code runs diff --git a/packages/node/src/types.ts b/packages/node/src/types.ts index ebcdee869523..38fcbaaa16ae 100644 --- a/packages/node/src/types.ts +++ b/packages/node/src/types.ts @@ -5,43 +5,6 @@ import type { ClientOptions, Options, SamplingContext, Scope, Span, TracePropaga import type { NodeTransportOptions } from './transports'; -/** - * Note: In the next major version of the Sentry SDK this interface will be removed and the SDK will by default only wrap - * ESM modules that are required to be wrapped by OpenTelemetry Instrumentation. - */ -export interface EsmLoaderHookOptions { - /** - * Provide a list of modules to wrap with `import-in-the-middle`. - * - * @deprecated It is recommended to use `onlyIncludeInstrumentedModules: true` instead of manually defining modules to include and exclude. - */ - include?: Array; - - /** - * Provide a list of modules to prevent them from being wrapped with `import-in-the-middle`. - * - * @deprecated It is recommended to use `onlyIncludeInstrumentedModules: true` instead of manually defining modules to include and exclude. - */ - exclude?: Array; - - /** - * When set to `true`, `import-in-the-middle` will only wrap ESM modules that are specifically instrumented by - * OpenTelemetry plugins. This is useful to avoid issues where `import-in-the-middle` is not compatible with some of - * your dependencies. - * - * **Note**: This feature will only work if you `Sentry.init()` the SDK before the instrumented modules are loaded. - * This can be achieved via the Node `--import` CLI flag or by loading your app via async `import()` after calling - * `Sentry.init()`. - * - * Defaults to `false`. - * - * Note: In the next major version of the Sentry SDK this option will be removed and the SDK will by default only wrap - * ESM modules that are required to be wrapped by OpenTelemetry Instrumentation. - */ - // TODO(v9): Make `onlyIncludeInstrumentedModules: true` the default behavior. - onlyIncludeInstrumentedModules?: boolean; -} - export interface BaseNodeOptions { /** * List of strings/regex controlling to which outgoing requests @@ -138,22 +101,9 @@ export interface BaseNodeOptions { * with certain libraries. If you run into problems running your app with this enabled, * please raise an issue in https://github.com/getsentry/sentry-javascript. * - * You can optionally exclude specific modules or only include specific modules from being instrumented by providing - * an object with `include` or `exclude` properties. - * - * ```js - * registerEsmLoaderHooks: { - * exclude: ['openai'], - * } - * ``` - * * Defaults to `true`. - * - * Note: In the next major version of the SDK, the possibility to provide fine-grained control will be removed from this option. - * This means that it will only be possible to pass `true` or `false`. The default value will continue to be `true`. */ - // TODO(v9): Only accept true | false | undefined. - registerEsmLoaderHooks?: boolean | EsmLoaderHookOptions; + registerEsmLoaderHooks?: boolean; /** * Configures in which interval client reports will be flushed. Defaults to `60_000` (milliseconds). diff --git a/packages/opentelemetry/src/index.ts b/packages/opentelemetry/src/index.ts index 30228d0dd763..ff8ec1655edd 100644 --- a/packages/opentelemetry/src/index.ts +++ b/packages/opentelemetry/src/index.ts @@ -58,8 +58,5 @@ export { export { openTelemetrySetupCheck } from './utils/setupCheck'; -// eslint-disable-next-line deprecation/deprecation -export { addOpenTelemetryInstrumentation } from './instrumentation'; - // Legacy export { getClient } from '@sentry/core'; diff --git a/packages/opentelemetry/src/instrumentation.ts b/packages/opentelemetry/src/instrumentation.ts deleted file mode 100644 index 979282d0e467..000000000000 --- a/packages/opentelemetry/src/instrumentation.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { Instrumentation } from '@opentelemetry/instrumentation'; -import { registerInstrumentations } from '@opentelemetry/instrumentation'; - -/** - * This method takes an OpenTelemetry instrumentation or - * array of instrumentations and registers them with OpenTelemetry. - * - * @deprecated This method will be removed in the next major version of the SDK. - * Use the `openTelemetryInstrumentations` option in `Sentry.init()` or your custom Sentry Client instead. - */ -export function addOpenTelemetryInstrumentation(...instrumentations: Instrumentation[]): void { - registerInstrumentations({ - instrumentations, - }); -} diff --git a/packages/remix/src/index.server.ts b/packages/remix/src/index.server.ts index f6a5f5060dd9..d0cd703ceea7 100644 --- a/packages/remix/src/index.server.ts +++ b/packages/remix/src/index.server.ts @@ -16,8 +16,6 @@ export { addEventProcessor, addIntegration, // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, - // eslint-disable-next-line deprecation/deprecation addRequestDataToEvent, amqplibIntegration, anrIntegration, diff --git a/packages/solidstart/src/server/index.ts b/packages/solidstart/src/server/index.ts index 450420a2b586..e9274aa633a2 100644 --- a/packages/solidstart/src/server/index.ts +++ b/packages/solidstart/src/server/index.ts @@ -8,8 +8,6 @@ export { addEventProcessor, addIntegration, // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, - // eslint-disable-next-line deprecation/deprecation addRequestDataToEvent, amqplibIntegration, anrIntegration, diff --git a/packages/sveltekit/src/server/index.ts b/packages/sveltekit/src/server/index.ts index bb88e121244f..f4f2a8256684 100644 --- a/packages/sveltekit/src/server/index.ts +++ b/packages/sveltekit/src/server/index.ts @@ -8,8 +8,6 @@ export { addEventProcessor, addIntegration, // eslint-disable-next-line deprecation/deprecation - addOpenTelemetryInstrumentation, - // eslint-disable-next-line deprecation/deprecation addRequestDataToEvent, amqplibIntegration, anrIntegration, From b154bd62bf45f0023e75aed14268124750d13652 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 6 Dec 2024 10:40:07 +0000 Subject: [PATCH 03/11] rm reference in nuxt --- packages/nuxt/src/server/sdk.ts | 23 --------------- packages/nuxt/test/server/sdk.test.ts | 41 +-------------------------- 2 files changed, 1 insertion(+), 63 deletions(-) diff --git a/packages/nuxt/src/server/sdk.ts b/packages/nuxt/src/server/sdk.ts index 32d2b2bc6cac..9eaa2f274818 100644 --- a/packages/nuxt/src/server/sdk.ts +++ b/packages/nuxt/src/server/sdk.ts @@ -18,7 +18,6 @@ import type { SentryNuxtServerOptions } from '../common/types'; export function init(options: SentryNuxtServerOptions): Client | undefined { const sentryOptions = { ...options, - registerEsmLoaderHooks: mergeRegisterEsmLoaderHooks(options), defaultIntegrations: getNuxtDefaultIntegrations(options), }; @@ -92,28 +91,6 @@ function getNuxtDefaultIntegrations(options: NodeOptions): Integration[] { ]; } -/** - * Adds /vue/ to the registerEsmLoaderHooks options and merges it with the old values in the array if one is defined. - * If the registerEsmLoaderHooks option is already a boolean, nothing is changed. - * - * Only exported for Testing purposes. - */ -export function mergeRegisterEsmLoaderHooks( - options: SentryNuxtServerOptions, -): SentryNuxtServerOptions['registerEsmLoaderHooks'] { - if (typeof options.registerEsmLoaderHooks === 'object' && options.registerEsmLoaderHooks !== null) { - return { - // eslint-disable-next-line deprecation/deprecation - exclude: Array.isArray(options.registerEsmLoaderHooks.exclude) - ? // eslint-disable-next-line deprecation/deprecation - [...options.registerEsmLoaderHooks.exclude, /vue/] - : // eslint-disable-next-line deprecation/deprecation - options.registerEsmLoaderHooks.exclude ?? [/vue/], - }; - } - return options.registerEsmLoaderHooks ?? { exclude: [/vue/] }; -} - /** * Flushes pending Sentry events with a 2-second timeout and in a way that cannot create unhandled promise rejections. */ diff --git a/packages/nuxt/test/server/sdk.test.ts b/packages/nuxt/test/server/sdk.test.ts index 2d4679a27649..e5c1a58d15c3 100644 --- a/packages/nuxt/test/server/sdk.test.ts +++ b/packages/nuxt/test/server/sdk.test.ts @@ -5,9 +5,8 @@ import { Scope } from '@sentry/node'; import { getGlobalScope } from '@sentry/node'; import { SDK_VERSION } from '@sentry/node'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import type { SentryNuxtServerOptions } from '../../src/common/types'; import { init } from '../../src/server'; -import { clientSourceMapErrorFilter, mergeRegisterEsmLoaderHooks } from '../../src/server/sdk'; +import { clientSourceMapErrorFilter } from '../../src/server/sdk'; const nodeInit = vi.spyOn(SentryNode, 'init'); @@ -163,42 +162,4 @@ describe('Nuxt Server SDK', () => { }); }); }); - - describe('mergeRegisterEsmLoaderHooks', () => { - it('merges exclude array when registerEsmLoaderHooks is an object with an exclude array', () => { - const options: SentryNuxtServerOptions = { - registerEsmLoaderHooks: { exclude: [/test/] }, - }; - const result = mergeRegisterEsmLoaderHooks(options); - expect(result).toEqual({ exclude: [/test/, /vue/] }); - }); - - it('sets exclude array when registerEsmLoaderHooks is an object without an exclude array', () => { - const options: SentryNuxtServerOptions = { - registerEsmLoaderHooks: {}, - }; - const result = mergeRegisterEsmLoaderHooks(options); - expect(result).toEqual({ exclude: [/vue/] }); - }); - - it('returns boolean when registerEsmLoaderHooks is a boolean', () => { - const options1: SentryNuxtServerOptions = { - registerEsmLoaderHooks: true, - }; - const result1 = mergeRegisterEsmLoaderHooks(options1); - expect(result1).toBe(true); - - const options2: SentryNuxtServerOptions = { - registerEsmLoaderHooks: false, - }; - const result2 = mergeRegisterEsmLoaderHooks(options2); - expect(result2).toBe(false); - }); - - it('sets exclude array when registerEsmLoaderHooks is undefined', () => { - const options: SentryNuxtServerOptions = {}; - const result = mergeRegisterEsmLoaderHooks(options); - expect(result).toEqual({ exclude: [/vue/] }); - }); - }); }); From d1ee44491fb33aae76ff8082805983ecadc463dd Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 10 Dec 2024 11:06:10 +0100 Subject: [PATCH 04/11] feat(vue/nuxt)!: No longer create `"update"` spans for component tracking by default (#14602) Resolves https://github.com/getsentry/sentry-javascript/issues/12851 --- docs/migration/draft-v9-migration-guide.md | 22 ++++++++++++++++++++++ packages/vue/src/constants.ts | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/migration/draft-v9-migration-guide.md b/docs/migration/draft-v9-migration-guide.md index d3b31b4f2570..3faab01d450e 100644 --- a/docs/migration/draft-v9-migration-guide.md +++ b/docs/migration/draft-v9-migration-guide.md @@ -102,6 +102,28 @@ }); ``` +## `@sentry/nuxt` and `@sentry/vue` + +- When component tracking is enabled, "update" spans are no longer created by default. + Add an `"update"` item to the `tracingOptions.hooks` option via the `vueIntegration()` to restore this behavior. + + ```ts + Sentry.init({ + integrations: [ + Sentry.vueIntegration({ + tracingOptions: { + trackComponents: true, + hooks: [ + 'mount', + 'update', // <-- + 'unmount', + ], + }, + }), + ], + }); + ``` + ## `@sentry/astro` - Deprecated passing `dsn`, `release`, `environment`, `sampleRate`, `tracesSampleRate`, `replaysSessionSampleRate` to the integration. Use the runtime-specific `Sentry.init()` calls for passing these options instead. diff --git a/packages/vue/src/constants.ts b/packages/vue/src/constants.ts index e254d988c40c..50aa82f77885 100644 --- a/packages/vue/src/constants.ts +++ b/packages/vue/src/constants.ts @@ -1,3 +1,3 @@ import type { Operation } from './types'; -export const DEFAULT_HOOKS: Operation[] = ['activate', 'mount', 'update']; +export const DEFAULT_HOOKS: Operation[] = ['activate', 'mount']; From 26119bf1a3cced7b73b369d94f0fb874c11abd74 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 10 Dec 2024 11:43:05 +0100 Subject: [PATCH 05/11] feat(nextjs)!: Remove `experimental_captureRequestError` (#14607) Fixes https://github.com/getsentry/sentry-javascript/issues/14302 --- .../e2e-tests/test-applications/nextjs-t3/package.json | 6 +++--- .../test-applications/nextjs-t3/src/trpc/server.ts | 7 +++---- packages/nextjs/src/common/captureRequestError.ts | 8 -------- packages/nextjs/src/common/index.ts | 3 +-- packages/nextjs/src/index.types.ts | 3 +-- 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json b/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json index d5c3a9d20f0d..b85fec6a4897 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json @@ -21,9 +21,9 @@ "@trpc/react-query": "^11.0.0-rc.446", "@trpc/server": "^11.0.0-rc.446", "geist": "^1.3.0", - "next": "^14.2.4", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "next": "14.2.4", + "react": "18.3.1", + "react-dom": "18.3.1", "server-only": "^0.0.1", "superjson": "^2.2.1", "zod": "^3.23.3" diff --git a/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts b/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts index b6cb13a70781..7760873eb51d 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts @@ -2,7 +2,6 @@ import 'server-only'; import { createHydrationHelpers } from '@trpc/react-query/rsc'; import { headers } from 'next/headers'; -import { cache } from 'react'; import { type AppRouter, createCaller } from '~/server/api/root'; import { createTRPCContext } from '~/server/api/trpc'; @@ -12,16 +11,16 @@ import { createQueryClient } from './query-client'; * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when * handling a tRPC call from a React Server Component. */ -const createContext = cache(() => { +const createContext = () => { const heads = new Headers(headers()); heads.set('x-trpc-source', 'rsc'); return createTRPCContext({ headers: heads, }); -}); +}; -const getQueryClient = cache(createQueryClient); +const getQueryClient = createQueryClient; const caller = createCaller(createContext); export const { trpc: api, HydrateClient } = createHydrationHelpers(caller, getQueryClient); diff --git a/packages/nextjs/src/common/captureRequestError.ts b/packages/nextjs/src/common/captureRequestError.ts index 6de33ad11a8e..26fdaab4953b 100644 --- a/packages/nextjs/src/common/captureRequestError.ts +++ b/packages/nextjs/src/common/captureRequestError.ts @@ -41,11 +41,3 @@ export function captureRequestError(error: unknown, request: RequestInfo, errorC }); }); } - -/** - * Reports errors passed to the the Next.js `onRequestError` instrumentation hook. - * - * @deprecated Use `captureRequestError` instead. - */ -// TODO(v9): Remove this export -export const experimental_captureRequestError = captureRequestError; diff --git a/packages/nextjs/src/common/index.ts b/packages/nextjs/src/common/index.ts index 7740c35c016c..b9a652522349 100644 --- a/packages/nextjs/src/common/index.ts +++ b/packages/nextjs/src/common/index.ts @@ -11,5 +11,4 @@ export { wrapMiddlewareWithSentry } from './wrapMiddlewareWithSentry'; export { wrapPageComponentWithSentry } from './pages-router-instrumentation/wrapPageComponentWithSentry'; export { wrapGenerationFunctionWithSentry } from './wrapGenerationFunctionWithSentry'; export { withServerActionInstrumentation } from './withServerActionInstrumentation'; -// eslint-disable-next-line deprecation/deprecation -export { experimental_captureRequestError, captureRequestError } from './captureRequestError'; +export { captureRequestError } from './captureRequestError'; diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index 1b6a0e09ed85..1b965828116f 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -142,5 +142,4 @@ export declare function wrapApiHandlerWithSentryVercelCrons(WrappingTarget: C): C; -// eslint-disable-next-line deprecation/deprecation -export { experimental_captureRequestError, captureRequestError } from './common/captureRequestError'; +export { captureRequestError } from './common/captureRequestError'; From 6610144af0acbf98887f9666fcc2e5718601590e Mon Sep 17 00:00:00 2001 From: Francesco Gringl-Novy Date: Fri, 6 Dec 2024 11:27:48 +0100 Subject: [PATCH 06/11] ci(v9): Ensure CI runs on v8 & v9 branches (#14604) In order for us to have size-limit comparison etc, we need to ensure CI runs on v8 & v9 branches too. --- .github/workflows/build.yml | 10 ++++++---- .github/workflows/enforce-license-compliance.yml | 13 +++++++++++-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index bf9ba21376bb..31f5cea28bda 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,6 +4,8 @@ on: branches: - develop - master + - v9 + - v8 - release/** pull_request: merge_group: @@ -105,7 +107,7 @@ jobs: outputs: commit_label: '${{ env.COMMIT_SHA }}: ${{ env.COMMIT_MESSAGE }}' # Note: These next three have to be checked as strings ('true'/'false')! - is_develop: ${{ github.ref == 'refs/heads/develop' }} + is_base_branch: ${{ github.ref == 'refs/heads/develop' || github.ref == 'refs/heads/v9' || github.ref == 'refs/heads/v8'}} is_release: ${{ startsWith(github.ref, 'refs/heads/release/') }} changed_profiling_node: ${{ steps.changed.outputs.profiling_node == 'true' }} changed_ci: ${{ steps.changed.outputs.workflow == 'true' }} @@ -126,7 +128,7 @@ jobs: timeout-minutes: 15 if: | needs.job_get_metadata.outputs.changed_any_code == 'true' || - needs.job_get_metadata.outputs.is_develop == 'true' || + needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' || (needs.job_get_metadata.outputs.is_gitflow_sync == 'false' && needs.job_get_metadata.outputs.has_gitflow_label == 'false') steps: @@ -171,7 +173,7 @@ jobs: key: nx-Linux-${{ github.ref }}-${{ env.HEAD_COMMIT || github.sha }} # On develop branch, we want to _store_ the cache (so it can be used by other branches), but never _restore_ from it restore-keys: - ${{needs.job_get_metadata.outputs.is_develop == 'false' && env.NX_CACHE_RESTORE_KEYS || 'nx-never-restore'}} + ${{needs.job_get_metadata.outputs.is_base_branch == 'false' && env.NX_CACHE_RESTORE_KEYS || 'nx-never-restore'}} - name: Build packages # Set the CODECOV_TOKEN for Bundle Analysis @@ -219,7 +221,7 @@ jobs: timeout-minutes: 15 runs-on: ubuntu-20.04 if: - github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_develop == 'true' || + github.event_name == 'pull_request' || needs.job_get_metadata.outputs.is_base_branch == 'true' || needs.job_get_metadata.outputs.is_release == 'true' steps: - name: Check out current commit (${{ needs.job_get_metadata.outputs.commit_label }}) diff --git a/.github/workflows/enforce-license-compliance.yml b/.github/workflows/enforce-license-compliance.yml index 8f63b6ca063b..776f8135178d 100644 --- a/.github/workflows/enforce-license-compliance.yml +++ b/.github/workflows/enforce-license-compliance.yml @@ -2,9 +2,18 @@ name: "CI: Enforce License Compliance" on: push: - branches: [master, develop, release/*] + branches: + - develop + - master + - v9 + - v8 + - release/** pull_request: - branches: [master, develop] + branches: + - develop + - master + - v9 + - v8 jobs: enforce-license-compliance: From 164869809e343aee924ab4fa9895e6a6c85777ea Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 10 Dec 2024 11:06:10 +0100 Subject: [PATCH 07/11] feat(vue/nuxt)!: No longer create `"update"` spans for component tracking by default (#14602) Resolves https://github.com/getsentry/sentry-javascript/issues/12851 --- docs/migration/draft-v9-migration-guide.md | 22 ++++++++++++++++++++++ packages/vue/src/constants.ts | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/docs/migration/draft-v9-migration-guide.md b/docs/migration/draft-v9-migration-guide.md index acf268c81ef4..461b740d06b7 100644 --- a/docs/migration/draft-v9-migration-guide.md +++ b/docs/migration/draft-v9-migration-guide.md @@ -107,6 +107,28 @@ }); ``` +## `@sentry/nuxt` and `@sentry/vue` + +- When component tracking is enabled, "update" spans are no longer created by default. + Add an `"update"` item to the `tracingOptions.hooks` option via the `vueIntegration()` to restore this behavior. + + ```ts + Sentry.init({ + integrations: [ + Sentry.vueIntegration({ + tracingOptions: { + trackComponents: true, + hooks: [ + 'mount', + 'update', // <-- + 'unmount', + ], + }, + }), + ], + }); + ``` + ## `@sentry/astro` - Deprecated passing `dsn`, `release`, `environment`, `sampleRate`, `tracesSampleRate`, `replaysSessionSampleRate` to the integration. Use the runtime-specific `Sentry.init()` calls for passing these options instead. diff --git a/packages/vue/src/constants.ts b/packages/vue/src/constants.ts index e254d988c40c..50aa82f77885 100644 --- a/packages/vue/src/constants.ts +++ b/packages/vue/src/constants.ts @@ -1,3 +1,3 @@ import type { Operation } from './types'; -export const DEFAULT_HOOKS: Operation[] = ['activate', 'mount', 'update']; +export const DEFAULT_HOOKS: Operation[] = ['activate', 'mount']; From d9ee102335b13173ee8d4d375aa7d71de6db9aed Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Tue, 10 Dec 2024 11:43:05 +0100 Subject: [PATCH 08/11] feat(nextjs)!: Remove `experimental_captureRequestError` (#14607) Fixes https://github.com/getsentry/sentry-javascript/issues/14302 --- .../e2e-tests/test-applications/nextjs-t3/package.json | 6 +++--- .../test-applications/nextjs-t3/src/trpc/server.ts | 7 +++---- packages/nextjs/src/common/captureRequestError.ts | 8 -------- packages/nextjs/src/common/index.ts | 3 +-- packages/nextjs/src/index.types.ts | 3 +-- 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json b/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json index 2fd54b440e2e..4cdd6509ddbd 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-t3/package.json @@ -21,9 +21,9 @@ "@trpc/react-query": "^11.0.0-rc.446", "@trpc/server": "^11.0.0-rc.446", "geist": "^1.3.0", - "next": "^14.2.4", - "react": "^18.3.1", - "react-dom": "^18.3.1", + "next": "14.2.4", + "react": "18.3.1", + "react-dom": "18.3.1", "server-only": "^0.0.1", "superjson": "^2.2.1", "zod": "^3.23.3" diff --git a/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts b/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts index b6cb13a70781..7760873eb51d 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-t3/src/trpc/server.ts @@ -2,7 +2,6 @@ import 'server-only'; import { createHydrationHelpers } from '@trpc/react-query/rsc'; import { headers } from 'next/headers'; -import { cache } from 'react'; import { type AppRouter, createCaller } from '~/server/api/root'; import { createTRPCContext } from '~/server/api/trpc'; @@ -12,16 +11,16 @@ import { createQueryClient } from './query-client'; * This wraps the `createTRPCContext` helper and provides the required context for the tRPC API when * handling a tRPC call from a React Server Component. */ -const createContext = cache(() => { +const createContext = () => { const heads = new Headers(headers()); heads.set('x-trpc-source', 'rsc'); return createTRPCContext({ headers: heads, }); -}); +}; -const getQueryClient = cache(createQueryClient); +const getQueryClient = createQueryClient; const caller = createCaller(createContext); export const { trpc: api, HydrateClient } = createHydrationHelpers(caller, getQueryClient); diff --git a/packages/nextjs/src/common/captureRequestError.ts b/packages/nextjs/src/common/captureRequestError.ts index 6de33ad11a8e..26fdaab4953b 100644 --- a/packages/nextjs/src/common/captureRequestError.ts +++ b/packages/nextjs/src/common/captureRequestError.ts @@ -41,11 +41,3 @@ export function captureRequestError(error: unknown, request: RequestInfo, errorC }); }); } - -/** - * Reports errors passed to the the Next.js `onRequestError` instrumentation hook. - * - * @deprecated Use `captureRequestError` instead. - */ -// TODO(v9): Remove this export -export const experimental_captureRequestError = captureRequestError; diff --git a/packages/nextjs/src/common/index.ts b/packages/nextjs/src/common/index.ts index 7740c35c016c..b9a652522349 100644 --- a/packages/nextjs/src/common/index.ts +++ b/packages/nextjs/src/common/index.ts @@ -11,5 +11,4 @@ export { wrapMiddlewareWithSentry } from './wrapMiddlewareWithSentry'; export { wrapPageComponentWithSentry } from './pages-router-instrumentation/wrapPageComponentWithSentry'; export { wrapGenerationFunctionWithSentry } from './wrapGenerationFunctionWithSentry'; export { withServerActionInstrumentation } from './withServerActionInstrumentation'; -// eslint-disable-next-line deprecation/deprecation -export { experimental_captureRequestError, captureRequestError } from './captureRequestError'; +export { captureRequestError } from './captureRequestError'; diff --git a/packages/nextjs/src/index.types.ts b/packages/nextjs/src/index.types.ts index 1b6a0e09ed85..1b965828116f 100644 --- a/packages/nextjs/src/index.types.ts +++ b/packages/nextjs/src/index.types.ts @@ -142,5 +142,4 @@ export declare function wrapApiHandlerWithSentryVercelCrons(WrappingTarget: C): C; -// eslint-disable-next-line deprecation/deprecation -export { experimental_captureRequestError, captureRequestError } from './common/captureRequestError'; +export { captureRequestError } from './common/captureRequestError'; From 31c5ce77736a02cb1d1c160ff9380f37c8cec453 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 11 Dec 2024 13:43:12 +0000 Subject: [PATCH 09/11] . --- .../node-express-esm-loader/src/instrument.mjs | 1 - .../suites/esm/import-in-the-middle/app.mjs | 1 - .../suites/esm/import-in-the-middle/test.ts | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/dev-packages/e2e-tests/test-applications/node-express-esm-loader/src/instrument.mjs b/dev-packages/e2e-tests/test-applications/node-express-esm-loader/src/instrument.mjs index caaf73162ded..544c773e5e7c 100644 --- a/dev-packages/e2e-tests/test-applications/node-express-esm-loader/src/instrument.mjs +++ b/dev-packages/e2e-tests/test-applications/node-express-esm-loader/src/instrument.mjs @@ -5,5 +5,4 @@ Sentry.init({ dsn: process.env.E2E_TEST_DSN, tunnel: `http://localhost:3031/`, // proxy server tracesSampleRate: 1, - registerEsmLoaderHooks: { onlyIncludeInstrumentedModules: true }, }); diff --git a/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/app.mjs b/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/app.mjs index 6b20155aea38..74479cd1c8b7 100644 --- a/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/app.mjs +++ b/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/app.mjs @@ -13,7 +13,6 @@ Sentry.init({ release: '1.0', autoSessionTracking: false, transport: loggingTransport, - registerEsmLoaderHooks: { onlyIncludeInstrumentedModules: true }, }); await import('./sub-module.mjs'); diff --git a/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts b/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts index 8b9e6e06202f..30edf215388c 100644 --- a/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts +++ b/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts @@ -6,7 +6,7 @@ afterAll(() => { }); conditionalTest({ min: 18 })('import-in-the-middle', () => { - test('onlyIncludeInstrumentedModules', done => { + test('should only instrument modules that we have instrumentation for', done => { createRunner(__dirname, 'app.mjs').ensureNoErrorOutput().start(done); }); }); From 351574426d8c8c00963a9c9612dcf11daf566651 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 11 Dec 2024 13:44:48 +0000 Subject: [PATCH 10/11] fix test --- .../suites/esm/import-in-the-middle/test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts b/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts index 30edf215388c..e73789577406 100644 --- a/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts +++ b/dev-packages/node-integration-tests/suites/esm/import-in-the-middle/test.ts @@ -1,12 +1,15 @@ +import { spawnSync } from 'child_process'; +import { join } from 'path'; import { conditionalTest } from '../../../utils'; -import { cleanupChildProcesses, createRunner } from '../../../utils/runner'; +import { cleanupChildProcesses } from '../../../utils/runner'; afterAll(() => { cleanupChildProcesses(); }); conditionalTest({ min: 18 })('import-in-the-middle', () => { - test('should only instrument modules that we have instrumentation for', done => { - createRunner(__dirname, 'app.mjs').ensureNoErrorOutput().start(done); + test('should only instrument modules that we have instrumentation for', () => { + const result = spawnSync('node', [join(__dirname, 'app.mjs')], { encoding: 'utf-8' }); + expect(result.stderr).not.toMatch('should be the only hooked modules but we just hooked'); }); }); From 9ea66272c04318ff3e9b5cbd9f3002d960f07dea Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Wed, 11 Dec 2024 14:06:15 +0000 Subject: [PATCH 11/11] fix? --- packages/node/src/sdk/initOtel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node/src/sdk/initOtel.ts b/packages/node/src/sdk/initOtel.ts index 37240c148168..42bc6e3b5612 100644 --- a/packages/node/src/sdk/initOtel.ts +++ b/packages/node/src/sdk/initOtel.ts @@ -48,7 +48,7 @@ export function maybeInitializeEsmLoader(): void { const { addHookMessagePort } = createAddHookMessageChannel(); // @ts-expect-error register is available in these versions moduleModule.register('import-in-the-middle/hook.mjs', importMetaUrl, { - data: { addHookMessagePort }, + data: { addHookMessagePort, include: [] }, transferList: [addHookMessagePort], }); GLOBAL_OBJ._sentryEsmLoaderHookRegistered = true;