From 01e1312cfb35c6a0daa4fbb5a44a37bbb474ff9f Mon Sep 17 00:00:00 2001 From: Amir Allayarov Date: Sat, 21 May 2022 15:39:38 +0400 Subject: [PATCH] #RI-916-add telemetry events --- .../components/range-filter/RangeFilter.tsx | 12 +++--- .../components/hash-details/HashDetails.tsx | 17 +++++++- .../add-hash-fields/AddHashFields.tsx | 25 +++++++++++- .../add-list-elements/AddListElements.tsx | 25 +++++++++++- .../add-set-members/AddSetMembers.tsx | 25 +++++++++++- .../add-stream-entity/AddStreamEntries.tsx | 26 ++++++++++-- .../RemoveListElements.tsx | 18 ++++++++- .../components/set-details/SetDetails.tsx | 17 +++++++- .../StreamDetails/StreamDetails.tsx | 40 +++++++++++++++---- .../stream-details/StreamDetailsWrapper.tsx | 17 +++++++- .../components/zset-details/ZSetDetails.tsx | 17 +++++++- redisinsight/ui/src/slices/browser/hash.ts | 27 +------------ redisinsight/ui/src/slices/browser/list.ts | 24 ----------- redisinsight/ui/src/slices/browser/set.ts | 27 +------------ redisinsight/ui/src/slices/browser/stream.ts | 3 +- redisinsight/ui/src/slices/browser/zset.ts | 15 +------ redisinsight/ui/src/telemetry/events.ts | 3 ++ .../ui/src/telemetry/telemetryUtils.ts | 6 +++ 18 files changed, 228 insertions(+), 116 deletions(-) diff --git a/redisinsight/ui/src/components/range-filter/RangeFilter.tsx b/redisinsight/ui/src/components/range-filter/RangeFilter.tsx index 0cdebd9298..2d988f1072 100644 --- a/redisinsight/ui/src/components/range-filter/RangeFilter.tsx +++ b/redisinsight/ui/src/components/range-filter/RangeFilter.tsx @@ -12,8 +12,8 @@ export interface Props { min: number start: number end: number - handleChangeStart: (value: number) => void - handleChangeEnd: (value: number) => void + handleChangeStart: (value: number, shouldSentEventTelemetry: boolean) => void + handleChangeEnd: (value: number, shouldSentEventTelemetry: boolean) => void handleResetFilter: () => void } @@ -51,14 +51,14 @@ const RangeFilter = (props: Props) => { const onMouseUpStart = useCallback( ({ target: { value } }) => { - handleChangeStart(value) + handleChangeStart(value, true) }, [] ) const onMouseUpEnd = useCallback( ({ target: { value } }) => { - handleChangeEnd(value) + handleChangeEnd(value, true) }, [] ) @@ -103,10 +103,10 @@ const RangeFilter = (props: Props) => { useEffect(() => { if (max && prevValue && prevValue.max !== max && end === prevValue.max) { - handleChangeEnd(max) + handleChangeEnd(max, false) } if (min && prevValue && prevValue.min !== min && start === prevValue.min) { - handleChangeStart(min) + handleChangeStart(min, false) } }, [prevValue]) diff --git a/redisinsight/ui/src/pages/browser/components/hash-details/HashDetails.tsx b/redisinsight/ui/src/pages/browser/components/hash-details/HashDetails.tsx index b557a6e6b5..b0b0913b5e 100644 --- a/redisinsight/ui/src/pages/browser/components/hash-details/HashDetails.tsx +++ b/redisinsight/ui/src/pages/browser/components/hash-details/HashDetails.tsx @@ -81,8 +81,23 @@ const HashDetails = (props: Props) => { setDeleting(`${field + suffix}`) }, []) + const onSuccessRemoved = () => { + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.Hash, + numberOfRemoved: 1, + } + }) + } + const handleDeleteField = (field = '') => { - dispatch(deleteHashFields(key, [field])) + dispatch(deleteHashFields(key, [field], onSuccessRemoved)) closePopover() } diff --git a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-hash-fields/AddHashFields.tsx b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-hash-fields/AddHashFields.tsx index 6cd6e41244..bc36a614b8 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-hash-fields/AddHashFields.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-hash-fields/AddHashFields.tsx @@ -10,13 +10,16 @@ import { EuiFieldText, EuiPanel, } from '@elastic/eui' -import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys' +import { selectedKeyDataSelector, keysSelector } from 'uiSrc/slices/browser/keys' +import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { updateHashValueStateSelector, resetUpdateValue, addHashFieldsAction, } from 'uiSrc/slices/browser/hash' import { AddFieldsToHashDto } from 'apiSrc/modules/browser/dto/hash.dto' +import { KeyTypes } from 'uiSrc/constants' +import { getBasedOnViewTypeEvent, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import AddItemsActions from 'uiSrc/pages/browser/components/add-items-actions/AddItemsActions' import styles from '../styles.module.scss' @@ -43,6 +46,8 @@ const AddHashFields = (props: Props) => { const [fields, setFields] = useState([{ ...INITIAL_HASH_FIELD_STATE }]) const { loading } = useSelector(updateHashValueStateSelector) const { name: selectedKey = '' } = useSelector(selectedKeyDataSelector) ?? { name: undefined } + const { viewType } = useSelector(keysSelector) + const { id: instanceId } = useSelector(connectedInstanceSelector) const lastAddedFieldName = useRef(null) useEffect(() => @@ -84,6 +89,22 @@ const AddHashFields = (props: Props) => { setFields(newState) } + const onSuccessAdded = () => { + onCancel() + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_ADDED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.Hash, + numberOfAdded: fields.length, + } + }) + } + const handleFieldChange = (formField: string, id: number, value: any) => { const newState = fields.map((item) => { if (item.id === id) { @@ -105,7 +126,7 @@ const AddHashFields = (props: Props) => { value: item.fieldValue, })), } - dispatch(addHashFieldsAction(data, onCancel)) + dispatch(addHashFieldsAction(data, onSuccessAdded)) } const isClearDisabled = (item: IHashFieldState): boolean => diff --git a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-list-elements/AddListElements.tsx b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-list-elements/AddListElements.tsx index f6e1c41f67..79a49ead64 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-list-elements/AddListElements.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-list-elements/AddListElements.tsx @@ -13,8 +13,11 @@ import { EuiSuperSelectOption, } from '@elastic/eui' -import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys' +import { selectedKeyDataSelector, keysSelector } from 'uiSrc/slices/browser/keys' +import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { insertListElementsAction } from 'uiSrc/slices/browser/list' +import { getBasedOnViewTypeEvent, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' +import { KeyTypes } from 'uiSrc/constants' import { PushElementToListDto } from 'apiSrc/modules/browser/dto' import { AddListFormConfig as config } from '../../add-key/constants/fields-config' @@ -50,6 +53,8 @@ const AddListElements = (props: Props) => { const [element, setElement] = useState('') const [destination, setDestination] = useState(TAIL_DESTINATION) const { name: selectedKey = '' } = useSelector(selectedKeyDataSelector) ?? { name: undefined } + const { viewType } = useSelector(keysSelector) + const { id: instanceId } = useSelector(connectedInstanceSelector) const elementInput = useRef(null) @@ -60,13 +65,29 @@ const AddListElements = (props: Props) => { elementInput.current?.focus() }, []) + const onSuccessAdded = () => { + onCancel() + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_ADDED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.List, + numberOfAdded: 1, + } + }) + } + const submitData = (): void => { const data: PushElementToListDto = { keyName: selectedKey, element, destination, } - dispatch(insertListElementsAction(data, props.onCancel)) + dispatch(insertListElementsAction(data, onSuccessAdded)) } return ( diff --git a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-set-members/AddSetMembers.tsx b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-set-members/AddSetMembers.tsx index 8d142111ab..32e12920d7 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-set-members/AddSetMembers.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-set-members/AddSetMembers.tsx @@ -11,8 +11,11 @@ import { EuiPanel, } from '@elastic/eui' -import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys' +import { selectedKeyDataSelector, keysSelector } from 'uiSrc/slices/browser/keys' import { addSetMembersAction, setSelector } from 'uiSrc/slices/browser/set' +import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' +import { KeyTypes } from 'uiSrc/constants' +import { getBasedOnViewTypeEvent, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import AddItemsActions from '../../add-items-actions/AddItemsActions' import { AddZsetFormConfig as config } from '../../add-key/constants/fields-config' @@ -39,12 +42,30 @@ const AddSetMembers = (props: Props) => { const [members, setMembers] = useState([{ ...INITIAL_SET_MEMBER_STATE }]) const { loading } = useSelector(setSelector) const { name: selectedKey = '' } = useSelector(selectedKeyDataSelector) ?? { name: undefined } + const { viewType } = useSelector(keysSelector) + const { id: instanceId } = useSelector(connectedInstanceSelector) const lastAddedMemberName = useRef(null) useEffect(() => { lastAddedMemberName.current?.focus() }, [members.length]) + const onSuccessAdded = () => { + onCancel() + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_ADDED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.Set, + numberOfAdded: members.length, + } + }) + } + const addMember = () => { const lastField = members[members.length - 1] const newState = [ @@ -90,7 +111,7 @@ const AddSetMembers = (props: Props) => { keyName: selectedKey, members: members.map((item) => item.name), } - dispatch(addSetMembersAction(data, onCancel)) + dispatch(addSetMembersAction(data, onSuccessAdded)) } const isClearDisabled = (item: ISetMemberState): boolean => members.length === 1 && !item.name.length diff --git a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-stream-entity/AddStreamEntries.tsx b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-stream-entity/AddStreamEntries.tsx index 9ee7a0ab15..6cf4488aa0 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-stream-entity/AddStreamEntries.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details-add-items/add-stream-entity/AddStreamEntries.tsx @@ -4,12 +4,14 @@ import { keyBy, mapValues, toNumber } from 'lodash' import React, { useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { entryIdRegex } from 'uiSrc/utils' -import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys' +import { selectedKeyDataSelector, keysSelector } from 'uiSrc/slices/browser/keys' import { addNewEntriesAction, streamDataSelector } from 'uiSrc/slices/browser/stream' - +import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import { AddStreamFormConfig as config } from 'uiSrc/pages/browser/components/add-key/constants/fields-config' import { INITIAL_STREAM_FIELD_STATE } from 'uiSrc/pages/browser/components/add-key/AddKeyStream/AddKeyStream' import { StreamEntryFields } from 'uiSrc/pages/browser/components/key-details-add-items' +import { KeyTypes } from 'uiSrc/constants' +import { getBasedOnViewTypeEvent, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { AddStreamEntriesDto } from 'apiSrc/modules/browser/dto/stream.dto' import styles from './styles.module.scss' @@ -22,6 +24,8 @@ const AddStreamEntries = (props: Props) => { const { onCancel } = props const { lastEntry } = useSelector(streamDataSelector) const { name: keyName = '' } = useSelector(selectedKeyDataSelector) ?? { name: undefined } + const { viewType } = useSelector(keysSelector) + const { id: instanceId } = useSelector(connectedInstanceSelector) const [entryID, setEntryID] = useState('*') const [entryIdError, setEntryIdError] = useState('') @@ -70,6 +74,22 @@ const AddStreamEntries = (props: Props) => { setEntryIdError('Must be greater than the last ID') } + const onSuccessAdded = () => { + onCancel() + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_ADDED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.Stream, + numberOfAdded: fields.length, + } + }) + } + const submitData = (): void => { if (isFormValid) { const data: AddStreamEntriesDto = { @@ -79,7 +99,7 @@ const AddStreamEntries = (props: Props) => { fields: mapValues(keyBy(fields, 'fieldName'), 'fieldValue') }] } - dispatch(addNewEntriesAction(data, onCancel)) + dispatch(addNewEntriesAction(data, onSuccessAdded)) } } diff --git a/redisinsight/ui/src/pages/browser/components/key-details-remove-items/remove-list-elements/RemoveListElements.tsx b/redisinsight/ui/src/pages/browser/components/key-details-remove-items/remove-list-elements/RemoveListElements.tsx index 8e6356b20a..08e8cc7263 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details-remove-items/remove-list-elements/RemoveListElements.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details-remove-items/remove-list-elements/RemoveListElements.tsx @@ -119,6 +119,22 @@ const RemoveListElements = (props: Props) => { setIsPopoverOpen(false) } + const onSuccessRemoved = () => { + onCancel() + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.List, + numberOfRemoved: toNumber(count), + } + }) + } + const submitData = (): void => { const data: DeleteListElementsDto = { keyName: selectedKey, @@ -126,7 +142,7 @@ const RemoveListElements = (props: Props) => { destination, } closePopover() - dispatch(deleteListElementsAction(data, props.onCancel)) + dispatch(deleteListElementsAction(data, onSuccessRemoved)) } const RemoveButton = () => ( diff --git a/redisinsight/ui/src/pages/browser/components/set-details/SetDetails.tsx b/redisinsight/ui/src/pages/browser/components/set-details/SetDetails.tsx index 5209e684cd..806ace7a1f 100644 --- a/redisinsight/ui/src/pages/browser/components/set-details/SetDetails.tsx +++ b/redisinsight/ui/src/pages/browser/components/set-details/SetDetails.tsx @@ -60,8 +60,23 @@ const SetDetails = (props: Props) => { setDeleting(`${member + suffix}`) } + const onSuccessRemoved = () => { + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.Set, + numberOfRemoved: 1, + } + }) + } + const handleDeleteMember = (member = '') => { - dispatch(deleteSetMembers(key, [member])) + dispatch(deleteSetMembers(key, [member], onSuccessRemoved)) closePopover() } diff --git a/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetails/StreamDetails.tsx b/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetails/StreamDetails.tsx index 74eba341e6..1a46cb8472 100644 --- a/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetails/StreamDetails.tsx +++ b/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetails/StreamDetails.tsx @@ -20,7 +20,9 @@ import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys' import { SCAN_COUNT_DEFAULT } from 'uiSrc/constants/api' import { SortOrder } from 'uiSrc/constants' import { getTimestampFromId } from 'uiSrc/utils/streamUtils' -import { StreamEntryDto } from 'apiSrc/modules/browser/dto/stream.dto' +import { StreamEntryDto, GetStreamEntriesResponse } from 'apiSrc/modules/browser/dto/stream.dto' +import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' +import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' import styles from './styles.module.scss' @@ -67,6 +69,7 @@ const StreamDetails = (props: Props) => { lastEntry, } = useSelector(streamDataSelector) const { name: key } = useSelector(selectedKeyDataSelector) ?? { name: '' } + const { id: instanceId } = useSelector(connectedInstanceSelector) const shouldFilterRender = !isNull(firstEntry) && (firstEntry.id !== '') && !isNull(lastEntry) && lastEntry.id !== '' @@ -102,12 +105,33 @@ const StreamDetails = (props: Props) => { } } - const loadEntries = () => { + const filterTelementry = (data: GetStreamEntriesResponse) => { + sendEventTelemetry({ + event: TelemetryEvent.STREAM_DATA_FILTERED, + eventData: { + databaseId: instanceId, + total: data.total, + } + }) + } + + const resetFilterTelementry = (data: GetStreamEntriesResponse) => { + sendEventTelemetry({ + event: TelemetryEvent.STREAM_DATA_FILTER_RESET, + eventData: { + databaseId: instanceId, + total: data.total, + } + }) + } + + const loadEntries = (telemetryAction?: (data: GetStreamEntriesResponse) => void) => { dispatch(fetchStreamEntries( key, SCAN_COUNT_DEFAULT, sortedColumnOrder, - false + false, + telemetryAction )) } @@ -119,17 +143,17 @@ const StreamDetails = (props: Props) => { } const handleChangeStartFilter = useCallback( - (value: number) => { + (value: number, shouldSentEventTelemetry: boolean) => { dispatch(updateStart(value.toString())) - loadEntries() + loadEntries(shouldSentEventTelemetry ? filterTelementry : undefined) }, [] ) const handleChangeEndFilter = useCallback( - (value: number) => { + (value: number, shouldSentEventTelemetry: boolean) => { dispatch(updateEnd(value.toString())) - loadEntries() + loadEntries(shouldSentEventTelemetry ? filterTelementry : undefined) }, [] ) @@ -144,7 +168,7 @@ const StreamDetails = (props: Props) => { () => { dispatch(updateStart(firstEntryTimeStamp.toString())) dispatch(updateEnd(lastEntryTimeStamp.toString())) - loadEntries() + loadEntries(resetFilterTelementry) }, [lastEntryTimeStamp, firstEntryTimeStamp] ) diff --git a/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetailsWrapper.tsx b/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetailsWrapper.tsx index 5bcb736f20..1d25b5fec8 100644 --- a/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetailsWrapper.tsx +++ b/redisinsight/ui/src/pages/browser/components/stream-details/StreamDetailsWrapper.tsx @@ -72,8 +72,23 @@ const StreamDetailsWrapper = (props: Props) => { setDeleting(`${entry + suffix}`) }, []) + const onSuccessRemoved = () => { + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.Stream, + numberOfRemoved: 1, + } + }) + } + const handleDeleteEntry = (entryId = '') => { - dispatch(deleteStreamEntry(key, [entryId])) + dispatch(deleteStreamEntry(key, [entryId], onSuccessRemoved)) closePopover() } diff --git a/redisinsight/ui/src/pages/browser/components/zset-details/ZSetDetails.tsx b/redisinsight/ui/src/pages/browser/components/zset-details/ZSetDetails.tsx index a20b6fdc38..6c2c9b21bc 100644 --- a/redisinsight/ui/src/pages/browser/components/zset-details/ZSetDetails.tsx +++ b/redisinsight/ui/src/pages/browser/components/zset-details/ZSetDetails.tsx @@ -74,8 +74,23 @@ const ZSetDetails = (props: Props) => { setDeleting(`${member + suffix}`) }, []) + const onSuccessRemoved = () => { + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, + TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED + ), + eventData: { + databaseId: instanceId, + keyType: KeyTypes.ZSet, + numberOfRemoved: 1, + } + }) + } + const handleDeleteMember = (member = '') => { - dispatch(deleteZSetMembers(key, [member])) + dispatch(deleteZSetMembers(key, [member], onSuccessRemoved)) closePopover() } diff --git a/redisinsight/ui/src/slices/browser/hash.ts b/redisinsight/ui/src/slices/browser/hash.ts index 0cb09ddb87..3f767acd87 100644 --- a/redisinsight/ui/src/slices/browser/hash.ts +++ b/redisinsight/ui/src/slices/browser/hash.ts @@ -295,7 +295,7 @@ export function fetchMoreHashFields( } // Asynchronous thunk actions -export function deleteHashFields(key: string, fields: string[]) { +export function deleteHashFields(key: string, fields: string[], onSuccessAction?: () => void,) { return async (dispatch: AppDispatch, stateInit: () => RootState) => { dispatch(removeHashFields()) try { @@ -314,18 +314,7 @@ export function deleteHashFields(key: string, fields: string[]) { ) const newTotalValue = state.browser.hash.data.total - data.affected if (isStatusSuccessful(status)) { - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.Hash, - numberOfRemoved: fields.length, - } - }) + onSuccessAction?.() dispatch(removeHashFieldsSuccess()) dispatch(removeFieldsFromList(fields)) if (newTotalValue > 0) { @@ -369,18 +358,6 @@ export function addHashFieldsAction( data ) if (isStatusSuccessful(status)) { - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_ADDED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.Hash, - numberOfAdded: data.fields.length, - } - }) if (onSuccessAction) { onSuccessAction() } diff --git a/redisinsight/ui/src/slices/browser/list.ts b/redisinsight/ui/src/slices/browser/list.ts index 7f1245baf3..71e6beffad 100644 --- a/redisinsight/ui/src/slices/browser/list.ts +++ b/redisinsight/ui/src/slices/browser/list.ts @@ -396,18 +396,6 @@ export function insertListElementsAction( onSuccessAction?.() dispatch(insertListElementsSuccess()) dispatch(fetchKeyInfo(data.keyName)) - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_ADDED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.List, - numberOfAdded: 1, - } - }) } } catch (error) { const errorMessage = getApiErrorMessage(error) @@ -437,18 +425,6 @@ export function deleteListElementsAction( { data } ) if (isStatusSuccessful(status)) { - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.List, - numberOfRemoved: data.count, - } - }) onSuccessAction?.() dispatch(deleteListElementsSuccess()) if (state.browser.list.data?.total - data.count > 0) { diff --git a/redisinsight/ui/src/slices/browser/set.ts b/redisinsight/ui/src/slices/browser/set.ts index 501a7e422d..3d89855bae 100644 --- a/redisinsight/ui/src/slices/browser/set.ts +++ b/redisinsight/ui/src/slices/browser/set.ts @@ -277,18 +277,6 @@ export function addSetMembersAction( ) if (isStatusSuccessful(status)) { - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_ADDED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_ADDED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.Set, - numberOfAdded: data.members.length, - } - }) dispatch(addSetMembersSuccess()) dispatch(fetchKeyInfo(data.keyName)) onSuccessAction?.() @@ -303,7 +291,7 @@ export function addSetMembersAction( } // Asynchronous thunk actions -export function deleteSetMembers(key: string, members: string[]) { +export function deleteSetMembers(key: string, members: string[], onSuccessAction?: () => void,) { return async (dispatch: AppDispatch, stateInit: () => RootState) => { dispatch(removeSetMembers()) @@ -323,18 +311,7 @@ export function deleteSetMembers(key: string, members: string[]) { ) if (isStatusSuccessful(status)) { - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.Set, - numberOfRemoved: members.length, - } - }) + onSuccessAction?.() const newTotalValue = state.browser.set.data.total - data.affected dispatch(removeSetMembersSuccess()) dispatch(removeMembersFromList(members)) diff --git a/redisinsight/ui/src/slices/browser/stream.ts b/redisinsight/ui/src/slices/browser/stream.ts index 15501db8a9..a4d84d64db 100644 --- a/redisinsight/ui/src/slices/browser/stream.ts +++ b/redisinsight/ui/src/slices/browser/stream.ts @@ -334,7 +334,7 @@ export function addNewEntriesAction( } } // Asynchronous thunk actions -export function deleteStreamEntry(key: string, entries: string[]) { +export function deleteStreamEntry(key: string, entries: string[], onSuccessAction?: () => void,) { return async (dispatch: AppDispatch, stateInit: () => RootState) => { dispatch(removeStreamEntries()) try { @@ -352,6 +352,7 @@ export function deleteStreamEntry(key: string, entries: string[]) { } ) if (isStatusSuccessful(status)) { + onSuccessAction?.() dispatch(removeStreamEntriesSuccess()) dispatch(refreshStreamEntries(key, false)) dispatch(refreshKeyInfoAction(key)) diff --git a/redisinsight/ui/src/slices/browser/zset.ts b/redisinsight/ui/src/slices/browser/zset.ts index 7a879f0011..0b263d5b81 100644 --- a/redisinsight/ui/src/slices/browser/zset.ts +++ b/redisinsight/ui/src/slices/browser/zset.ts @@ -332,7 +332,7 @@ export function fetchAddZSetMembers( } } -export function deleteZSetMembers(key: string, members: string[]) { +export function deleteZSetMembers(key: string, members: string[], onSuccessAction?: () => void,) { return async (dispatch: AppDispatch, stateInit: () => RootState) => { dispatch(removeZsetMembers()) try { @@ -350,18 +350,7 @@ export function deleteZSetMembers(key: string, members: string[]) { } ) if (isStatusSuccessful(status)) { - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - state.browser.keys?.viewType, - TelemetryEvent.BROWSER_KEY_VALUE_REMOVED, - TelemetryEvent.TREE_VIEW_KEY_VALUE_REMOVED - ), - eventData: { - databaseId: state.connections.instances?.connectedInstance?.id, - keyType: KeyTypes.ZSet, - numberOfRemoved: members.length, - } - }) + onSuccessAction?.() const newTotalValue = state.browser.zset.data.total - data.affected dispatch(removeZsetMembersSuccess()) dispatch(removeMembersFromList(members)) diff --git a/redisinsight/ui/src/telemetry/events.ts b/redisinsight/ui/src/telemetry/events.ts index 2011f79f88..022f7f5d0b 100644 --- a/redisinsight/ui/src/telemetry/events.ts +++ b/redisinsight/ui/src/telemetry/events.ts @@ -130,4 +130,7 @@ export enum TelemetryEvent { SLOWLOG_SORTED = 'SLOWLOG_SORTED', SLOWLOG_AUTO_REFRESH_ENABLED = 'SLOWLOG_AUTO_REFRESH_ENABLED', SLOWLOG_AUTO_REFRESH_DISABLED = 'SLOWLOG_AUTO_REFRESH_DISABLED', + + STREAM_DATA_FILTERED = 'STREAM_DATA_FILTERED', + STREAM_DATA_FILTER_RESET = 'STREAM_DATA_FILTER_RESET' } diff --git a/redisinsight/ui/src/telemetry/telemetryUtils.ts b/redisinsight/ui/src/telemetry/telemetryUtils.ts index 96f8dec1af..42c77f9cdd 100644 --- a/redisinsight/ui/src/telemetry/telemetryUtils.ts +++ b/redisinsight/ui/src/telemetry/telemetryUtils.ts @@ -152,6 +152,12 @@ const getAdditionalAddedEventData = (endpoint: ApiEndpoints, data: any) => { keyType: KeyTypes.ReJSON, TTL: -1 } + case ApiEndpoints.STREAMS: + return { + keyType: KeyTypes.Stream, + length: 1, + TTL: data.expire || -1 + } default: return {} }