diff --git a/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js b/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js index 107e6cc042efbf07253583290833b49786303ca4..86d8ee475643fc9f91dacbb7cc11834e7a3e09ba 100644 --- a/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js +++ b/enterprise/frontend/src/metabase-enterprise/application_permissions/reducer.js @@ -1,6 +1,5 @@ import { assocIn } from "icepick"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createAction, createThunkAction, @@ -33,7 +32,6 @@ const UPDATE_APPLICATION_PERMISSION = export const updateApplicationPermission = createAction( UPDATE_APPLICATION_PERMISSION, ({ groupId, permission, value }) => { - MetabaseAnalytics.trackStructEvent("General Permissions", "save"); return { groupId, permission: permission.permission, @@ -47,8 +45,6 @@ const SAVE_APPLICATION_PERMISSIONS = export const saveApplicationPermissions = createThunkAction( SAVE_APPLICATION_PERMISSIONS, () => async (_dispatch, getState) => { - MetabaseAnalytics.trackStructEvent("General Permissions", "save"); - const { applicationPermissions, applicationPermissionsRevision } = getState().plugins.applicationPermissionsPlugin; diff --git a/enterprise/frontend/src/metabase-enterprise/auth/actions.ts b/enterprise/frontend/src/metabase-enterprise/auth/actions.ts index b225c0f2f09f2bec3d00e8162f2e076813a836f3..b489a08d139ddd39a9bbea63845cf773693deff3 100644 --- a/enterprise/frontend/src/metabase-enterprise/auth/actions.ts +++ b/enterprise/frontend/src/metabase-enterprise/auth/actions.ts @@ -4,7 +4,6 @@ import { redirect } from "metabase/lib/dom"; import { getSetting } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; -import { trackLoginSSO } from "./analytics"; import { getSSOUrl } from "./utils"; interface ThunkConfig { @@ -15,8 +14,6 @@ export const LOGIN_SSO = "metabase-enterprise/auth/LOGIN_SSO"; export const loginSSO = createAsyncThunk<void, string | undefined, ThunkConfig>( LOGIN_SSO, (redirectUrl: string | undefined, { getState }) => { - trackLoginSSO(); - const siteUrl = getSetting(getState(), "site-url"); const ssoUrl = getSSOUrl(siteUrl, redirectUrl); diff --git a/enterprise/frontend/src/metabase-enterprise/auth/analytics.ts b/enterprise/frontend/src/metabase-enterprise/auth/analytics.ts deleted file mode 100644 index a5c9df98fa5904b5f38d12ce6587c6a065864338..0000000000000000000000000000000000000000 --- a/enterprise/frontend/src/metabase-enterprise/auth/analytics.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { trackStructEvent } from "metabase/lib/analytics"; - -export const trackLoginSSO = () => { - trackStructEvent("Auth", "SSO Login Start"); -}; diff --git a/frontend/src/metabase/admin/databases/database.js b/frontend/src/metabase/admin/databases/database.js index f22051955f0ec5bcb6c7586ceacf9cc0b8066a6e..6fde6cf7a5d1a99c733fc30d38afb8e7abd2aa4d 100644 --- a/frontend/src/metabase/admin/databases/database.js +++ b/frontend/src/metabase/admin/databases/database.js @@ -6,7 +6,6 @@ import { updateSetting } from "metabase/admin/settings/settings"; import { getEngines } from "metabase/databases/selectors"; import { getDefaultEngineKey } from "metabase/databases/utils/engine"; import Databases from "metabase/entities/databases"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { combineReducers, createThunkAction, @@ -133,13 +132,12 @@ export const initializeDatabase = function (databaseId) { export const addSampleDatabase = createThunkAction( ADD_SAMPLE_DATABASE, - function (query) { - return async function (dispatch, getState) { + function () { + return async function (dispatch) { try { dispatch({ type: ADDING_SAMPLE_DATABASE }); const sampleDatabase = await MetabaseApi.db_add_sample_database(); dispatch(Databases.actions.invalidateLists()); - MetabaseAnalytics.trackStructEvent("Databases", "Add Sample Data"); return sampleDatabase; } catch (error) { console.error("error adding sample database", error); @@ -153,52 +151,32 @@ export const addSampleDatabase = createThunkAction( export const createDatabase = function (database) { editParamsForUserControlledScheduling(database); - return async function (dispatch, getState) { + return async function (dispatch) { try { dispatch({ type: CREATE_DATABASE_STARTED }); const action = await dispatch(Databases.actions.create(database)); const savedDatabase = Databases.HACK_getObjectFromAction(action); - MetabaseAnalytics.trackStructEvent( - "Databases", - "Create", - database.engine, - ); dispatch({ type: CREATE_DATABASE }); return savedDatabase; } catch (error) { console.error("error creating a database", error); - MetabaseAnalytics.trackStructEvent( - "Databases", - "Create Failed", - database.engine, - ); throw error; } }; }; export const updateDatabase = function (database) { - return async function (dispatch, getState) { + return async function (dispatch) { try { dispatch({ type: UPDATE_DATABASE_STARTED, payload: { database } }); const action = await dispatch(Databases.actions.update(database)); const savedDatabase = Databases.HACK_getObjectFromAction(action); - MetabaseAnalytics.trackStructEvent( - "Databases", - "Update", - database.engine, - ); dispatch({ type: UPDATE_DATABASE, payload: { database: savedDatabase } }); return savedDatabase; } catch (error) { - MetabaseAnalytics.trackStructEvent( - "Databases", - "Update Failed", - database.engine, - ); dispatch({ type: UPDATE_DATABASE_FAILED, payload: { error } }); throw error; } @@ -208,7 +186,7 @@ export const updateDatabase = function (database) { // NOTE Atte Keinänen 7/26/17: Original monolithic saveDatabase was broken out to smaller actions // but `saveDatabase` action creator is still left here for keeping the interface for React components unchanged export const saveDatabase = function (database) { - return async function (dispatch, getState) { + return async function (dispatch) { const isUnsavedDatabase = !database.id; if (isUnsavedDatabase) { return await dispatch(createDatabase(database)); @@ -218,17 +196,13 @@ export const saveDatabase = function (database) { }; }; -export const deleteDatabase = function (databaseId, isDetailView = true) { - return async function (dispatch, getState) { +export const deleteDatabase = function (databaseId) { + return async function (dispatch) { try { dispatch({ type: DELETE_DATABASE_STARTED, payload: databaseId }); await dispatch(Databases.actions.delete({ id: databaseId })); dispatch(push("/admin/databases/")); - MetabaseAnalytics.trackStructEvent( - "Databases", - "Delete", - isDetailView ? "Using Detail" : "Using List", - ); + dispatch({ type: DELETE_DATABASE, payload: { databaseId } }); } catch (error) { console.error("error deleting database", error); @@ -243,7 +217,7 @@ export const deleteDatabase = function (databaseId, isDetailView = true) { export const dismissSyncSpinner = createThunkAction( DISMISS_SYNC_SPINNER, function (databaseId) { - return async function (dispatch, getState) { + return async function () { try { await MetabaseApi.db_dismiss_sync_spinner({ dbId: databaseId }); } catch (error) { diff --git a/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx b/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx index 5375d23f76aeee1b238096e5863c9f15b41ca5cc..0aa869128a8447e899ab59a47a30a1e8da5fa4a5 100644 --- a/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx +++ b/frontend/src/metabase/admin/datamodel/components/FilterPopover/FilterOptions.jsx @@ -5,7 +5,6 @@ import { t, jt } from "ttag"; import CheckBox from "metabase/core/components/CheckBox"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { getFilterOptions, setFilterOptions, @@ -72,7 +71,7 @@ export default class FilterOptions extends Component { return false; } - setOptionValue(name, value) { + setOptionValue(name) { const { filter } = this.props; const options = getFilterOptions(filter); this.props.onFilterChange( @@ -81,12 +80,6 @@ export default class FilterOptions extends Component { [name]: !options[name], }), ); - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - "Filter", - "SetOption", - name, - ); } toggleOptionValue(name) { @@ -100,7 +93,7 @@ export default class FilterOptions extends Component { } return ( <div className={cx(CS.flex, CS.alignCenter)}> - {options.map(([name, option]) => ( + {options.map(([name]) => ( <div key={name} className={cx(CS.flex, CS.alignCenter)}> <CheckBox label={this.getOptionName(name)} diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx index ab1b3c3ec3fcdfc691499326a792d74ae2d86051..c47d80490de647c38a9e90296c4e4f2283bb529a 100644 --- a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx @@ -6,7 +6,6 @@ import { push } from "react-router-redux"; import { LeaveConfirmationModal } from "metabase/components/LeaveConfirmationModal"; import Segments from "metabase/entities/segments"; import { useCallbackEffect } from "metabase/hooks/use-callback-effect"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import SegmentForm from "../components/SegmentForm"; import { updatePreviewSummary } from "../datamodel"; @@ -38,7 +37,6 @@ const UpdateSegmentFormInner = ({ try { await updateSegment(segment); - MetabaseAnalytics.trackStructEvent("Data Model", "Segment Updated"); onChangeLocation("/admin/datamodel/segments"); } catch (error) { setIsDirty(isDirty); @@ -88,7 +86,6 @@ const CreateSegmentForm = ({ ...segment, table_id: segment.definition["source-table"], }); - MetabaseAnalytics.trackStructEvent("Data Model", "Segment Updated"); onChangeLocation("/admin/datamodel/segments"); } catch (error) { setIsDirty(isDirty); diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx index 14819c490048eddf06cff73d7adf895eafa8f752..9f48be86889ceb39b820576eb6c888cfb29b3737 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx @@ -10,7 +10,6 @@ import PopoverWithTrigger from "metabase/components/PopoverWithTrigger"; import Select from "metabase/core/components/Select"; import CS from "metabase/css/core/index.css"; import Fields from "metabase/entities/fields"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { getMetadataUnfiltered } from "metabase/selectors/metadata"; import { hasSourceField, @@ -125,11 +124,6 @@ class FieldRemappingSettings extends Component { this.clearEditingStates(); if (mappingType.type === "original") { - MetabaseAnalytics.trackStructEvent( - "Data Model", - "Change Remapping Type", - "No Remapping", - ); await deleteFieldDimension({ id: field.id }); this.setState({ hasChanged: false }); } else if (mappingType.type === "foreign") { @@ -137,11 +131,6 @@ class FieldRemappingSettings extends Component { const entityNameFieldId = this.getFKTargetTableEntityNameOrNull(); if (entityNameFieldId) { - MetabaseAnalytics.trackStructEvent( - "Data Model", - "Change Remapping Type", - "Foreign Key", - ); await updateFieldDimension( { id: field.id }, { @@ -158,11 +147,6 @@ class FieldRemappingSettings extends Component { }); } } else if (mappingType.type === "custom") { - MetabaseAnalytics.trackStructEvent( - "Data Model", - "Change Remapping Type", - "Custom Remappings", - ); await updateFieldDimension( { id: field.id }, { @@ -183,10 +167,6 @@ class FieldRemappingSettings extends Component { this.clearEditingStates(); if (hasSourceField(foreignKeyClause)) { - MetabaseAnalytics.trackStructEvent( - "Data Model", - "Update FK Remapping Target", - ); await updateFieldDimension( { id: field.id }, { @@ -378,10 +358,6 @@ class ValueRemappings extends Component { } onSaveClick = () => { - MetabaseAnalytics.trackStructEvent( - "Data Model", - "Update Custom Remappings", - ); // Returns the promise so that ButtonWithStatus can show the saving status return this.props.updateRemappings(this.state.editingRemappings); }; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx index 7f54cfcf65b08eb10c4a90054b0dee291f18c612..72317cea52e1dbbd6718a854c3829a5a58b4a3a6 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/SemanticTypeAndTargetPicker/SemanticTypeAndTargetPicker.tsx @@ -7,7 +7,6 @@ import type { SelectChangeEvent } from "metabase/core/components/Select"; import Select, { Option } from "metabase/core/components/Select"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; -import { trackStructEvent } from "metabase/lib/analytics"; import * as MetabaseCore from "metabase/lib/core"; import { getGlobalSettingsForColumn } from "metabase/visualizations/lib/settings/column"; import type Field from "metabase-lib/v1/metadata/Field"; @@ -73,8 +72,6 @@ const SemanticTypeAndTargetPicker = ({ } else { onUpdateField(field, { semantic_type: semanticType }); } - - trackStructEvent("Data Model", "Update Field Special-Type", semanticType); }, [field, onUpdateField], ); @@ -84,7 +81,6 @@ const SemanticTypeAndTargetPicker = ({ onUpdateField(field, { settings: { ...field.settings, currency }, }); - trackStructEvent("Data Model", "Update Currency Type", currency); }, [field, onUpdateField], ); @@ -92,7 +88,6 @@ const SemanticTypeAndTargetPicker = ({ const handleChangeTarget = useCallback( ({ target: { value: fk_target_field_id } }: SelectChangeEvent<FieldId>) => { onUpdateField(field, { fk_target_field_id }); - trackStructEvent("Data Model", "Update Field Target"); }, [field, onUpdateField], ); diff --git a/frontend/src/metabase/admin/people/components/GroupsListing.jsx b/frontend/src/metabase/admin/people/components/GroupsListing.jsx index b80c8a620d895fd77fabf10bef26b3288d59f5c8..535ddfb6b46e4c4fcb968222c286ef9c33263a61 100644 --- a/frontend/src/metabase/admin/people/components/GroupsListing.jsx +++ b/frontend/src/metabase/admin/people/components/GroupsListing.jsx @@ -18,7 +18,6 @@ import Link from "metabase/core/components/Link"; import AdminS from "metabase/css/admin.module.css"; import ButtonsS from "metabase/css/components/buttons.module.css"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { color } from "metabase/lib/colors"; import { isDefaultGroup, @@ -340,8 +339,6 @@ export default class GroupsListing extends Component { // TODO: move this to Redux async onAddGroupCreateButtonClicked() { - MetabaseAnalytics.trackStructEvent("People Groups", "Group Added"); - try { await this.props.create({ name: this.state.text.trim() }); this.setState({ @@ -401,7 +398,6 @@ export default class GroupsListing extends Component { this.setState({ groupBeingEdited: null }); } else { // ok, fire off API call to change the group - MetabaseAnalytics.trackStructEvent("People Groups", "Group Updated"); try { await this.props.update({ id: group.id, name: group.name.trim() }); this.setState({ groupBeingEdited: null }); @@ -416,7 +412,6 @@ export default class GroupsListing extends Component { // TODO: move this to Redux async onDeleteGroupClicked(group) { - MetabaseAnalytics.trackStructEvent("People Groups", "Group Deleted"); try { await this.props.delete(group); } catch (error) { diff --git a/frontend/src/metabase/admin/people/people.js b/frontend/src/metabase/admin/people/people.js index c324eaaffbb8bb023f23edc13f7860df2455a17e..33924177010bf3c622f3d5276af83d11d813806f 100644 --- a/frontend/src/metabase/admin/people/people.js +++ b/frontend/src/metabase/admin/people/people.js @@ -2,7 +2,6 @@ import { assoc, dissoc } from "icepick"; import _ from "underscore"; import Users from "metabase/entities/users"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createAction, createThunkAction, @@ -39,7 +38,7 @@ export const createMembership = createAction( user_id: userId, group_id: groupId, }); - MetabaseAnalytics.trackStructEvent("People Groups", "Membership Added"); + return { user_id: userId, group_id: groupId, @@ -53,7 +52,7 @@ export const deleteMembership = createThunkAction( const memberships = getMemberships(getState()); const membership = memberships[membershipId]; await PermissionsApi.deleteMembership({ id: membershipId }); - MetabaseAnalytics.trackStructEvent("People Groups", "Membership Deleted"); + return { membershipId, groupId: membership.group_id }; }, ); @@ -65,7 +64,7 @@ export const updateMembership = createAction( ...membership, id: membership.membership_id, }); - MetabaseAnalytics.trackStructEvent("People Groups", "Membership Updated"); + return membership; }, ); diff --git a/frontend/src/metabase/admin/permissions/analytics.ts b/frontend/src/metabase/admin/permissions/analytics.ts deleted file mode 100644 index 1da015b0a25632b90e938366050627eec8f7a957..0000000000000000000000000000000000000000 --- a/frontend/src/metabase/admin/permissions/analytics.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as MetabaseAnalytics from "metabase/lib/analytics"; - -import { DataPermission, type TableEntityId } from "./types"; - -const getEventPrefix = (permission: DataPermission) => { - const shouldUseBackwardCompatibleEventName = - permission === DataPermission.VIEW_DATA; - if (shouldUseBackwardCompatibleEventName) { - return ""; - } - - return `${permission}-`; -}; - -const getEventName = (entityId: Partial<TableEntityId>, isNative: boolean) => { - if (isNative) { - return "native"; - } - if (entityId.tableId != null) { - return "fields"; - } else if (entityId.schemaName != null) { - return "tables"; - } else { - return "schemas"; - } -}; - -export const trackPermissionChange = ( - entityId: Partial<TableEntityId>, - permission: DataPermission, - isNative: boolean, - value: string, -) => { - const prefix = getEventPrefix(permission); - const eventName = getEventName(entityId, isNative); - - MetabaseAnalytics.trackStructEvent( - "Permissions", - `${prefix}${eventName}`, - value, - ); -}; diff --git a/frontend/src/metabase/admin/permissions/permissions.js b/frontend/src/metabase/admin/permissions/permissions.js index 9b7f771368cb8a52b2184008feffd991879acb47..f1c7242580364e7dfd596761d4eb3d034265eb93 100644 --- a/frontend/src/metabase/admin/permissions/permissions.js +++ b/frontend/src/metabase/admin/permissions/permissions.js @@ -14,7 +14,6 @@ import { import { getGroupFocusPermissionsUrl } from "metabase/admin/permissions/utils/urls"; import Group from "metabase/entities/groups"; import Tables from "metabase/entities/tables"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createAction, createThunkAction, @@ -28,7 +27,6 @@ import { import { getMetadataWithHiddenTables } from "metabase/selectors/metadata"; import { CollectionsApi, PermissionsApi } from "metabase/services"; -import { trackPermissionChange } from "./analytics"; import { DataPermissionType, DataPermission } from "./types"; import { isDatabaseEntityId } from "./utils/data-entity-id"; import { @@ -117,7 +115,6 @@ export const limitDatabasePermission = createThunkAction( }, value: newValue, entityId, - skipTracking: true, }), ); } @@ -139,14 +136,7 @@ export const UPDATE_DATA_PERMISSION = "metabase/admin/permissions/UPDATE_DATA_PERMISSION"; export const updateDataPermission = createThunkAction( UPDATE_DATA_PERMISSION, - ({ - groupId, - permission: permissionInfo, - value, - entityId, - view, - skipTracking, - }) => { + ({ groupId, permission: permissionInfo, value, entityId, view }) => { return (dispatch, getState) => { if (isDatabaseEntityId(entityId)) { dispatch( @@ -173,15 +163,6 @@ export const updateDataPermission = createThunkAction( } } - if (!skipTracking) { - trackPermissionChange( - entityId, - permissionInfo.permission, - permissionInfo.type === DataPermissionType.NATIVE, - value, - ); - } - return { groupId, permissionInfo, value, metadata, entityId }; }; }, @@ -192,7 +173,6 @@ export const SAVE_DATA_PERMISSIONS = export const saveDataPermissions = createThunkAction( SAVE_DATA_PERMISSIONS, () => async (_dispatch, getState) => { - MetabaseAnalytics.trackStructEvent("Permissions", "save"); const state = getState(); const allGroupIds = Object.keys(state.entities.groups); const { @@ -239,8 +219,6 @@ const SAVE_COLLECTION_PERMISSIONS = export const saveCollectionPermissions = createThunkAction( SAVE_COLLECTION_PERMISSIONS, namespace => async (_dispatch, getState) => { - MetabaseAnalytics.trackStructEvent("Permissions", "save"); - const { originalCollectionPermissions, collectionPermissions, diff --git a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx index 10c062dbb0f039bd7d8a420a0883a071c6391194..b457c305b30d7481cb9bdfcc3dbe03696c5889b6 100644 --- a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx +++ b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx @@ -9,7 +9,6 @@ import { t } from "ttag"; import _ from "underscore"; import ErrorBoundary from "metabase/ErrorBoundary"; -import { prepareAnalyticsValue } from "metabase/admin/settings/utils"; import { UpsellSSO } from "metabase/admin/upsells"; import { AdminLayout } from "metabase/components/AdminLayout"; import { NotFound } from "metabase/components/ErrorPages"; @@ -17,7 +16,6 @@ import SaveStatus from "metabase/components/SaveStatus"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import title from "metabase/hoc/Title"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import MetabaseSettings from "metabase/lib/settings"; import { Box } from "metabase/ui"; @@ -141,16 +139,6 @@ class SettingsEditor extends Component { } else { this.saveStatusRef.current.setSaved(); } - - const value = prepareAnalyticsValue(setting); - - MetabaseAnalytics.trackStructEvent( - "General Settings", - setting.display_name || setting.key, - value, - // pass the actual value if it's a number - typeof value === "number" && value, - ); } catch (error) { console.error(error); const message = @@ -159,11 +147,6 @@ class SettingsEditor extends Component { if (options?.onError) { options.onError(error, message); } - MetabaseAnalytics.trackStructEvent( - "General Settings", - setting.display_name, - "error", - ); } }; diff --git a/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx b/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx index ef5258762e5b092b77f6406dbf708a8f21478522..a45c41eeb3789bd5b9b0dba674b09c0800e38330 100644 --- a/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx +++ b/frontend/src/metabase/admin/settings/components/Email/SMTPConnectionForm.tsx @@ -16,7 +16,6 @@ import { FormRadioGroup, FormSubmitButton, } from "metabase/forms"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { color } from "metabase/lib/colors"; import * as Errors from "metabase/lib/errors"; import { useDispatch, useSelector } from "metabase/lib/redux"; @@ -128,20 +127,10 @@ export const SMTPConnectionForm = ({ try { await dispatch(sendTestEmail()); setSendingEmail("success"); - MetabaseAnalytics.trackStructEvent( - "Email Settings", - "Test Email", - "success", - ); // show a confirmation for 3 seconds, then return to normal setTimeout(() => setSendingEmail("default"), 3000); } catch (error: any) { - MetabaseAnalytics.trackStructEvent( - "Email Settings", - "Test Email", - "error", - ); setSendingEmail("default"); setTestEmailError(error?.data?.message); } diff --git a/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx b/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx index 58e596d006901b5cd301a906def91a1e462bfe81..0345893b937b1f792f584010d76bc96fa1c35ec5 100644 --- a/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx +++ b/frontend/src/metabase/admin/settings/components/widgets/PublicLinksListing/PublicLinksListing.jsx @@ -10,7 +10,6 @@ import ExternalLink from "metabase/core/components/ExternalLink"; import Link from "metabase/core/components/Link"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import * as Urls from "metabase/lib/urls"; import { getSetting } from "metabase/selectors/settings"; import { ActionsApi, CardApi, DashboardApi } from "metabase/services"; @@ -52,10 +51,6 @@ class PublicLinksListing extends Component { } } - trackEvent(label) { - MetabaseAnalytics.trackStructEvent(`Admin ${this.props.type}`, label); - } - render() { const { getUrl, getPublicUrl, revoke, noLinksMessage } = this.props; let { list, error } = this.state; @@ -84,11 +79,7 @@ class PublicLinksListing extends Component { <tr key={link.id}> <td> {getUrl ? ( - <Link - to={getUrl(link)} - onClick={() => this.trackEvent("Entity Link Clicked")} - className={CS.textWrap} - > + <Link to={getUrl(link)} className={CS.textWrap}> {link.name} </Link> ) : ( diff --git a/frontend/src/metabase/admin/settings/utils.js b/frontend/src/metabase/admin/settings/utils.js index 6ebef8285f8f03731334d4408011ae39d91af890..3e1e79992a7b7f0f1f195e10f9f5460324571782 100644 --- a/frontend/src/metabase/admin/settings/utils.js +++ b/frontend/src/metabase/admin/settings/utils.js @@ -2,13 +2,6 @@ import { t } from "ttag"; import MetabaseSettings from "metabase/lib/settings"; -// in order to prevent collection of identifying information only fields -// that are explicitly marked as collectable or booleans should show the true value -export const prepareAnalyticsValue = setting => - setting.allowValueCollection || setting.type === "boolean" - ? setting.value - : "success"; - export const settingToFormField = setting => ({ name: setting.key, label: setting.display_name, diff --git a/frontend/src/metabase/admin/settings/utils.unit.spec.js b/frontend/src/metabase/admin/settings/utils.unit.spec.js deleted file mode 100644 index a5ca55b200e7150c15524d5bff6085674eb96446..0000000000000000000000000000000000000000 --- a/frontend/src/metabase/admin/settings/utils.unit.spec.js +++ /dev/null @@ -1,21 +0,0 @@ -import { prepareAnalyticsValue } from "metabase/admin/settings/utils"; - -describe("prepareAnalyticsValue", () => { - const defaultSetting = { value: 120, type: "number" }; - - it("should return a non identifying value by default", () => { - expect(prepareAnalyticsValue(defaultSetting)).toBe("success"); - }); - - it("should return the value of a setting marked collectable", () => { - expect( - prepareAnalyticsValue({ ...defaultSetting, allowValueCollection: true }), - ).toBe(defaultSetting.value); - }); - - it('should return the value of a setting with a type of "boolean" collectable', () => { - expect(prepareAnalyticsValue({ ...defaultSetting, type: "boolean" })).toBe( - defaultSetting.value, - ); - }); -}); diff --git a/frontend/src/metabase/auth/actions.ts b/frontend/src/metabase/auth/actions.ts index ee3dde0919d92422d3b3fafeba81b1846cf7ac21..1b00d93ca8d411211efa0d13cc5f10588eceeb72 100644 --- a/frontend/src/metabase/auth/actions.ts +++ b/frontend/src/metabase/auth/actions.ts @@ -15,12 +15,6 @@ import { getSetting } from "metabase/selectors/settings"; import { getUser } from "metabase/selectors/user"; import { SessionApi, UtilApi } from "metabase/services"; -import { - trackLogin, - trackLoginGoogle, - trackLogout, - trackPasswordReset, -} from "./analytics"; import type { LoginData } from "./types"; export const REFRESH_LOCALE = "metabase/user/REFRESH_LOCALE"; @@ -66,7 +60,6 @@ export const login = createAsyncThunk( try { await SessionApi.create(data); await dispatch(refreshSession()).unwrap(); - trackLogin(); if (!isSmallScreen()) { dispatch(openNavbar()); } @@ -88,7 +81,6 @@ export const loginGoogle = createAsyncThunk( try { await SessionApi.createWithGoogleAuth({ token: credential }); await dispatch(refreshSession()).unwrap(); - trackLoginGoogle(); if (!isSmallScreen()) { dispatch(openNavbar()); } @@ -114,7 +106,6 @@ export const logout = createAsyncThunk( dispatch(clearCurrentUser()); await dispatch(refreshLocale()).unwrap(); - trackLogout(); if (samlLogoutUrl) { window.location.href = samlLogoutUrl; @@ -123,7 +114,6 @@ export const logout = createAsyncThunk( await deleteSession(); dispatch(clearCurrentUser()); await dispatch(refreshLocale()).unwrap(); - trackLogout(); // We use old react-router-redux which references old redux, which does not require // action type to be a string - unlike RTK v2+ @@ -163,7 +153,6 @@ export const resetPassword = createAsyncThunk( try { await SessionApi.reset_password({ token, password }); await dispatch(refreshSession()).unwrap(); - trackPasswordReset(); } catch (error) { return rejectWithValue(error); } diff --git a/frontend/src/metabase/auth/analytics.ts b/frontend/src/metabase/auth/analytics.ts deleted file mode 100644 index a6614c50f0e49ae699b78c0a0dfb6da867f1dfe6..0000000000000000000000000000000000000000 --- a/frontend/src/metabase/auth/analytics.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { trackStructEvent } from "metabase/lib/analytics"; - -export const trackLogin = () => { - trackStructEvent("Auth", "Login"); -}; - -export const trackLoginGoogle = () => { - trackStructEvent("Auth", "Google Auth Login"); -}; - -export const trackLogout = () => { - trackStructEvent("Auth", "Logout"); -}; - -export const trackPasswordReset = () => { - trackStructEvent("Auth", "Password Reset"); -}; diff --git a/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts b/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts index e66af6c37a4433ff7689353d782ac7b096954be9..b85c8ce7f4c0069f4c32c22007e89edb279a2183 100644 --- a/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts +++ b/frontend/src/metabase/dashboard/actions/auto-wire-parameters/toasts.ts @@ -169,7 +169,7 @@ export const showAddedCardAutoWireParametersToast = export const closeAutoWireParameterToast = (toastId: string = AUTO_WIRE_TOAST_ID) => (dispatch: Dispatch) => { - dispatch(dismissUndo({ undoId: toastId, track: false })); + dispatch(dismissUndo({ undoId: toastId })); }; const autoWireToastTypes = ["filterAutoConnect", "filterAutoConnectDone"]; @@ -179,7 +179,7 @@ export const closeAddCardAutoWireToasts = for (const undo of undos) { if (undo.type && autoWireToastTypes.includes(undo.type)) { - dispatch(dismissUndo({ undoId: undo.id, track: false })); + dispatch(dismissUndo({ undoId: undo.id })); } } }; diff --git a/frontend/src/metabase/dashboard/actions/parameters.ts b/frontend/src/metabase/dashboard/actions/parameters.ts index 75c0cfffff9e979045be1a927204e11687bbbf58..700d6abd644ffb9feb2aa8817a148b209da9389c 100644 --- a/frontend/src/metabase/dashboard/actions/parameters.ts +++ b/frontend/src/metabase/dashboard/actions/parameters.ts @@ -740,7 +740,7 @@ export const closeAutoApplyFiltersToast = createThunkAction( () => (dispatch, getState) => { const toastId = getAutoApplyFiltersToastId(getState()); if (toastId) { - dispatch(dismissUndo({ undoId: toastId, track: false })); + dispatch(dismissUndo({ undoId: toastId })); } }, ); diff --git a/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx b/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx index bbd141e2fc4ba061192023665b9db30bd2441c20..217fbcd434fb897851d1371bba032dd28a058583 100644 --- a/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx +++ b/frontend/src/metabase/dashboard/components/AddSeriesModal/AddSeriesModal.tsx @@ -5,7 +5,6 @@ import { t } from "ttag"; import ButtonsS from "metabase/css/components/buttons.module.css"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { color } from "metabase/lib/colors"; import Visualization from "metabase/visualizations/components/Visualization"; import type { @@ -70,7 +69,6 @@ export class AddSeriesModal extends Component<Props, State> { series: this.state.series.filter(c => c.id !== card.id), }); - MetabaseAnalytics.trackStructEvent("Dashboard", "Remove Series"); return; } @@ -86,12 +84,6 @@ export class AddSeriesModal extends Component<Props, State> { isLoading: false, series: this.state.series.concat(card), }); - - MetabaseAnalytics.trackStructEvent( - "Dashboard", - "Add Series", - card.display + ", success", - ); }; handleRemoveSeries = (_event: MouseEvent, removedIndex: number) => { @@ -109,7 +101,6 @@ export class AddSeriesModal extends Component<Props, State> { ...this.state.series.slice(actualRemovedIndex + 1), ], }); - MetabaseAnalytics.trackStructEvent("Dashboard", "Remove Series"); }; handleDone = () => { @@ -118,11 +109,6 @@ export class AddSeriesModal extends Component<Props, State> { attributes: { series: this.state.series }, }); this.props.onClose(); - MetabaseAnalytics.trackStructEvent( - "Dashboard", - "Edit Series Modal", - "done", - ); }; render() { diff --git a/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx b/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx index 681d2d97fda78a3c7eaf65aaf59b5d06a9764bc7..3457b05394f14e71002de848d511dfc7faf0d3e2 100644 --- a/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx +++ b/frontend/src/metabase/dashboard/components/AddSeriesModal/QuestionList.tsx @@ -6,7 +6,6 @@ import { t } from "ttag"; import EmptyState from "metabase/components/EmptyState"; import CS from "metabase/css/core/index.css"; import { useDebouncedValue } from "metabase/hooks/use-debounced-value"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { SEARCH_DEBOUNCE_DURATION } from "metabase/lib/constants"; import { CardApi } from "metabase/services"; import type { @@ -93,14 +92,6 @@ export const QuestionList = memo(function QuestionList({ loadCards(debouncedSearchText, lastCard?.id); }, [cards, debouncedSearchText, loadCards]); - const handleSearchFocus = () => { - MetabaseAnalytics.trackStructEvent( - "Dashboard", - "Edit Series Modal", - "search", - ); - }; - const hasQuestionsToShow = cards.length > 0; return ( @@ -111,7 +102,6 @@ export const QuestionList = memo(function QuestionList({ value={searchText} leftIcon="search" placeholder={t`Search for a question`} - onFocus={handleSearchFocus} onChange={e => setSearchText(e.target.value)} /> </SearchContainer> diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx index 5886b774aa25ab1dffb56a8d98df3f3807a06f5f..2efef4eb0a9d9cc7b4602a0dd981ed542443697a 100644 --- a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx +++ b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx @@ -22,7 +22,6 @@ import { isQuestionDashCard, getVisibleCardIds, } from "metabase/dashboard/utils"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { GRID_WIDTH, GRID_ASPECT_RATIO, @@ -285,7 +284,6 @@ class DashboardGrid extends Component<DashboardGridProps, DashboardGridState> { if (changes.length > 0) { setMultipleDashCardAttributes({ dashcards: changes }); - MetabaseAnalytics.trackStructEvent("Dashboard", "Layout Changed"); } }; @@ -480,7 +478,6 @@ class DashboardGrid extends Component<DashboardGridProps, DashboardGridState> { action: () => this.props.undoRemoveCardFromDashboard({ dashcardId: dc.id }), }); - MetabaseAnalytics.trackStructEvent("Dashboard", "Remove Card"); }; onDashCardAddSeries = (dc: BaseDashboardCard) => { diff --git a/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx b/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx index cd4c19eba8a16a68f83cb73bb32d652edb9eaf7c..7297d6b9d15d285d7642ff100d10ab0076f5e5b4 100644 --- a/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx +++ b/frontend/src/metabase/dashboard/components/DashboardSidebars.tsx @@ -7,7 +7,6 @@ import { getEditingParameter, getParameters, } from "metabase/dashboard/selectors"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { useSelector } from "metabase/lib/redux"; import { ParameterSidebar } from "metabase/parameters/components/ParameterSidebar"; import { hasMapping } from "metabase/parameters/utils/dashboards"; @@ -126,7 +125,6 @@ export function DashboardSidebars({ cardId: cardId, tabId: selectedTabId, }); - MetabaseAnalytics.trackStructEvent("Dashboard", "Add Card"); }, [addCardToDashboard, dashboard.id, selectedTabId], ); diff --git a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx index 02459c67fd1cbe4fc5930207cb29459bf3286d75..2a9b8ee6122f2778d6d2224ad0bc5b2db9a405d0 100644 --- a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx +++ b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx @@ -20,7 +20,6 @@ import Collections from "metabase/entities/collections"; import Dashboards from "metabase/entities/dashboards"; import title from "metabase/hoc/Title"; import withToast from "metabase/hoc/Toast"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { color } from "metabase/lib/colors"; import * as Urls from "metabase/lib/urls"; import { ParametersList } from "metabase/parameters/components/ParametersList"; @@ -91,7 +90,6 @@ class AutomaticDashboardAppInner extends Component { ); this.setState({ savedDashboardId: newDashboard.id }); - MetabaseAnalytics.trackStructEvent("AutoDashboard", "Save"); }; UNSAFE_componentWillReceiveProps(nextProps) { @@ -189,16 +187,7 @@ class AutomaticDashboardAppInner extends Component { </div> {more && ( <div className={cx(CS.flex, CS.justifyEnd, CS.px4, CS.pb4)}> - <Link - to={more} - className={CS.ml2} - onClick={() => - MetabaseAnalytics.trackStructEvent( - "AutoDashboard", - "ClickMore", - ) - } - > + <Link to={more} className={CS.ml2}> <Button iconRight="chevronright">{t`Show more about this`}</Button> </Link> </div> diff --git a/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts b/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts index 961dfd51ac9b374704199b17d598966fd9170abb..17a34ddeac1e0d5e5306b1d050ff9d644a72f7cb 100644 --- a/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts +++ b/frontend/src/metabase/dashboard/hooks/use-dashboard-refresh-period.ts @@ -1,8 +1,6 @@ import { useCallback, useRef, useState } from "react"; import { useUnmount } from "react-use"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; - import type { DashboardRefreshPeriodControls } from "../types"; import { useInterval } from "./use-interval"; @@ -43,14 +41,13 @@ export const useDashboardRefreshPeriod = ({ setPeriod(newPeriod); elapsedHook.current?.(0); start(); - MetabaseAnalytics.trackStructEvent("Dashboard", "Set Refresh", period); } else { elapsed.current = 0; setPeriod(null); elapsedHook.current?.(null); } }, - [period, start, stop], + [start, stop], ); useUnmount(() => { diff --git a/frontend/src/metabase/entities/dashboards.js b/frontend/src/metabase/entities/dashboards.js index 7a26a497039041c670e19acc3be8ffc28f550991..6bc1e14f43b595e7de1d71c140a94d4762f06c85 100644 --- a/frontend/src/metabase/entities/dashboards.js +++ b/frontend/src/metabase/entities/dashboards.js @@ -18,7 +18,6 @@ import { import { compose, withAction, - withAnalytics, withNormalize, withRequestState, } from "metabase/lib/redux"; @@ -129,7 +128,6 @@ const Dashboards = createEntity({ dashboard.id, "copy", ]), - withAnalytics("entities", "dashboard", "copy"), )( (entityObject, overrides, { notify } = {}) => async (dispatch, getState) => { diff --git a/frontend/src/metabase/entities/users.js b/frontend/src/metabase/entities/users.js index e34ee73f01dc0efd588bd9ffba3bb5600c5cadc9..ebdf7c5e1903be2aa5b7d406107a31d365eb076a 100644 --- a/frontend/src/metabase/entities/users.js +++ b/frontend/src/metabase/entities/users.js @@ -1,7 +1,6 @@ import { assocIn } from "icepick"; import { userApi, sessionApi } from "metabase/api"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createEntity, entityCompatibleQuery } from "metabase/lib/entities"; import { generatePassword } from "metabase/lib/security"; import MetabaseSettings from "metabase/lib/settings"; @@ -105,10 +104,6 @@ const Users = createEntity({ resetPasswordEmail: ({ email }) => async dispatch => { - MetabaseAnalytics.trackStructEvent( - "People Admin", - "Trigger User Password Reset", - ); await entityCompatibleQuery( email, dispatch, @@ -119,10 +114,6 @@ const Users = createEntity({ resetPasswordManual: async ({ id }, password = generatePassword()) => async dispatch => { - MetabaseAnalytics.trackStructEvent( - "People Admin", - "Manual Password Reset", - ); await entityCompatibleQuery( { id, password }, dispatch, @@ -133,8 +124,6 @@ const Users = createEntity({ deactivate: ({ id }) => async dispatch => { - MetabaseAnalytics.trackStructEvent("People Admin", "User Removed"); - await entityCompatibleQuery( id, dispatch, @@ -145,8 +134,6 @@ const Users = createEntity({ reactivate: ({ id }) => async dispatch => { - MetabaseAnalytics.trackStructEvent("People Admin", "User Reactivated"); - const user = await entityCompatibleQuery( id, dispatch, diff --git a/frontend/src/metabase/lib/analytics.js b/frontend/src/metabase/lib/analytics.js index 035bd2d01c2551a5f8fe45a3cc0510a38cd49c68..c281abcec820e6f7d4278812679a951c8e1480f4 100644 --- a/frontend/src/metabase/lib/analytics.js +++ b/frontend/src/metabase/lib/analytics.js @@ -7,8 +7,6 @@ import { getUserId } from "metabase/selectors/user"; export const createTracker = store => { if (Settings.snowplowEnabled()) { createSnowplowTracker(store); - - document.body.addEventListener("click", handleStructEventClick, true); } }; @@ -22,15 +20,6 @@ export const trackPageView = url => { } }; -/** - * @deprecated This uses GA which is not setup. We should use `trackSchemaEvent`. - */ -export const trackStructEvent = (category, action, label, value) => { - if (!category || !label || !Settings.trackingEnabled()) { - return; - } -}; - export const trackSchemaEvent = (schema, version, data) => { if (shouldLogAnalytics) { const { event, ...other } = data; @@ -109,19 +98,6 @@ const trackSnowplowSchemaEvent = (schema, version, data) => { }); }; -const handleStructEventClick = event => { - if (!Settings.trackingEnabled()) { - return; - } - - for (let node = event.target; node != null; node = node.parentNode) { - if (node.dataset && node.dataset.metabaseEvent) { - const parts = node.dataset.metabaseEvent.split(";").map(p => p.trim()); - trackStructEvent(...parts); - } - } -}; - const getSanitizedUrl = url => { const urlWithoutSlug = url.replace(/(\/\d+)-[^\/]+$/, (match, path) => path); const urlWithoutHost = new URL(urlWithoutSlug, Settings.snowplowUrl()); diff --git a/frontend/src/metabase/lib/entities.js b/frontend/src/metabase/lib/entities.js index f827d8889285c77f4402138f7d37735fc42a323f..8efdf0e196c6ec301bebe83fd79b961e494bad5c 100644 --- a/frontend/src/metabase/lib/entities.js +++ b/frontend/src/metabase/lib/entities.js @@ -81,7 +81,6 @@ import { handleEntities, compose, withAction, - withAnalytics, withRequestState, withCachedDataAndRequestState, } from "metabase/lib/redux"; @@ -195,16 +194,6 @@ export function createEntity(def) { ]); } - // same as withRequestState, but with category/label - function withEntityAnalytics(action) { - return withAnalytics( - "entities", - entity.name, - action, - entity.getAnalyticsMetadata, - ); - } - function withEntityActionDecorators(action) { return entity.actionDecorators[action] || (_ => _); } @@ -230,7 +219,6 @@ export function createEntity(def) { create: compose( withAction(CREATE_ACTION), - withEntityAnalytics("create"), withEntityRequestState(() => ["create"]), withEntityActionDecorators("create"), )(entityObject => async (dispatch, getState) => { @@ -245,7 +233,6 @@ export function createEntity(def) { update: compose( withAction(UPDATE_ACTION), - withEntityAnalytics("update"), withEntityRequestState(object => [object.id, "update"]), withEntityActionDecorators("update"), )( @@ -301,7 +288,6 @@ export function createEntity(def) { delete: compose( withAction(DELETE_ACTION), - withEntityAnalytics("delete"), withEntityRequestState(object => [object.id, "delete"]), withEntityActionDecorators("delete"), )(entityObject => async (dispatch, getState) => { diff --git a/frontend/src/metabase/lib/performance.js b/frontend/src/metabase/lib/performance.js deleted file mode 100644 index 88766fad52898b66d731969ebd25c3e60be0c6a0..0000000000000000000000000000000000000000 --- a/frontend/src/metabase/lib/performance.js +++ /dev/null @@ -1,14 +0,0 @@ -// startTimer starts a timer and returns a callback function. -// Example usage: -// const t = startTimer() -// await vSlow() -// t(duration => console.log(`That took ${duration}ms!`)) -// The function passed to `t` won't get called if `performance` isn't available. -export function startTimer() { - if (typeof performance !== "object") { - // if the current environment doesn't have performance return a no-op function - return () => {}; - } - const start = performance.now(); - return f => f(performance.now() - start); -} diff --git a/frontend/src/metabase/lib/redux/utils.js b/frontend/src/metabase/lib/redux/utils.js index cff5748732eeb0cf047d063feee10caf1078b191..8a987275cb227be87f33a554adc70da6c8d1e011 100644 --- a/frontend/src/metabase/lib/redux/utils.js +++ b/frontend/src/metabase/lib/redux/utils.js @@ -4,7 +4,6 @@ import moment from "moment-timezone"; // eslint-disable-line no-restricted-impor import { normalize } from "normalizr"; import _ from "underscore"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { delay } from "metabase/lib/promise"; import { setRequestLoading, @@ -336,31 +335,6 @@ function withCachedData( }; } -export function withAnalytics(categoryOrFn, actionOrFn, labelOrFn, valueOrFn) { - // thunk decorator: - return thunkCreator => - // thunk creator: - (...args) => - // thunk: - (dispatch, getState) => { - function get(valueOrFn, extra = {}) { - if (typeof valueOrFn === "function") { - return valueOrFn(args, { ...extra }, getState); - } - } - try { - const category = get(categoryOrFn); - const action = get(actionOrFn, { category }); - const label = get(labelOrFn, { category, action }); - const value = get(valueOrFn, { category, action, label }); - MetabaseAnalytics.trackStructEvent(category, action, label, value); - } catch (error) { - console.warn("withAnalytics threw an error:", error); - } - return thunkCreator(...args)(dispatch, getState); - }; -} - export function withNormalize(schema) { return thunkCreator => (...args) => diff --git a/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx b/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx index 885ca3d1b42a3655e48dd80f362eb634eab8bcc1..2a43e46f212ce2ac89abd236db1813996b279e63 100644 --- a/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx +++ b/frontend/src/metabase/public/components/EmbedModal/EmbedModal.tsx @@ -2,7 +2,6 @@ import { useState } from "react"; import { t } from "ttag"; import Modal from "metabase/components/Modal"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { useSelector } from "metabase/lib/redux"; import type { EmbedModalStep } from "metabase/public/lib/types"; import { getSetting } from "metabase/selectors/settings"; @@ -46,7 +45,6 @@ export const EmbedModal = ({ children, isOpen, onClose }: EmbedModalProps) => { }; const onEmbedClose = () => { - MetabaseAnalytics.trackStructEvent("Sharing Modal", "Modal Closed"); onClose(); setEmbedType(null); }; diff --git a/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx b/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx index 53dcfc176275abbf5af713ee84ef85f6c791a899..1535ecaedaf14deda5a5d2c815b97cc6660e8736 100644 --- a/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx +++ b/frontend/src/metabase/public/components/EmbedModal/SelectEmbedTypePane/SelectEmbedTypePane.tsx @@ -5,7 +5,6 @@ import { t } from "ttag"; import Link from "metabase/core/components/Link"; import { PublicLinkCopyPanel } from "metabase/dashboard/components/PublicLinkPopover/PublicLinkCopyPanel"; import type { ExportFormatType } from "metabase/dashboard/components/PublicLinkPopover/types"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { useSelector } from "metabase/lib/redux"; import { trackPublicEmbedCodeCopied, @@ -53,11 +52,6 @@ export function SelectEmbedTypePane({ e.stopPropagation(); if (!isLoadingLink && !hasPublicLink) { setIsLoadingLink(true); - MetabaseAnalytics.trackStructEvent( - "Sharing Modal", - "Public Link Enabled", - resourceType, - ); await onCreatePublicLink(); setIsLoadingLink(false); } @@ -67,11 +61,6 @@ export function SelectEmbedTypePane({ e.stopPropagation(); if (!isLoadingLink && hasPublicLink) { setIsLoadingLink(true); - MetabaseAnalytics.trackStructEvent( - "Sharing Modal", - "Public Link Disabled", - resourceType, - ); trackPublicLinkRemoved({ artifact: resourceType, diff --git a/frontend/src/metabase/pulse/components/PulseEditChannels.tsx b/frontend/src/metabase/pulse/components/PulseEditChannels.tsx index ba53c924720812fb34404f1c3b3e683ea60b47a3..dd6e9f1cf90f46dd7d6ff0b2525a39b06327ee60 100644 --- a/frontend/src/metabase/pulse/components/PulseEditChannels.tsx +++ b/frontend/src/metabase/pulse/components/PulseEditChannels.tsx @@ -7,7 +7,6 @@ import _ from "underscore"; import ChannelSetupMessage from "metabase/components/ChannelSetupMessage"; import Toggle from "metabase/core/components/Toggle"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createChannel } from "metabase/lib/pulse"; import SlackChannelField from "metabase/sharing/components/SlackChannelField"; import { Icon, type IconName } from "metabase/ui"; @@ -43,7 +42,6 @@ interface PulseEditChannelsProps { export const PulseEditChannels = ({ pulse, - pulseId, formInput, user, users, @@ -60,12 +58,6 @@ export const PulseEditChannels = ({ const channel = createChannel(channelSpec); setPulse({ ...pulse, channels: pulse.channels.concat(channel) }); - - MetabaseAnalytics.trackStructEvent( - pulseId ? "PulseEdit" : "PulseCreate", - "AddChannel", - type, - ); }; const onChannelPropertyChange = (index: number, name: string, value: any) => { @@ -114,12 +106,6 @@ export const PulseEditChannels = ({ ); setPulse(updatedPulse); - - MetabaseAnalytics.trackStructEvent( - pulseId ? "PulseEdit" : "PulseCreate", - "RemoveChannel", - type, - ); } }; diff --git a/frontend/src/metabase/query_builder/actions/core/core.js b/frontend/src/metabase/query_builder/actions/core/core.js index 8294ca46eca419b0d6ab289bae3c91118461c81c..9234c97c1fdb2bf4ad8f55b8b276e96d0b20c038 100644 --- a/frontend/src/metabase/query_builder/actions/core/core.js +++ b/frontend/src/metabase/query_builder/actions/core/core.js @@ -6,7 +6,6 @@ import Databases from "metabase/entities/databases"; import { updateModelIndexes } from "metabase/entities/model-indexes/actions"; import Questions from "metabase/entities/questions"; import Revision from "metabase/entities/revisions"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { loadCard } from "metabase/lib/card"; import { shouldOpenInBlankWindow } from "metabase/lib/dom"; import { createThunkAction } from "metabase/lib/redux"; @@ -207,11 +206,6 @@ export const apiCreateQuestion = question => { dispatch({ type: Databases.actionTypes.INVALIDATE_LISTS_ACTION }); } - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - "Create Card", - createdQuestion.datasetQuery().type, - ); trackNewQuestionSaved( question, createdQuestion, @@ -268,12 +262,6 @@ export const apiUpdateQuestion = (question, { rerunQuery } = {}) => { // (some of the old alerts might be removed during update) await dispatch(fetchAlertsForQuestion(updatedQuestion.id())); - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - "Update Card", - updatedQuestion.datasetQuery().type, - ); - await dispatch({ type: API_UPDATE_QUESTION, payload: updatedQuestion.card(), diff --git a/frontend/src/metabase/query_builder/actions/core/initializeQB.ts b/frontend/src/metabase/query_builder/actions/core/initializeQB.ts index a1c26c03a54de986f424f272e91f0a9fc858198e..94030b1b7194aa3e20e3bb8e42f4348471e8baa6 100644 --- a/frontend/src/metabase/query_builder/actions/core/initializeQB.ts +++ b/frontend/src/metabase/query_builder/actions/core/initializeQB.ts @@ -4,7 +4,6 @@ import querystring from "querystring"; import { fetchAlertsForQuestion } from "metabase/alert/alert"; import Questions from "metabase/entities/questions"; import Snippets from "metabase/entities/snippets"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { deserializeCardFromUrl, loadCard } from "metabase/lib/card"; import { isNotNull } from "metabase/lib/types"; import * as Urls from "metabase/lib/urls"; @@ -302,12 +301,6 @@ async function handleQBInit( }); } - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - hasCard ? "Query Loaded" : "Query Started", - card.dataset_query.type, - ); - if (isSavedCard(card)) { dispatch(fetchAlertsForQuestion(card.id)); } @@ -328,7 +321,6 @@ async function handleQBInit( if (currentUser?.is_qbnewb) { uiControls.isShowingNewbModal = true; - MetabaseAnalytics.trackStructEvent("QueryBuilder", "Show Newb Modal"); } } diff --git a/frontend/src/metabase/query_builder/actions/native.ts b/frontend/src/metabase/query_builder/actions/native.ts index bb4beafa3b2da3ec307f9428b0122a50e486019b..385b352f3a766787a1c8e5c4ab0316c81473adbc 100644 --- a/frontend/src/metabase/query_builder/actions/native.ts +++ b/frontend/src/metabase/query_builder/actions/native.ts @@ -1,7 +1,6 @@ import { createAction } from "redux-actions"; import Questions from "metabase/entities/questions"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createThunkAction } from "metabase/lib/redux"; import { updateUserSetting } from "metabase/redux/settings"; import { getMetadata } from "metabase/selectors/metadata"; @@ -27,9 +26,7 @@ import { updateQuestion } from "./core"; import { SET_UI_CONTROLS } from "./ui"; export const TOGGLE_DATA_REFERENCE = "metabase/qb/TOGGLE_DATA_REFERENCE"; -export const toggleDataReference = createAction(TOGGLE_DATA_REFERENCE, () => { - MetabaseAnalytics.trackStructEvent("QueryBuilder", "Toggle Data Reference"); -}); +export const toggleDataReference = createAction(TOGGLE_DATA_REFERENCE); export const SET_DATA_REFERENCE_STACK = "metabase/qb/SET_DATA_REFERENCE_STACK"; export const setDataReferenceStack = createAction(SET_DATA_REFERENCE_STACK); @@ -80,12 +77,6 @@ export const TOGGLE_TEMPLATE_TAGS_EDITOR = "metabase/qb/TOGGLE_TEMPLATE_TAGS_EDITOR"; export const toggleTemplateTagsEditor = createAction( TOGGLE_TEMPLATE_TAGS_EDITOR, - () => { - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - "Toggle Template Tags Editor", - ); - }, ); export const SET_IS_SHOWING_TEMPLATE_TAGS_EDITOR = @@ -98,9 +89,7 @@ export const setIsShowingTemplateTagsEditor = ( }); export const TOGGLE_SNIPPET_SIDEBAR = "metabase/qb/TOGGLE_SNIPPET_SIDEBAR"; -export const toggleSnippetSidebar = createAction(TOGGLE_SNIPPET_SIDEBAR, () => { - MetabaseAnalytics.trackStructEvent("QueryBuilder", "Toggle Snippet Sidebar"); -}); +export const toggleSnippetSidebar = createAction(TOGGLE_SNIPPET_SIDEBAR); export const SET_IS_SHOWING_SNIPPET_SIDEBAR = "metabase/qb/SET_IS_SHOWING_SNIPPET_SIDEBAR"; diff --git a/frontend/src/metabase/query_builder/actions/querying.js b/frontend/src/metabase/query_builder/actions/querying.js index 07b84396774ede35851eab8d2d4176c8063e19a6..8159ba8477526dc50a2ae31abb9f19ccb755b393 100644 --- a/frontend/src/metabase/query_builder/actions/querying.js +++ b/frontend/src/metabase/query_builder/actions/querying.js @@ -1,8 +1,6 @@ import { createAction } from "redux-actions"; import { t } from "ttag"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; -import { startTimer } from "metabase/lib/performance"; import { defer } from "metabase/lib/promise"; import { createThunkAction } from "metabase/lib/redux"; import { syncVizSettingsWithSeries } from "metabase/querying"; @@ -127,22 +125,12 @@ export const runQuestionQuery = ({ const startTime = new Date(); const cancelQueryDeferred = defer(); - const queryTimer = startTimer(); - apiRunQuestionQuery(question, { cancelDeferred: cancelQueryDeferred, ignoreCache: ignoreCache, isDirty: isQueryDirty, }) .then(queryResults => { - queryTimer(duration => - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - "Run Query", - question.datasetQuery().type, - duration, - ), - ); return dispatch(queryCompleted(question, queryResults)); }) .catch(error => dispatch(queryErrored(startTime, error))); diff --git a/frontend/src/metabase/query_builder/actions/ui.ts b/frontend/src/metabase/query_builder/actions/ui.ts index 7a7d3089ce3892e068551e5adb0854a83602f360..966e1ace09ebc65ec43fa7485bb4debaf61dd52e 100644 --- a/frontend/src/metabase/query_builder/actions/ui.ts +++ b/frontend/src/metabase/query_builder/actions/ui.ts @@ -1,6 +1,5 @@ import { createAction } from "redux-actions"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createThunkAction } from "metabase/lib/redux"; import { checkNotNull } from "metabase/lib/types"; import { updateUserSetting } from "metabase/redux/settings"; @@ -77,7 +76,6 @@ export const closeQbNewbModal = createThunkAction(CLOSE_QB_NEWB_MODAL, () => { // persist the fact that this user has seen the NewbModal const { currentUser } = getState(); await UserApi.update_qbnewb({ id: checkNotNull(currentUser).id }); - MetabaseAnalytics.trackStructEvent("QueryBuilder", "Close Newb Modal"); }; }); diff --git a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx index 17852293707386d2bb8d6c7b22d4194d61538550..d0ff379b91a1557c65c0da31e805ca92bbf562aa 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx @@ -43,7 +43,6 @@ class AlertEditChannelsInner extends Component { <div className={CS.mb2}> <PulseEditChannels pulse={alert} - pulseId={alert.id} formInput={formInput} user={user} users={users} diff --git a/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx b/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx index cab62ebfe1b290b20a26f03dae11071528d55d15..bfbab0afcb72f7f6b5abef7a594022ed4b2c26dd 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals/CreateAlertModalContent.jsx @@ -11,7 +11,6 @@ import ModalContent from "metabase/components/ModalContent"; import Button from "metabase/core/components/Button"; import CS from "metabase/css/core/index.css"; import { alertIsValid } from "metabase/lib/alert"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import MetabaseCookies from "metabase/lib/cookies"; import { fetchPulseFormInput } from "metabase/pulse/actions"; import { @@ -74,11 +73,6 @@ class CreateAlertModalContentInner extends Component { await updateUrl(question, { dirty: false }); onAlertCreated(); - MetabaseAnalytics.trackStructEvent( - "Alert", - "Create", - alert.alert_condition, - ); }; proceedFromEducationalScreen = () => { diff --git a/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx b/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx index 4883516575b894af77f17817b1a41b3d7b0dd783..2763dbb0d2dca2bcd2360a32af0f38f3144ca88e 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals/UpdateAlertModalContent.jsx @@ -10,7 +10,6 @@ import ModalContent from "metabase/components/ModalContent"; import Button from "metabase/core/components/Button"; import CS from "metabase/css/core/index.css"; import { alertIsValid } from "metabase/lib/alert"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { updateUrl } from "metabase/query_builder/actions"; import { getQuestion, @@ -40,12 +39,6 @@ class UpdateAlertModalContentInner extends Component { await updateAlert(modifiedAlert); await updateUrl(question, { dirty: false }); onAlertUpdated(); - - MetabaseAnalytics.trackStructEvent( - "Alert", - "Update", - modifiedAlert.alert_condition, - ); }; onDeleteAlert = async () => { diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx index e386c1838bc636207faee01c2f4ef15c8616d455..f8aa223fc2da09186a980b1e9fd3ae47b77e6acf 100644 --- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx +++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorSidebar.tsx @@ -5,7 +5,6 @@ import _ from "underscore"; import ButtonsS from "metabase/css/components/buttons.module.css"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import type { EmbeddingParameterVisibility } from "metabase/public/lib/types"; import SidebarContent from "metabase/query_builder/components/SidebarContent"; import type Question from "metabase-lib/v1/Question"; @@ -56,11 +55,6 @@ export class TagEditorSidebar extends Component<TagEditorSidebarProps> { setSection(section: "settings" | "help") { this.setState({ section }); - MetabaseAnalytics.trackStructEvent( - "QueryBuilder", - "Template Tag Editor Section Change", - section, - ); } render() { diff --git a/frontend/src/metabase/redux/undo.ts b/frontend/src/metabase/redux/undo.ts index 2b7c7f64a619c0302dbe39d5ec4c26b666130cf9..f3c677354939dc609fed46a16b9293fb05a2629d 100644 --- a/frontend/src/metabase/redux/undo.ts +++ b/frontend/src/metabase/redux/undo.ts @@ -2,7 +2,6 @@ import { createSelector } from "@reduxjs/toolkit"; import type { Action } from "redux-actions"; import _ from "underscore"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { createAction, createThunkAction } from "metabase/lib/redux"; import type { State } from "metabase-types/store"; import type { Undo } from "metabase-types/store/undo"; @@ -28,7 +27,7 @@ export const addUndo = createThunkAction(ADD_UNDO, undo => { let timeoutId = null; if (timeout) { timeoutId = setTimeout( - () => dispatch(dismissUndo({ undoId: id, track: false })), + () => dispatch(dismissUndo({ undoId: id })), timeout, ); } @@ -59,7 +58,7 @@ export const resumeUndo = createThunkAction(RESUME_UNDO, undo => { return { ...undo, timeoutId: setTimeout( - () => dispatch(dismissUndo({ undoId: undo.id, track: false })), + () => dispatch(dismissUndo({ undoId: undo.id })), restTime, ), timeout: restTime, @@ -101,10 +100,7 @@ export const getIsRecentlyAutoConnectedDashcard = createSelector( export const dismissUndo = createAction( DISMISS_UNDO, - ({ undoId, track = true }: { undoId: Undo["id"]; track?: boolean }) => { - if (track) { - MetabaseAnalytics.trackStructEvent("Undo", "Dismiss Undo"); - } + ({ undoId }: { undoId: Undo["id"] }) => { return undoId; }, ); @@ -114,12 +110,9 @@ export const dismissAllUndo = createAction(DISMISS_ALL_UNDO); export const performUndo = createThunkAction(PERFORM_UNDO, undoId => { return (dispatch, getState) => { const undo = getUndo(getState(), undoId); - if (!undo?.actionLabel) { - MetabaseAnalytics.trackStructEvent("Undo", "Perform Undo"); - } if (undo) { undo.actions?.forEach(action => dispatch(action)); - dispatch(dismissUndo({ undoId, track: false })); + dispatch(dismissUndo({ undoId })); } }; }); diff --git a/frontend/src/metabase/reference/reference.js b/frontend/src/metabase/reference/reference.js index dabf0be9c5ae495d88eccc892ad9db9362fbaf19..5a5b1801958d92a96cb75682015a32d67c844814 100644 --- a/frontend/src/metabase/reference/reference.js +++ b/frontend/src/metabase/reference/reference.js @@ -1,6 +1,5 @@ import { assoc } from "icepick"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { handleActions, createAction } from "metabase/lib/redux"; import { filterUntouchedFields, isEmptyObject } from "./utils.js"; @@ -24,13 +23,9 @@ export const startLoading = createAction(START_LOADING); export const endLoading = createAction(END_LOADING); -export const startEditing = createAction(START_EDITING, () => { - MetabaseAnalytics.trackStructEvent("Data Reference", "Started Editing"); -}); +export const startEditing = createAction(START_EDITING); -export const endEditing = createAction(END_EDITING, () => { - MetabaseAnalytics.trackStructEvent("Data Reference", "Ended Editing"); -}); +export const endEditing = createAction(END_EDITING); export const expandFormula = createAction(EXPAND_FORMULA); diff --git a/frontend/src/metabase/visualizations/components/CardRenderer.jsx b/frontend/src/metabase/visualizations/components/CardRenderer.jsx index b4dfb8d1658e2e1b4e365db3d16aaddc2b9550af..fa0067f4da0fc2dd623975ddd902ecb0c4e8e097 100644 --- a/frontend/src/metabase/visualizations/components/CardRenderer.jsx +++ b/frontend/src/metabase/visualizations/components/CardRenderer.jsx @@ -2,20 +2,10 @@ import PropTypes from "prop-types"; import { Component } from "react"; import ReactDOM from "react-dom"; -import _ from "underscore"; import ExplicitSize from "metabase/components/ExplicitSize"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; -import { startTimer } from "metabase/lib/performance"; import { isSameSeries } from "metabase/visualizations/lib/utils"; -// We track this as part of the render loop. -// It's throttled to prevent pounding GA on every prop update. -const trackEventThrottled = _.throttle( - MetabaseAnalytics.trackStructEvent, - 10000, -); - class CardRenderer extends Component { static propTypes = { className: PropTypes.string, @@ -76,12 +66,7 @@ class CardRenderer extends Component { parent.appendChild(element); try { - const t = startTimer(); this._deregister = this.props.renderer(element, this.props); - t(duration => { - const { display } = this.props.card; - trackEventThrottled("Visualization", "Render Card", display, duration); - }); } catch (err) { console.error(err); this.props.onRenderError(err.message || err); diff --git a/frontend/src/metabase/visualizations/components/ChartSettings.jsx b/frontend/src/metabase/visualizations/components/ChartSettings.jsx index 404f0d67910918126ccce1af1086708186fa6d1e..23adb03d5f8ccc7b1482cc563bce485c674e8504 100644 --- a/frontend/src/metabase/visualizations/components/ChartSettings.jsx +++ b/frontend/src/metabase/visualizations/components/ChartSettings.jsx @@ -8,7 +8,6 @@ import _ from "underscore"; import Button from "metabase/core/components/Button"; import Radio from "metabase/core/components/Radio"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { getVisualizationTransformed, extractRemappings, @@ -115,8 +114,6 @@ class ChartSettings extends Component { }; handleResetSettings = () => { - MetabaseAnalytics.trackStructEvent("Chart Settings", "Reset Settings"); - const originalCardSettings = this.props.dashcard.card.visualization_settings; const clickBehaviorSettings = getClickBehaviorSettings(this._getSettings()); diff --git a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx index 57452152ca0a00a729d91851bfe5f951a6fb5680..0224a9c9ddf021d10639aef1214e118b4a84286c 100644 --- a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx +++ b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx @@ -2,7 +2,6 @@ import { Component } from "react"; import { connect } from "react-redux"; import type * as tippy from "tippy.js"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { getEventTarget } from "metabase/lib/dom"; import { performAction } from "metabase/visualizations/lib/action"; import type { @@ -11,16 +10,12 @@ import type { PopoverClickAction, OnChangeCardAndRun, } from "metabase/visualizations/types"; -import { - isPopoverClickAction, - isRegularClickAction, -} from "metabase/visualizations/types"; +import { isPopoverClickAction } from "metabase/visualizations/types"; import type { Series } from "metabase-types/api"; import type { Dispatch } from "metabase-types/store"; import { FlexTippyPopover } from "./ClickActionsPopover.styled"; import { ClickActionsView } from "./ClickActionsView"; -import { getGALabelForAction } from "./utils"; interface ChartClickActionsProps { clicked: ClickObject; @@ -56,11 +51,6 @@ export class ClickActionsPopover extends Component< handleClickAction = (action: RegularClickAction) => { const { dispatch, onChangeCardAndRun } = this.props; if (isPopoverClickAction(action)) { - MetabaseAnalytics.trackStructEvent( - "Actions", - "Open Click Action Popover", - getGALabelForAction(action), - ); this.setState({ popoverAction: action }); } else { const didPerform = performAction(action, { @@ -68,14 +58,6 @@ export class ClickActionsPopover extends Component< onChangeCardAndRun, }); if (didPerform) { - if (isRegularClickAction(action)) { - MetabaseAnalytics.trackStructEvent( - "Actions", - "Executed Click Action", - getGALabelForAction(action), - ); - } - this.close(); } else { console.warn("No action performed", action); @@ -121,21 +103,9 @@ export class ClickActionsPopover extends Component< this.instance?.popperInstance?.update(); }} onChangeCardAndRun={({ nextCard }) => { - if (popoverAction) { - MetabaseAnalytics.trackStructEvent( - "Action", - "Executed Click Action", - getGALabelForAction(popoverAction), - ); - } onChangeCardAndRun({ nextCard }); }} onClose={() => { - MetabaseAnalytics.trackStructEvent( - "Action", - "Dismissed Click Action Menu", - getGALabelForAction(popoverAction), - ); this.close(); }} series={series} @@ -154,10 +124,6 @@ export class ClickActionsPopover extends Component< this.instance = instance; }} onClose={() => { - MetabaseAnalytics.trackStructEvent( - "Action", - "Dismissed Click Action Menu", - ); this.close(); }} placement="bottom-start" diff --git a/frontend/src/metabase/visualizations/components/ClickActions/utils.ts b/frontend/src/metabase/visualizations/components/ClickActions/utils.ts index 88aa29ed03f63d8690807e74bf89c203bc2fc461..c5d259ae3054e9c3588a4ec051386ca079509590 100644 --- a/frontend/src/metabase/visualizations/components/ClickActions/utils.ts +++ b/frontend/src/metabase/visualizations/components/ClickActions/utils.ts @@ -62,9 +62,6 @@ export const getGroupedAndSortedActions = ( .value(); }; -export const getGALabelForAction = (action: RegularClickAction) => - action ? `${action.section || ""}:${action.name || ""}` : null; - export const getSectionTitle = ( sectionKey: string, actions: RegularClickAction[], diff --git a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx index bd42c69d3d916c4a64e314ae3d7836990d8c5a60..39c34c1fd9b87e1ebddd1139bcf5d047d78a8150 100644 --- a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx +++ b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx @@ -10,7 +10,6 @@ import { SmallGenericError } from "metabase/components/ErrorPages"; import ExplicitSize from "metabase/components/ExplicitSize"; import CS from "metabase/css/core/index.css"; import DashboardS from "metabase/css/dashboard.module.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { formatNumber } from "metabase/lib/formatting"; import { equals } from "metabase/lib/utils"; import { getIsShowingRawTable } from "metabase/query_builder/selectors"; @@ -260,16 +259,6 @@ class Visualization extends PureComponent { handleVisualizationClick = clicked => { const { handleVisualizationClick } = this.props; - if (clicked) { - MetabaseAnalytics.trackStructEvent( - "Actions", - "Clicked", - `${clicked.column ? "column" : ""} ${clicked.value ? "value" : ""} ${ - clicked.dimensions ? "dimensions=" + clicked.dimensions.length : "" - }`, - ); - } - if (typeof handleVisualizationClick === "function") { handleVisualizationClick(clicked); return; diff --git a/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx b/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx index 2cc35cd68565af7eff0745fb48b1cd6b5f0ced85..f818565b9f8c9daec2c6f71f2918eaf8be49b093 100644 --- a/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx +++ b/frontend/src/metabase/visualizations/components/settings/ChartSettingsTableFormatting.jsx @@ -17,7 +17,6 @@ import Select, { Option } from "metabase/core/components/Select"; import { Sortable, SortableList } from "metabase/core/components/Sortable"; import Toggle from "metabase/core/components/Toggle"; import CS from "metabase/css/core/index.css"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { getAccentColors, getStatusColorRanges, @@ -156,19 +155,9 @@ export const ChartSettingsTableFormatting = props => { }} onRemove={index => { onChange([...value.slice(0, index), ...value.slice(index + 1)]); - MetabaseAnalytics.trackStructEvent( - "Chart Settings", - "Table Formatting", - "Remove Rule", - ); }} onMove={(from, to) => { onChange(arrayMove(value, from, to)); - MetabaseAnalytics.trackStructEvent( - "Chart Settings", - "Table Formatting", - "Move Rule", - ); }} /> ); @@ -493,12 +482,6 @@ const RuleEditor = ({ <ColorRangeSelector value={rule.colors} onChange={colors => { - MetabaseAnalytics.trackStructEvent( - "Chart Settings", - "Table Formatting", - "Select Range Colors", - colors, - ); onChange({ ...rule, colors }); }} colors={COLORS} diff --git a/frontend/src/metabase/visualizations/lib/settings.js b/frontend/src/metabase/visualizations/lib/settings.js index 8ab062bfdc72c5cc6ef91767c127bb7f46d91a11..2371154e313bdf644484cee02535f7e6574c0f76 100644 --- a/frontend/src/metabase/visualizations/lib/settings.js +++ b/frontend/src/metabase/visualizations/lib/settings.js @@ -1,7 +1,6 @@ import { getIn } from "icepick"; import _ from "underscore"; -import * as MetabaseAnalytics from "metabase/lib/analytics"; import { ChartSettingColorPicker } from "metabase/visualizations/components/settings/ChartSettingColorPicker"; import ChartSettingColorsPicker from "metabase/visualizations/components/settings/ChartSettingColorsPicker"; import ChartSettingFieldPicker from "metabase/visualizations/components/settings/ChartSettingFieldPicker"; @@ -207,9 +206,6 @@ export function getPersistableDefaultSettings(settingsDefs, completeSettings) { } export function updateSettings(storedSettings, changedSettings) { - for (const key of Object.keys(changedSettings)) { - MetabaseAnalytics.trackStructEvent("Chart Settings", "Change Setting", key); - } const newSettings = { ...storedSettings, ...changedSettings, diff --git a/src/metabase/server/middleware/security.clj b/src/metabase/server/middleware/security.clj index 5cd1a59cf15cf7de2ede0da3e04ed6735ddce63a..9bf3250517c158e62ad96eab451cbc05d5522b80 100644 --- a/src/metabase/server/middleware/security.clj +++ b/src/metabase/server/middleware/security.clj @@ -101,9 +101,6 @@ "https://accounts.google.com" ;; MailChimp. So people can sign up for the Metabase mailing list in the sign up process "metabase.us10.list-manage.com" - ;; Google analytics - (when (public-settings/anon-tracking-enabled) - "www.google-analytics.com") ;; Snowplow analytics (when (public-settings/anon-tracking-enabled) (snowplow/snowplow-url))