diff --git a/src/commands/Dashboard.ts b/src/commands/Dashboard.ts index 41e7dd5c..edc8912c 100644 --- a/src/commands/Dashboard.ts +++ b/src/commands/Dashboard.ts @@ -358,7 +358,7 @@ export class Dashboard { version.usedVersion ? '' : `data-showWelcome="true"` } ${ experimental ? `data-experimental="${experimental}"` : '' - } data-webview-url="${webviewUrl}" > + } data-webview-url="${webviewUrl}" data-is-crash-disabled="${!Telemetry.isVscodeEnabled()}" > ${(scriptsToLoad || []) .map((script) => { diff --git a/src/dashboardWebView/index.tsx b/src/dashboardWebView/index.tsx index 32be46fc..4628c94c 100644 --- a/src/dashboardWebView/index.tsx +++ b/src/dashboardWebView/index.tsx @@ -3,8 +3,6 @@ import { render } from 'react-dom'; import { RecoilRoot } from 'recoil'; import { App } from './components/App'; import * as Sentry from '@sentry/react'; -import { Integrations } from '@sentry/tracing'; -import { SENTRY_LINK, SentryIgnore } from '../constants'; import { MemoryRouter } from 'react-router-dom'; import './styles.css'; import { Preview } from './components/Preview'; @@ -13,6 +11,7 @@ import { CustomPanelViewResult } from '../models'; import { Chatbot } from './components/Chatbot/Chatbot'; import { updateCssVariables } from './utils'; import { I10nProvider } from './providers/I10nProvider'; +import { SentryInit } from '../utils/sentryInit'; declare const acquireVsCodeApi: () => { getState: () => T; @@ -65,19 +64,13 @@ if (elm) { const url = elm?.getAttribute('data-url'); const experimental = elm?.getAttribute('data-experimental'); const webviewUrl = elm?.getAttribute('data-webview-url'); + const isCrashDisabled = elm?.getAttribute('data-is-crash-disabled'); updateCssVariables(); mutationObserver.observe(document.body, { childList: false, attributes: true }); - if (isProd === 'true') { - Sentry.init({ - dsn: SENTRY_LINK, - integrations: [new Integrations.BrowserTracing()], - tracesSampleRate: 0, // No performance tracing required - release: version || '', - environment: environment || '', - ignoreErrors: SentryIgnore - }); + if (isProd === 'true' && isCrashDisabled === 'false') { + Sentry.init(SentryInit(version, environment)); Sentry.setTag("type", "dashboard"); if (document.body.getAttribute(`data-vscode-theme-id`)) { diff --git a/src/helpers/Telemetry.ts b/src/helpers/Telemetry.ts index a863a69c..12dc9fda 100644 --- a/src/helpers/Telemetry.ts +++ b/src/helpers/Telemetry.ts @@ -24,6 +24,24 @@ export class Telemetry { return Telemetry.instance; } + public static isVscodeEnabled(): boolean { + const config = workspace.getConfiguration('telemetry'); + const isVscodeEnable = config.get<'off' | undefined>('enableTelemetry'); + return isVscodeEnable === 'off' ? false : true; + } + + /** + * Checks if telemetry is enabled. + * @returns {boolean} Returns true if telemetry is enabled, false otherwise. + */ + public static isEnabled(): boolean { + const isVscodeEnable = Telemetry.isVscodeEnabled(); + + const isDisabled = Settings.get(SETTING_TELEMETRY_DISABLE); + + return isDisabled || isVscodeEnable ? false : true; + } + /** * Send metrics to our own database * @param eventName @@ -31,11 +49,7 @@ export class Telemetry { * @returns */ public static send(eventName: string, properties?: any) { - const config = workspace.getConfiguration('telemetry'); - const isVscodeEnable = config.get<'off' | undefined>('enableTelemetry'); - - const isDisabled = Settings.get(SETTING_TELEMETRY_DISABLE); - if (isDisabled || isVscodeEnable === 'off') { + if (!Telemetry.isEnabled()) { return; } diff --git a/src/panelWebView/PanelProvider.ts b/src/panelWebView/PanelProvider.ts index 0f8630c3..c68d1beb 100644 --- a/src/panelWebView/PanelProvider.ts +++ b/src/panelWebView/PanelProvider.ts @@ -286,7 +286,9 @@ export class PanelProvider implements WebviewViewProvider, Disposable {
+ }" data-version="${ + version.usedVersion + }" data-is-crash-disabled="${!Telemetry.isVscodeEnabled()}"> ${(scriptsToLoad || []) .map((script) => { diff --git a/src/panelWebView/index.tsx b/src/panelWebView/index.tsx index c965f045..613ddbbd 100644 --- a/src/panelWebView/index.tsx +++ b/src/panelWebView/index.tsx @@ -1,10 +1,10 @@ import * as React from 'react'; +import * as Sentry from '@sentry/react'; import { render } from 'react-dom'; import { ViewPanel } from './ViewPanel'; -import * as Sentry from '@sentry/react'; -import { Integrations } from '@sentry/tracing'; -import { SENTRY_LINK, SentryIgnore } from '../constants'; import { RecoilRoot } from 'recoil'; +import { I10nProvider } from '../dashboardWebView/providers/I10nProvider'; +import { SentryInit } from '../utils/sentryInit'; import './styles.css'; @@ -17,7 +17,6 @@ import '@bendera/vscode-webview-elements/dist/vscode-table-row.js'; import '@bendera/vscode-webview-elements/dist/vscode-table-cell.js'; import '@bendera/vscode-webview-elements/dist/vscode-collapsible.js'; import '@bendera/vscode-webview-elements/dist/vscode-label.js'; -import { I10nProvider } from '../dashboardWebView/providers/I10nProvider'; // import '@bendera/vscode-webview-elements/dist/vscode-checkbox.js'; // import '@vscode/webview-ui-toolkit/dist/esm/checkbox'; @@ -34,16 +33,10 @@ if (elm) { const version = elm?.getAttribute('data-version'); const environment = elm?.getAttribute('data-environment'); const isProd = elm?.getAttribute('data-isProd'); + const isCrashDisabled = elm?.getAttribute('data-is-crash-disabled'); - if (isProd === 'true') { - Sentry.init({ - dsn: SENTRY_LINK, - integrations: [new Integrations.BrowserTracing()], - tracesSampleRate: 0, // No performance tracing required - release: version || '', - environment: environment || '', - ignoreErrors: SentryIgnore - }); + if (isProd === 'true' && isCrashDisabled === 'false') { + Sentry.init(SentryInit(version, environment)); Sentry.setTag("type", "panel"); if (document.body.getAttribute(`data-vscode-theme-id`)) { diff --git a/src/utils/sentryInit.ts b/src/utils/sentryInit.ts new file mode 100644 index 00000000..3bb46180 --- /dev/null +++ b/src/utils/sentryInit.ts @@ -0,0 +1,21 @@ +import * as Sentry from '@sentry/react'; +import { Integrations } from '@sentry/tracing'; +import { SENTRY_LINK, SentryIgnore } from '../constants'; + +export const SentryInit = ( + version: string | null, + environment: string | null +): Sentry.BrowserOptions => ({ + dsn: SENTRY_LINK, + integrations: [new Integrations.BrowserTracing()], + tracesSampleRate: 0, // No performance tracing required + release: version || '', + environment: environment || '', + ignoreErrors: SentryIgnore, + beforeSend(event) { + if (event.user) { + delete event.user.ip_address; + } + return event; + } +});