From 3d30048c0cbb727ee89547da42ec758c574333f4 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 30 Jan 2023 13:33:57 +0100 Subject: [PATCH 1/3] feat(browser): Track if cdn or npm bundle --- packages/browser/src/client.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index 9d14fd94a221..e6a5f22d734c 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -9,13 +9,16 @@ import type { Severity, SeverityLevel, } from '@sentry/types'; -import { createClientReportEnvelope, dsnToString, logger, serializeEnvelope } from '@sentry/utils'; +import { createClientReportEnvelope, dsnToString, getSDKSource, logger, serializeEnvelope } from '@sentry/utils'; import { eventFromException, eventFromMessage } from './eventbuilder'; import { WINDOW } from './helpers'; import type { Breadcrumbs } from './integrations'; import { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs'; import type { BrowserTransportOptions } from './transports/types'; + +const sdkSource = getSDKSource(); + /** * Configuration options for the Sentry Browser SDK. * @see @sentry/types Options for more information. @@ -46,7 +49,7 @@ export class BrowserClient extends BaseClient { name: 'sentry.javascript.browser', packages: [ { - name: 'npm:@sentry/browser', + name: `${sdkSource}:@sentry/browser`, version: SDK_VERSION, }, ], From 931a81e6c87afeb7c80ea56925f3880a48bf4555 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 30 Jan 2023 13:42:33 +0100 Subject: [PATCH 2/3] set from window --- packages/browser/src/client.ts | 4 ++-- packages/browser/test/unit/index.test.ts | 10 ++++++++++ packages/utils/src/env.ts | 2 +- packages/utils/src/worldwide.ts | 3 +++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/browser/src/client.ts b/packages/browser/src/client.ts index e6a5f22d734c..e603cba661dd 100644 --- a/packages/browser/src/client.ts +++ b/packages/browser/src/client.ts @@ -17,8 +17,6 @@ import type { Breadcrumbs } from './integrations'; import { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs'; import type { BrowserTransportOptions } from './transports/types'; -const sdkSource = getSDKSource(); - /** * Configuration options for the Sentry Browser SDK. * @see @sentry/types Options for more information. @@ -44,6 +42,8 @@ export class BrowserClient extends BaseClient { * @param options Configuration options for this SDK. */ public constructor(options: BrowserClientOptions) { + const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource(); + options._metadata = options._metadata || {}; options._metadata.sdk = options._metadata.sdk || { name: 'sentry.javascript.browser', diff --git a/packages/browser/test/unit/index.test.ts b/packages/browser/test/unit/index.test.ts index 8bc3ffab36e1..0efa812963e4 100644 --- a/packages/browser/test/unit/index.test.ts +++ b/packages/browser/test/unit/index.test.ts @@ -277,6 +277,16 @@ describe('SentryBrowser initialization', () => { expect(sdkData?.version).toBe(SDK_VERSION); }); + it('uses SDK source from window', () => { + global.SENTRY_SDK_SOURCE = 'loader'; + init({ dsn }); + + const sdkData = (getCurrentHub().getClient() as any).getOptions()._metadata.sdk; + + expect(sdkData?.packages[0].name).toBe('loader:@sentry/browser'); + delete global.SENTRY_SDK_SOURCE; + }); + it('should set SDK data when instantiating a client directly', () => { const options = getDefaultBrowserClientOptions({ dsn }); const client = new BrowserClient(options); diff --git a/packages/utils/src/env.ts b/packages/utils/src/env.ts index 8d622f8836cd..95dfc698dabc 100644 --- a/packages/utils/src/env.ts +++ b/packages/utils/src/env.ts @@ -15,7 +15,7 @@ declare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined; -type SdkSource = 'npm' | 'cdn' | 'loader'; +export type SdkSource = 'npm' | 'cdn' | 'loader'; /** * Figures out if we're building a browser bundle. diff --git a/packages/utils/src/worldwide.ts b/packages/utils/src/worldwide.ts index e341339bc980..4cc141cc3d65 100644 --- a/packages/utils/src/worldwide.ts +++ b/packages/utils/src/worldwide.ts @@ -14,6 +14,8 @@ import type { Integration } from '@sentry/types'; +import type { SdkSource } from './env'; + /** Internal global with common properties and Sentry extensions */ export interface InternalGlobal { navigator?: { userAgent?: string }; @@ -26,6 +28,7 @@ export interface InternalGlobal { SENTRY_RELEASE?: { id?: string; }; + SENTRY_SDK_SOURCE?: SdkSource; __SENTRY__: { globalEventProcessors: any; hub: any; From 01566142dcb732b67b8564ce737f8dbe11f9512f Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Mon, 30 Jan 2023 16:22:58 +0100 Subject: [PATCH 3/3] more tests --- packages/browser/test/unit/index.test.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/browser/test/unit/index.test.ts b/packages/browser/test/unit/index.test.ts index 0efa812963e4..122637ea91d4 100644 --- a/packages/browser/test/unit/index.test.ts +++ b/packages/browser/test/unit/index.test.ts @@ -1,4 +1,5 @@ import { getReportDialogEndpoint, SDK_VERSION } from '@sentry/core'; +import * as utils from '@sentry/utils'; import type { Event } from '../../src'; import { @@ -277,7 +278,7 @@ describe('SentryBrowser initialization', () => { expect(sdkData?.version).toBe(SDK_VERSION); }); - it('uses SDK source from window', () => { + it('uses SDK source from window for package name', () => { global.SENTRY_SDK_SOURCE = 'loader'; init({ dsn }); @@ -287,6 +288,17 @@ describe('SentryBrowser initialization', () => { delete global.SENTRY_SDK_SOURCE; }); + it('uses SDK source from global for package name', () => { + const spy = jest.spyOn(utils, 'getSDKSource').mockReturnValue('cdn'); + init({ dsn }); + + const sdkData = (getCurrentHub().getClient() as any).getOptions()._metadata.sdk; + + expect(sdkData?.packages[0].name).toBe('cdn:@sentry/browser'); + expect(utils.getSDKSource).toBeCalledTimes(1); + spy.mockRestore(); + }); + it('should set SDK data when instantiating a client directly', () => { const options = getDefaultBrowserClientOptions({ dsn }); const client = new BrowserClient(options);