Skip to content

Commit 263e1e7

Browse files
#RI-2809-add telemetry for consumer group (#749)
* #RI-2809-add telemetry for consumer group
1 parent 57389d2 commit 263e1e7

File tree

8 files changed

+192
-46
lines changed

8 files changed

+192
-46
lines changed

redisinsight/ui/src/pages/browser/components/key-details-add-items/add-stream-group/AddStreamGroup.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import {
1212
import cx from 'classnames'
1313
import React, { ChangeEvent, useEffect, useState } from 'react'
1414
import { useDispatch, useSelector } from 'react-redux'
15-
import { lastDeliveredIDTooltipText } from 'uiSrc/constants/texts'
15+
import { useParams } from 'react-router-dom'
1616

17+
import { lastDeliveredIDTooltipText } from 'uiSrc/constants/texts'
1718
import { selectedKeyDataSelector } from 'uiSrc/slices/browser/keys'
1819
import { addNewGroupAction } from 'uiSrc/slices/browser/stream'
1920
import { consumerGroupIdRegex, validateConsumerGroupId } from 'uiSrc/utils'
2021
import { CreateConsumerGroupsDto } from 'apiSrc/modules/browser/dto/stream.dto'
22+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
2123

2224
import styles from './styles.module.scss'
2325

@@ -35,6 +37,8 @@ const AddStreamGroup = (props: Props) => {
3537
const [idError, setIdError] = useState<string>('')
3638
const [isIdFocused, setIsIdFocused] = useState<boolean>(false)
3739

40+
const { instanceId } = useParams<{ instanceId: string }>()
41+
3842
const dispatch = useDispatch()
3943

4044
useEffect(() => {
@@ -50,6 +54,16 @@ const AddStreamGroup = (props: Props) => {
5054
setIdError('')
5155
}, [id])
5256

57+
const onSuccessAdded = () => {
58+
onCancel()
59+
sendEventTelemetry({
60+
event: TelemetryEvent.STREAM_CONSUMER_GROUP_CREATED,
61+
eventData: {
62+
databaseId: instanceId,
63+
}
64+
})
65+
}
66+
5367
const submitData = () => {
5468
if (isFormValid) {
5569
const data: CreateConsumerGroupsDto = {
@@ -59,7 +73,7 @@ const AddStreamGroup = (props: Props) => {
5973
lastDeliveredId: id,
6074
}],
6175
}
62-
dispatch(addNewGroupAction(data, onCancel))
76+
dispatch(addNewGroupAction(data, onSuccessAdded))
6377
}
6478
}
6579

redisinsight/ui/src/pages/browser/components/stream-details/consumers-view/ConsumersViewWrapper.tsx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import React, { useCallback, useEffect, useState } from 'react'
1+
import React, { useEffect, useState } from 'react'
22
import { useDispatch, useSelector } from 'react-redux'
3+
import { useParams } from 'react-router-dom'
34
import { EuiToolTip, EuiText } from '@elastic/eui'
45

56
import {
@@ -16,6 +17,7 @@ import { StreamViewType } from 'uiSrc/slices/interfaces/stream'
1617
import { numberWithSpaces } from 'uiSrc/utils/numbers'
1718
import { selectedKeyDataSelector, updateSelectedKeyRefreshTime } from 'uiSrc/slices/browser/keys'
1819
import { formatLongName } from 'uiSrc/utils'
20+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
1921

2022
import { ConsumerDto } from 'apiSrc/modules/browser/dto/stream.dto'
2123
import ConsumersView from './ConsumersView'
@@ -37,6 +39,8 @@ const ConsumersViewWrapper = (props: Props) => {
3739
data: loadedConsumers = [],
3840
} = useSelector(selectedGroupSelector) ?? {}
3941

42+
const { instanceId } = useParams<{ instanceId: string }>()
43+
4044
const dispatch = useDispatch()
4145

4246
const [deleting, setDeleting] = useState<string>('')
@@ -45,19 +49,28 @@ const ConsumersViewWrapper = (props: Props) => {
4549
dispatch(updateSelectedKeyRefreshTime(lastRefreshTime))
4650
}, [])
4751

48-
const closePopover = useCallback(() => {
52+
const closePopover = () => {
4953
setDeleting('')
50-
}, [])
54+
}
5155

52-
const showPopover = useCallback((consumer = '') => {
56+
const showPopover = (consumer = '') => {
5357
setDeleting(`${consumer + suffix}`)
54-
}, [])
58+
}
5559

56-
const handleDeleteConsumer = (consumerName = '') => {
57-
dispatch(deleteConsumersAction(key, selectedGroupName, [consumerName]))
60+
const onSuccessDeletedConsumer = () => {
61+
sendEventTelemetry({
62+
event: TelemetryEvent.STREAM_CONSUMER_DELETED,
63+
eventData: {
64+
databaseId: instanceId,
65+
}
66+
})
5867
closePopover()
5968
}
6069

70+
const handleDeleteConsumer = (consumerName = '') => {
71+
dispatch(deleteConsumersAction(key, selectedGroupName, [consumerName], onSuccessDeletedConsumer))
72+
}
73+
6174
const handleRemoveIconClick = () => {
6275
// sendEventTelemetry({
6376
// event: getBasedOnViewTypeEvent(

redisinsight/ui/src/pages/browser/components/stream-details/groups-view/GroupsViewWrapper.tsx

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { EuiFieldText, EuiIcon, EuiText, EuiToolTip } from '@elastic/eui'
2-
import React, { useCallback, useEffect, useState } from 'react'
2+
import React, { useEffect, useState } from 'react'
33
import { useDispatch, useSelector } from 'react-redux'
4+
import { useParams } from 'react-router-dom'
45
import PopoverItemEditor from 'uiSrc/components/popover-item-editor'
56
import { lastDeliveredIDTooltipText } from 'uiSrc/constants/texts'
67
import { selectedKeyDataSelector, updateSelectedKeyRefreshTime } from 'uiSrc/slices/browser/keys'
@@ -19,8 +20,9 @@ import { consumerGroupIdRegex, formatLongName, validateConsumerGroupId } from 'u
1920
import { getFormatTime } from 'uiSrc/utils/streamUtils'
2021
import { TableCellTextAlignment } from 'uiSrc/constants'
2122
import { StreamViewType } from 'uiSrc/slices/interfaces/stream'
23+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
2224

23-
import { ConsumerGroupDto, UpdateConsumerGroupDto } from 'apiSrc/modules/browser/dto/stream.dto'
25+
import { ConsumerDto, ConsumerGroupDto, UpdateConsumerGroupDto } from 'apiSrc/modules/browser/dto/stream.dto'
2426

2527
import GroupsView from './GroupsView'
2628

@@ -53,6 +55,8 @@ const GroupsViewWrapper = (props: Props) => {
5355
const [idError, setIdError] = useState<string>('')
5456
const [isIdFocused, setIsIdFocused] = useState<boolean>(false)
5557

58+
const { instanceId } = useParams<{ instanceId: string }>()
59+
5660
useEffect(() => {
5761
dispatch(updateSelectedKeyRefreshTime(lastRefreshTime))
5862
}, [lastRefreshTime])
@@ -74,19 +78,28 @@ const GroupsViewWrapper = (props: Props) => {
7478
setIdError('')
7579
}, [editValue])
7680

77-
const closePopover = useCallback(() => {
81+
const closePopover = () => {
7882
setDeleting('')
79-
}, [])
83+
}
8084

81-
const showPopover = useCallback((groupName = '') => {
85+
const showPopover = (groupName = '') => {
8286
setDeleting(`${groupName + suffix}`)
83-
}, [])
87+
}
8488

85-
const handleDeleteGroup = (name: string) => {
86-
dispatch(deleteConsumerGroupsAction(selectedKey, [name]))
89+
const onSuccessDeletedGroup = () => {
90+
sendEventTelemetry({
91+
event: TelemetryEvent.STREAM_CONSUMER_GROUP_DELETED,
92+
eventData: {
93+
databaseId: instanceId,
94+
}
95+
})
8796
closePopover()
8897
}
8998

99+
const handleDeleteGroup = (name: string) => {
100+
dispatch(deleteConsumerGroupsAction(selectedKey, [name], onSuccessDeletedGroup))
101+
}
102+
90103
const handleRemoveIconClick = () => {
91104
// sendEventTelemetry({
92105
// event: getBasedOnViewTypeEvent(
@@ -101,11 +114,31 @@ const GroupsViewWrapper = (props: Props) => {
101114
// })
102115
}
103116

117+
const onSuccessSelectedGroup = (data: ConsumerDto[]) => {
118+
dispatch(setStreamViewType(StreamViewType.Consumers))
119+
sendEventTelemetry({
120+
event: TelemetryEvent.STREAM_CONSUMERS_LOADED,
121+
eventData: {
122+
databaseId: instanceId,
123+
length: data.length
124+
}
125+
})
126+
}
127+
128+
const onSuccessApplyEditId = () => {
129+
sendEventTelemetry({
130+
event: TelemetryEvent.STREAM_CONSUMER_GROUP_ID_SET,
131+
eventData: {
132+
databaseId: instanceId,
133+
}
134+
})
135+
}
136+
104137
const handleSelectGroup = ({ rowData }: { rowData: any }) => {
105138
dispatch(setSelectedGroup(rowData))
106139
dispatch(fetchConsumers(
107140
false,
108-
() => dispatch(setStreamViewType(StreamViewType.Consumers))
141+
onSuccessSelectedGroup,
109142
))
110143
}
111144

@@ -116,7 +149,7 @@ const GroupsViewWrapper = (props: Props) => {
116149
name: groupName,
117150
lastDeliveredId: editValue
118151
}
119-
dispatch(modifyLastDeliveredIdAction(data))
152+
dispatch(modifyLastDeliveredIdAction(data, onSuccessApplyEditId))
120153
}
121154
}
122155

@@ -283,7 +316,7 @@ const GroupsViewWrapper = (props: Props) => {
283316
header={name}
284317
text={(
285318
<>
286-
will be removed from <b>{selectedKey}</b>
319+
and all its consumers will be removed from <b>{selectedKey}</b>
287320
</>
288321
)}
289322
item={name}

redisinsight/ui/src/pages/browser/components/stream-details/messages-view/MessageClaimPopover/MessageClaimPopover.tsx

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { useState, useEffect, ChangeEvent } from 'react'
22
import { useSelector } from 'react-redux'
3+
import { useParams } from 'react-router-dom'
34
import {
45
EuiSuperSelect,
56
EuiSuperSelectOption,
@@ -22,7 +23,8 @@ import { orderBy, filter } from 'lodash'
2223
import { selectedGroupSelector, selectedConsumerSelector } from 'uiSrc/slices/browser/stream'
2324
import { validateNumber } from 'uiSrc/utils'
2425
import { prepareDataForClaimRequest, getDefaultConsumer, ClaimTimeOptions } from 'uiSrc/utils/streamUtils'
25-
import { ClaimPendingEntryDto, ConsumerDto } from 'apiSrc/modules/browser/dto/stream.dto'
26+
import { ClaimPendingEntryDto, ClaimPendingEntriesResponse, ConsumerDto } from 'apiSrc/modules/browser/dto/stream.dto'
27+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
2628

2729
import styles from './styles.module.scss'
2830

@@ -50,7 +52,11 @@ export interface Props {
5052
isOpen: boolean
5153
closePopover: () => void
5254
showPopover: () => void
53-
claimMessage: (data: Partial<ClaimPendingEntryDto>, successAction: () => void) => void
55+
claimMessage: (
56+
data: Partial<ClaimPendingEntryDto>,
57+
successAction: (data: ClaimPendingEntriesResponse) => void
58+
) => void
59+
handleCancelClaim: () => void
5460
}
5561

5662
const MessageClaimPopover = (props: Props) => {
@@ -59,17 +65,17 @@ const MessageClaimPopover = (props: Props) => {
5965
isOpen,
6066
closePopover,
6167
showPopover,
62-
claimMessage
68+
claimMessage,
69+
handleCancelClaim
6370
} = props
6471

6572
const {
6673
data: consumers = [],
6774
} = useSelector(selectedGroupSelector) ?? {}
68-
const { name: currentConsumerName } = useSelector(selectedConsumerSelector) ?? { name: '' }
75+
const { name: currentConsumerName, pending = 0 } = useSelector(selectedConsumerSelector) ?? { name: '' }
6976

7077
const [isOptionalShow, setIsOptionalShow] = useState<boolean>(false)
7178
const [consumerOptions, setConsumerOptions] = useState<EuiSuperSelectOption<string>[]>([])
72-
7379
const [initialValues, setInitialValues] = useState({
7480
consumerName: '',
7581
minIdleTime: '0',
@@ -79,16 +85,31 @@ const MessageClaimPopover = (props: Props) => {
7985
force: false
8086
})
8187

88+
const { instanceId } = useParams<{ instanceId: string }>()
89+
8290
const formik = useFormik({
8391
initialValues,
8492
enableReinitialize: true,
8593
validateOnBlur: false,
8694
onSubmit: (values) => {
8795
const data = prepareDataForClaimRequest(values, [id], isOptionalShow)
88-
claimMessage(data, handleClosePopover)
96+
claimMessage(data, onSuccessSubmit)
8997
},
9098
})
9199

100+
const onSuccessSubmit = (data: ClaimPendingEntriesResponse) => {
101+
sendEventTelemetry({
102+
event: TelemetryEvent.STREAM_CONSUMER_MESSAGE_CLAIMED,
103+
eventData: {
104+
databaseId: instanceId,
105+
pending: pending - data.affected.length
106+
}
107+
})
108+
setIsOptionalShow(false)
109+
formik.resetForm()
110+
closePopover()
111+
}
112+
92113
const handleClosePopover = () => {
93114
closePopover()
94115
setIsOptionalShow(false)
@@ -107,6 +128,11 @@ const MessageClaimPopover = (props: Props) => {
107128
}
108129
}
109130

131+
const handleCancel = () => {
132+
handleCancelClaim()
133+
handleClosePopover()
134+
}
135+
110136
useEffect(() => {
111137
const consumersWithoutCurrent = filter(consumers, (consumer) => consumer.name !== currentConsumerName)
112138
const sortedConsumers = orderBy(getConsumersOptions(consumersWithoutCurrent), ['name'], ['asc'])
@@ -288,7 +314,7 @@ const MessageClaimPopover = (props: Props) => {
288314
<EuiButton
289315
color="secondary"
290316
className={styles.footerBtn}
291-
onClick={handleClosePopover}
317+
onClick={handleCancel}
292318
>
293319
Cancel
294320
</EuiButton>

0 commit comments

Comments
 (0)