Skip to content

Commit 6b302ab

Browse files
committed
Merge branch 'main' into feature/RI-3646_Change_Expiration_timeline_to_Bar_chart
# Conflicts: # redisinsight/ui/src/pages/databaseAnalysis/components/analysis-ttl-view/ExpirationGroupsView.tsx
2 parents b27faa2 + 9eab77b commit 6b302ab

File tree

14 files changed

+101
-40
lines changed

14 files changed

+101
-40
lines changed

redisinsight/ui/src/components/analytics-tabs/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const analyticsViewTabs: AnalyticsTabs[] = [
1212
},
1313
{
1414
id: AnalyticsViewTab.DatabaseAnalysis,
15-
label: 'Memory Efficiency',
15+
label: 'Redis Database Analysis',
1616
},
1717
{
1818
id: AnalyticsViewTab.SlowLog,

redisinsight/ui/src/pages/databaseAnalysis/DatabaseAnalysisPage.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useParams } from 'react-router-dom'
44

55
import {
66
dbAnalysisSelector,
7-
DBAnalysisReportsSelector,
7+
dbAnalysisReportsSelector,
88
fetchDBAnalysisAction,
99
fetchDBAnalysisReportsHistory,
1010
setSelectedAnalysisId
@@ -14,6 +14,7 @@ import { appAnalyticsInfoSelector } from 'uiSrc/slices/app/info'
1414
import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances'
1515
import { AnalyticsViewTab } from 'uiSrc/slices/interfaces/analytics'
1616
import { sendPageViewTelemetry, sendEventTelemetry, TelemetryPageView, TelemetryEvent } from 'uiSrc/telemetry'
17+
import { formatLongName, getDbIndex, setTitle } from 'uiSrc/utils'
1718

1819
import Header from './components/header'
1920
import AnalysisDataView from './components/analysis-data-view'
@@ -24,12 +25,14 @@ const DatabaseAnalysisPage = () => {
2425
const { viewTab } = useSelector(analyticsSettingsSelector)
2526
const { identified: analyticsIdentified } = useSelector(appAnalyticsInfoSelector)
2627
const { loading: analysisLoading, data } = useSelector(dbAnalysisSelector)
27-
const { data: reports, selectedAnalysis } = useSelector(DBAnalysisReportsSelector)
28-
const { name: connectedInstanceName } = useSelector(connectedInstanceSelector)
28+
const { data: reports, selectedAnalysis } = useSelector(dbAnalysisReportsSelector)
29+
const { name: connectedInstanceName, db } = useSelector(connectedInstanceSelector)
2930

3031
const [isPageViewSent, setIsPageViewSent] = useState<boolean>(false)
3132

3233
const dispatch = useDispatch()
34+
const dbName = `${formatLongName(connectedInstanceName, 33, 0, '...')} ${getDbIndex(db)}`
35+
setTitle(`${dbName} - Database Analysis`)
3336

3437
useEffect(() => {
3538
dispatch(fetchDBAnalysisReportsHistory(instanceId))
@@ -51,7 +54,7 @@ const DatabaseAnalysisPage = () => {
5154

5255
const handleSelectAnalysis = (reportId: string) => {
5356
sendEventTelemetry({
54-
event: TelemetryEvent.MEMORY_ANALYSIS_HISTORY_VIEWED,
57+
event: TelemetryEvent.DATABASE_ANALYSIS_HISTORY_VIEWED,
5558
eventData: {
5659
databaseId: instanceId,
5760
}

redisinsight/ui/src/pages/databaseAnalysis/components/analysis-data-view/AnalysisDataView.spec.tsx

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
11
import React from 'react'
22
import { instance, mock } from 'ts-mockito'
33
import { MOCK_ANALYSIS_REPORT_DATA } from 'uiSrc/mocks/data/analysis'
4+
import { INSTANCE_ID_MOCK } from 'uiSrc/mocks/handlers/analytics/clusterDetailsHandlers'
5+
import { SectionName } from 'uiSrc/pages/databaseAnalysis'
6+
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
47
import { formatBytes, getGroupTypeDisplay } from 'uiSrc/utils'
58
import { numberWithSpaces } from 'uiSrc/utils/numbers'
69
import { fireEvent, render, screen, within } from 'uiSrc/utils/test-utils'
710

811
import AnalysisDataView, { Props } from './AnalysisDataView'
912

10-
const mockedProps = mock<Props>()
13+
jest.mock('uiSrc/telemetry', () => ({
14+
...jest.requireActual('uiSrc/telemetry'),
15+
sendEventTelemetry: jest.fn(),
16+
}))
1117

18+
const mockedProps = mock<Props>()
1219
const mockReports = [
1320
{
1421
id: MOCK_ANALYSIS_REPORT_DATA.id,
@@ -20,6 +27,11 @@ const mockReports = [
2027
}
2128
]
2229

30+
const summaryContainerId = 'summary-per-data'
31+
const analyticsTTLContainerId = 'analysis-ttl'
32+
const topNameSpacesContainerId = 'top-namespaces'
33+
const extrapolateResultsId = 'extrapolate-results'
34+
2335
describe('AnalysisDataView', () => {
2436
it('should render', () => {
2537
expect(render(<AnalysisDataView {...instance(mockedProps)} />)).toBeTruthy()
@@ -104,7 +116,7 @@ describe('AnalysisDataView', () => {
104116
<AnalysisDataView {...instance(mockedProps)} reports={mockReports} data={mockedData} />
105117
)
106118

107-
fireEvent.click(within(screen.getByTestId('summary-per-data')).getByTestId('extrapolate-results'))
119+
fireEvent.click(within(screen.getByTestId(summaryContainerId)).getByTestId(extrapolateResultsId))
108120

109121
expect(screen.getByTestId('total-memory-value')).toHaveTextContent(`${formatBytes(mockedData.totalMemory.total, 3)}`)
110122
expect(screen.getByTestId('total-keys-value')).toHaveTextContent(`${numberWithSpaces(mockedData.totalKeys.total)}`)
@@ -157,7 +169,7 @@ describe('AnalysisDataView', () => {
157169
render(
158170
<AnalysisDataView {...instance(mockedProps)} reports={mockReports} data={mockedData} />
159171
)
160-
fireEvent.click(within(screen.getByTestId('analysis-ttl')).getByTestId('extrapolate-results'))
172+
fireEvent.click(within(screen.getByTestId(analyticsTTLContainerId)).getByTestId(extrapolateResultsId))
161173

162174
const expirationGroup = mockedData.expirationGroups[1]
163175

@@ -198,7 +210,7 @@ describe('AnalysisDataView', () => {
198210
render(
199211
<AnalysisDataView {...instance(mockedProps)} reports={mockReports} data={mockedData} />
200212
)
201-
fireEvent.click(within(screen.getByTestId('top-namespaces')).getByTestId('extrapolate-results'))
213+
fireEvent.click(within(screen.getByTestId(topNameSpacesContainerId)).getByTestId(extrapolateResultsId))
202214

203215
const nspTopKeyItem = mockedData.topKeysNsp[0]
204216
expect(screen.getByTestId(`nsp-usedMemory-value=${nspTopKeyItem.memory}`))
@@ -221,7 +233,7 @@ describe('AnalysisDataView', () => {
221233
<AnalysisDataView {...instance(mockedProps)} reports={mockReports} data={mockedData} />
222234
)
223235

224-
expect(screen.queryByTestId('extrapolate-results')).not.toBeInTheDocument()
236+
expect(screen.queryByTestId(extrapolateResultsId)).not.toBeInTheDocument()
225237

226238
expect(screen.getByTestId('total-memory-value')).toHaveTextContent(`${formatBytes(mockedData.totalMemory.total, 3)}`)
227239
expect(screen.getByTestId('total-keys-value')).toHaveTextContent(`${numberWithSpaces(mockedData.totalKeys.total)}`)
@@ -238,4 +250,45 @@ describe('AnalysisDataView', () => {
238250
expect(screen.getAllByTestId(`keys-value-${nspTopKeyItem.keys}`)[0])
239251
.toHaveTextContent(`${numberWithSpaces(nspTopKeyItem.keys)}`)
240252
})
253+
254+
it('should call proper telemetry events after click extrapolation', () => {
255+
const mockedData = {
256+
...MOCK_ANALYSIS_REPORT_DATA,
257+
progress: {
258+
total: 80,
259+
scanned: 10000,
260+
processed: 40
261+
}
262+
}
263+
const sendEventTelemetryMock = jest.fn()
264+
sendEventTelemetry.mockImplementation(() => sendEventTelemetryMock)
265+
266+
render(
267+
<AnalysisDataView {...instance(mockedProps)} reports={mockReports} data={mockedData} />
268+
)
269+
270+
const clickAndCheckTelemetry = (el: HTMLInputElement, section: SectionName) => {
271+
fireEvent.click(el)
272+
expect(sendEventTelemetry).toBeCalledWith({
273+
event: TelemetryEvent.DATABASE_ANALYSIS_EXTRAPOLATION_CHANGED,
274+
eventData: {
275+
databaseId: INSTANCE_ID_MOCK,
276+
from: !el.checked,
277+
to: el.checked,
278+
section
279+
}
280+
})
281+
sendEventTelemetry.mockRestore()
282+
}
283+
284+
[
285+
{ id: summaryContainerId, section: SectionName.SUMMARY_PER_DATA },
286+
{ id: analyticsTTLContainerId, section: SectionName.MEMORY_LIKELY_TO_BE_FREED },
287+
{ id: topNameSpacesContainerId, section: SectionName.TOP_NAMESPACES },
288+
].forEach(({ id, section }) => {
289+
const extrapolateSwitch = within(screen.getByTestId(id)).getByTestId(extrapolateResultsId)
290+
clickAndCheckTelemetry(extrapolateSwitch as HTMLInputElement, section)
291+
clickAndCheckTelemetry(extrapolateSwitch as HTMLInputElement, section)
292+
})
293+
})
241294
})

redisinsight/ui/src/pages/databaseAnalysis/components/analysis-data-view/AnalysisDataView.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { isNull } from 'lodash'
44
import { useParams } from 'react-router-dom'
55
import { sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry'
66
import { Nullable } from 'uiSrc/utils'
7-
import { DEFAULT_EXTRAPOLATION, EmptyMessage } from 'uiSrc/pages/databaseAnalysis/constants'
7+
import { DEFAULT_EXTRAPOLATION, EmptyMessage, SectionName } from 'uiSrc/pages/databaseAnalysis/constants'
88
import {
99
TopKeys,
1010
EmptyAnalysisMessage,
@@ -34,13 +34,14 @@ const AnalysisDataView = (props: Props) => {
3434
}
3535
}, [data])
3636

37-
const onSwitchExtrapolation = (value: boolean) => {
37+
const onSwitchExtrapolation = (value: boolean, section: SectionName) => {
3838
sendEventTelemetry({
39-
event: TelemetryEvent.MEMORY_ANALYSIS_EXTRAPOLATION_CHANGED,
39+
event: TelemetryEvent.DATABASE_ANALYSIS_EXTRAPOLATION_CHANGED,
4040
eventData: {
4141
databaseId: instanceId,
4242
from: !value,
43-
to: value
43+
to: value,
44+
section
4445
}
4546
})
4647
}

redisinsight/ui/src/pages/databaseAnalysis/components/analysis-ttl-view/ExpirationGroupsView.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import React, { useEffect, useState } from 'react'
21
import { EuiSwitch, EuiTitle } from '@elastic/eui'
3-
import AutoSizer from 'react-virtualized-auto-sizer'
4-
import { useDispatch, useSelector } from 'react-redux'
2+
53
import cx from 'classnames'
64

75
import { DEFAULT_EXTRAPOLATION } from 'uiSrc/pages/databaseAnalysis'
@@ -10,13 +8,14 @@ import { BarChart } from 'uiSrc/components/charts'
108
import { BarChartData, BarChartDataType, DEFAULT_BAR_WIDTH, DEFAULT_MULTIPLIER_GRID, DEFAULT_Y_TICKS } from 'uiSrc/components/charts/bar-chart'
119
import { DBAnalysisReportsSelector, setShowNoExpiryGroup } from 'uiSrc/slices/analytics/dbAnalysis'
1210
import { DatabaseAnalysis } from 'apiSrc/modules/database-analysis/models'
11+
1312
import styles from './styles.module.scss'
1413

1514
export interface Props {
1615
data: Nullable<DatabaseAnalysis>
1716
loading: boolean
1817
extrapolation: number
19-
onSwitchExtrapolation?: (value: boolean) => void
18+
onSwitchExtrapolation?: (value: boolean, section: SectionName) => void
2019
}
2120

2221
const ExpirationGroupsView = (props: Props) => {
@@ -93,7 +92,7 @@ const ExpirationGroupsView = (props: Props) => {
9392
checked={isExtrapolated}
9493
onChange={(e) => {
9594
setIsExtrapolated(e.target.checked)
96-
onSwitchExtrapolation?.(e.target.checked)
95+
onSwitchExtrapolation?.(e.target.checked, SectionName.MEMORY_LIKELY_TO_BE_FREED)
9796
}}
9897
data-testid="extrapolate-results"
9998
/>

redisinsight/ui/src/pages/databaseAnalysis/components/header/Header.spec.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ describe('DatabaseAnalysisHeader', () => {
7474
fireEvent.click(screen.getByTestId('start-database-analysis-btn'))
7575

7676
expect(sendEventTelemetry).toBeCalledWith({
77-
event: TelemetryEvent.MEMORY_ANALYSIS_STARTED,
77+
event: TelemetryEvent.DATABASE_ANALYSIS_STARTED,
7878
eventData: {
7979
databaseId: INSTANCE_ID_MOCK,
8080
}

redisinsight/ui/src/pages/databaseAnalysis/components/header/Header.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ const Header = (props: Props) => {
6969

7070
const handleClick = () => {
7171
sendEventTelemetry({
72-
event: TelemetryEvent.MEMORY_ANALYSIS_STARTED,
72+
event: TelemetryEvent.DATABASE_ANALYSIS_STARTED,
7373
eventData: {
7474
databaseId: instanceId,
7575
}

redisinsight/ui/src/pages/databaseAnalysis/components/summary-per-data/SummaryPerData.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { DonutChart } from 'uiSrc/components/charts'
66
import { ChartData } from 'uiSrc/components/charts/donut-chart/DonutChart'
77
import { KeyIconSvg, MemoryIconSvg } from 'uiSrc/components/database-overview/components/icons'
88
import { GROUP_TYPES_COLORS, GroupTypesColors } from 'uiSrc/constants'
9-
import { DEFAULT_EXTRAPOLATION } from 'uiSrc/pages/databaseAnalysis'
9+
import { DEFAULT_EXTRAPOLATION, SectionName } from 'uiSrc/pages/databaseAnalysis'
1010
import { extrapolate, formatBytes, getGroupTypeDisplay, Nullable } from 'uiSrc/utils'
1111
import { getPercentage, numberWithSpaces } from 'uiSrc/utils/numbers'
1212

@@ -18,7 +18,7 @@ export interface Props {
1818
data: Nullable<DatabaseAnalysis>
1919
loading: boolean
2020
extrapolation?: number
21-
onSwitchExtrapolation?: (value: boolean) => void
21+
onSwitchExtrapolation?: (value: boolean, section: SectionName) => void
2222
}
2323

2424
const widthResponsiveSize = 1024
@@ -132,7 +132,7 @@ const SummaryPerData = ({ data, loading, extrapolation, onSwitchExtrapolation }:
132132
checked={isExtrapolated}
133133
onChange={(e) => {
134134
setIsExtrapolated(e.target.checked)
135-
onSwitchExtrapolation?.(e.target.checked)
135+
onSwitchExtrapolation?.(e.target.checked, SectionName.SUMMARY_PER_DATA)
136136
}}
137137
data-testid="extrapolate-results"
138138
/>

redisinsight/ui/src/pages/databaseAnalysis/components/top-namespace/TopNamespace.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
import React, { useEffect, useState } from 'react'
2-
import cx from 'classnames'
31
import { EuiButton, EuiSwitch, EuiTitle } from '@elastic/eui'
4-
import { Nullable } from 'uiSrc/utils'
5-
import { DEFAULT_EXTRAPOLATION, TableView } from 'uiSrc/pages/databaseAnalysis'
2+
import cx from 'classnames'
3+
import React, { useEffect, useState } from 'react'
4+
import { DEFAULT_EXTRAPOLATION, SectionName, TableView } from 'uiSrc/pages/databaseAnalysis'
65
import { TableLoader } from 'uiSrc/pages/databaseAnalysis/components'
6+
import { Nullable } from 'uiSrc/utils'
77
import { DatabaseAnalysis } from 'apiSrc/modules/database-analysis/models'
8-
98
import Table from './Table'
109
import styles from './styles.module.scss'
1110

1211
export interface Props {
1312
data: Nullable<DatabaseAnalysis>
1413
loading: boolean
1514
extrapolation: number
16-
onSwitchExtrapolation?: (value: boolean) => void
15+
onSwitchExtrapolation?: (value: boolean, section: SectionName) => void
1716
}
1817

1918
const TopNamespace = (props: Props) => {
@@ -70,7 +69,7 @@ const TopNamespace = (props: Props) => {
7069
checked={isExtrapolated}
7170
onChange={(e) => {
7271
setIsExtrapolated(e.target.checked)
73-
onSwitchExtrapolation?.(e.target.checked)
72+
onSwitchExtrapolation?.(e.target.checked, SectionName.TOP_NAMESPACES)
7473
}}
7574
data-testid="extrapolate-results"
7675
/>

redisinsight/ui/src/pages/databaseAnalysis/constants.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,9 @@ export type Content = {
1717
}
1818

1919
export const DEFAULT_EXTRAPOLATION = 1
20+
21+
export enum SectionName {
22+
SUMMARY_PER_DATA = 'SUMMARY_PER_DATA',
23+
MEMORY_LIKELY_TO_BE_FREED = 'MEMORY_LIKELY_TO_BE_FREED',
24+
TOP_NAMESPACES = 'TOP_NAMESPACES',
25+
}

0 commit comments

Comments
 (0)