diff --git a/lib/gui/app/modules/analytics.ts b/lib/gui/app/modules/analytics.ts index 58f4f880..5f3cc18c 100644 --- a/lib/gui/app/modules/analytics.ts +++ b/lib/gui/app/modules/analytics.ts @@ -21,6 +21,35 @@ import * as settings from '../models/settings'; import { store } from '../models/store'; import * as packageJSON from '../../../../package.json'; +const clearUserPath = (filename: string): string => { + const generatedFile = filename.split('generated').reverse()[0]; + return `generated${generatedFile}`; +}; + +export const anonymizeData = ( + event: SentryRenderer.Event, +): SentryRenderer.Event => { + event.exception?.values?.forEach((exception) => { + exception.stacktrace?.frames?.forEach((frame) => { + if (frame.filename) { + frame.filename = clearUserPath(frame.filename); + } + }); + }); + + event.breadcrumbs?.forEach((breadcrumb) => { + if (breadcrumb.data?.url) { + breadcrumb.data.url = clearUserPath(breadcrumb.data.url); + } + }); + + if (event.request?.url) { + event.request.url = clearUserPath(event.request.url); + } + + return event; +}; + let analyticsClient: Client; /** * @summary Init analytics configurations @@ -29,7 +58,7 @@ export const initAnalytics = _.once(() => { const dsn = settings.getSync('analyticsSentryToken') || _.get(packageJSON, ['analytics', 'sentry', 'token']); - SentryRenderer.init({ dsn }); + SentryRenderer.init({ dsn, beforeSend: anonymizeData }); const projectName = settings.getSync('analyticsAmplitudeToken') || diff --git a/lib/gui/etcher.ts b/lib/gui/etcher.ts index eeba9ae6..f7565875 100644 --- a/lib/gui/etcher.ts +++ b/lib/gui/etcher.ts @@ -32,6 +32,7 @@ import { buildWindowMenu } from './menu'; import * as i18n from 'i18next'; import * as SentryMain from '@sentry/electron/main'; import * as packageJSON from '../../package.json'; +import { anonymizeData } from './app/modules/analytics'; const customProtocol = 'etcher'; const scheme = `${customProtocol}://`; @@ -109,7 +110,7 @@ const initSentryMain = _.once(() => { settings.getSync('analyticsSentryToken') || _.get(packageJSON, ['analytics', 'sentry', 'token']); - SentryMain.init({ dsn }); + SentryMain.init({ dsn, beforeSend: anonymizeData }); }); const sourceSelectorReady = new Promise((resolve) => {