From 98ccd1035296cc73d37a3dbe125c3ddd2086b070 Mon Sep 17 00:00:00 2001 From: Amir Allayarov Date: Fri, 17 Jun 2022 14:26:46 +0400 Subject: [PATCH 1/3] #RI-2542,RI-3093,RI-3092 --- .../key-details-header/KeyDetailsHeader.tsx | 15 ++++--- .../key-details/KeyDetails/KeyDetails.tsx | 26 +++++++------ .../EmptyMessagesList.spec.tsx | 8 ++-- .../EmptyMessagesList/EmptyMessagesList.tsx | 2 +- .../ui/src/telemetry/checkAnalytics.ts | 2 + redisinsight/ui/src/telemetry/interfaces.ts | 2 +- redisinsight/ui/src/telemetry/segment.ts | 4 +- .../ui/src/telemetry/telemetryUtils.ts | 39 ++++++++++++++++++- 8 files changed, 71 insertions(+), 27 deletions(-) diff --git a/redisinsight/ui/src/pages/browser/components/key-details-header/KeyDetailsHeader.tsx b/redisinsight/ui/src/pages/browser/components/key-details-header/KeyDetailsHeader.tsx index 35585e35a2..12fc79f541 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details-header/KeyDetailsHeader.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details-header/KeyDetailsHeader.tsx @@ -24,7 +24,7 @@ import { AddCommonFieldsFormConfig } from 'uiSrc/pages/browser/components/add-ke import { keysSelector, selectedKeyDataSelector, selectedKeySelector } from 'uiSrc/slices/browser/keys' import { streamSelector } from 'uiSrc/slices/browser/stream' import { connectedInstanceSelector } from 'uiSrc/slices/instances/instances' -import { getBasedOnViewTypeEvent, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' +import { getBasedOnViewTypeEvent, getRefreshEventData, sendEventTelemetry, TelemetryEvent } from 'uiSrc/telemetry' import { formatBytes, formatNameShort, MAX_TTL_NUMBER, replaceSpaces, validateTTLNumber } from 'uiSrc/utils' import AutoRefresh from '../auto-refresh' @@ -182,16 +182,21 @@ const KeyDetailsHeader = ({ const handleRefreshKey = (enableAutoRefresh: boolean) => { if (!enableAutoRefresh) { + const eventData = getRefreshEventData( + { + databaseId: instanceId, + keyType: type + }, + type, + streamViewType + ) sendEventTelemetry({ event: getBasedOnViewTypeEvent( viewType, TelemetryEvent.BROWSER_KEY_DETAILS_REFRESH_CLICKED, TelemetryEvent.TREE_VIEW_KEY_DETAILS_REFRESH_CLICKED ), - eventData: { - databaseId: instanceId, - keyType: type - } + eventData }) } onRefresh(key, type) diff --git a/redisinsight/ui/src/pages/browser/components/key-details/KeyDetails/KeyDetails.tsx b/redisinsight/ui/src/pages/browser/components/key-details/KeyDetails/KeyDetails.tsx index 9bd89e4fa7..e470ee14df 100644 --- a/redisinsight/ui/src/pages/browser/components/key-details/KeyDetails/KeyDetails.tsx +++ b/redisinsight/ui/src/pages/browser/components/key-details/KeyDetails/KeyDetails.tsx @@ -79,17 +79,19 @@ const KeyDetails = ({ ...props }: Props) => { const openAddItemPanel = () => { setIsRemoveItemPanelOpen(false) setIsAddItemPanelOpen(true) - sendEventTelemetry({ - event: getBasedOnViewTypeEvent( - viewType, - TelemetryEvent.BROWSER_KEY_ADD_VALUE_CLICKED, - TelemetryEvent.TREE_VIEW_KEY_ADD_VALUE_CLICKED - ), - eventData: { - databaseId: instanceId, - keyType: selectedKeyType - } - }) + if (!STREAM_ADD_GROUP_VIEW_TYPES.includes(streamViewType)) { + sendEventTelemetry({ + event: getBasedOnViewTypeEvent( + viewType, + TelemetryEvent.BROWSER_KEY_ADD_VALUE_CLICKED, + TelemetryEvent.TREE_VIEW_KEY_ADD_VALUE_CLICKED + ), + eventData: { + databaseId: instanceId, + keyType: selectedKeyType + } + }) + } } const openRemoveItemPanel = () => { @@ -98,7 +100,7 @@ const KeyDetails = ({ ...props }: Props) => { } const closeAddItemPanel = (isCancelled?: boolean) => { - if (isCancelled && isAddItemPanelOpen) { + if (isCancelled && isAddItemPanelOpen && !STREAM_ADD_GROUP_VIEW_TYPES.includes(streamViewType)) { sendEventTelemetry({ event: getBasedOnViewTypeEvent( viewType, diff --git a/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.spec.tsx b/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.spec.tsx index 8c70328a95..a2a0fe6ae6 100644 --- a/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.spec.tsx +++ b/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.spec.tsx @@ -19,17 +19,17 @@ describe('EmptyMessagesList', () => { expect(queryByTestId('empty-messages-list-cluster')).toBeInTheDocument() }) - it('should render cluster info for Cluster connection type', () => { + it(' not render cluster info for Cluster connection type', () => { const { queryByTestId } = render( - + ) - expect(queryByTestId('empty-messages-list-cluster')).toBeInTheDocument() + expect(queryByTestId('empty-messages-list-cluster')).not.toBeInTheDocument() }) it('should not render cluster info for Cluster connection type', () => { const { queryByTestId } = render( - + ) expect(queryByTestId('empty-messages-list-cluster')).not.toBeInTheDocument() diff --git a/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.tsx b/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.tsx index 1343b9fa14..4bd655f95f 100644 --- a/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.tsx +++ b/redisinsight/ui/src/pages/pubSub/components/messages-list/EmptyMessagesList/EmptyMessagesList.tsx @@ -22,7 +22,7 @@ const EmptyMessagesList = ({ connectionType, isSpublishNotSupported }: Props) => Running in production may decrease performance and memory available - {(connectionType === ConnectionType.Cluster || isSpublishNotSupported) && ( + {(connectionType === ConnectionType.Cluster && isSpublishNotSupported) && ( <>
diff --git a/redisinsight/ui/src/telemetry/checkAnalytics.ts b/redisinsight/ui/src/telemetry/checkAnalytics.ts index 087dd174ad..58cda8a433 100644 --- a/redisinsight/ui/src/telemetry/checkAnalytics.ts +++ b/redisinsight/ui/src/telemetry/checkAnalytics.ts @@ -4,3 +4,5 @@ import store from 'uiSrc/slices/store' // Check is user give access to collect his events export const checkIsAnalyticsGranted = () => !!get(store.getState(), 'user.settings.config.agreements.analytics', false) + +export const getAppType = () => store.getState().app?.info?.server?.appType diff --git a/redisinsight/ui/src/telemetry/interfaces.ts b/redisinsight/ui/src/telemetry/interfaces.ts index beb5310f35..6ddaf9a8ee 100644 --- a/redisinsight/ui/src/telemetry/interfaces.ts +++ b/redisinsight/ui/src/telemetry/interfaces.ts @@ -7,7 +7,7 @@ export interface ITelemetryIdentify { export interface ITelemetryService { initialize(): Promise; - pageView(name: string, databaseId?: string): Promise; + pageView(name: string, appType: string, databaseId?: string): Promise; identify(opts: ITelemetryIdentify): Promise; event(opts: ITelemetryEvent): Promise; anonymousId: string; diff --git a/redisinsight/ui/src/telemetry/segment.ts b/redisinsight/ui/src/telemetry/segment.ts index 8fc42c9f6c..035d02a7ff 100644 --- a/redisinsight/ui/src/telemetry/segment.ts +++ b/redisinsight/ui/src/telemetry/segment.ts @@ -51,12 +51,12 @@ export class SegmentTelemetryService implements ITelemetryService { return this._anonymousId } - async pageView(name: string, databaseId?: string): Promise { + async pageView(name: string, appType: string, databaseId?: string): Promise { return new Promise((resolve, reject) => { try { const pageInfo = this._getPageInfo() const { page = {} } = { ...pageInfo } - window.analytics.page(name, { databaseId, ...page }, { + window.analytics.page(name, { databaseId, buildType: appType, ...page }, { context: { ip: '0.0.0.0', ...pageInfo diff --git a/redisinsight/ui/src/telemetry/telemetryUtils.ts b/redisinsight/ui/src/telemetry/telemetryUtils.ts index 635e6ef2cf..f09166a565 100644 --- a/redisinsight/ui/src/telemetry/telemetryUtils.ts +++ b/redisinsight/ui/src/telemetry/telemetryUtils.ts @@ -8,7 +8,8 @@ import { Nullable } from 'uiSrc/utils' import { localStorageService } from 'uiSrc/services' import { ApiEndpoints, BrowserStorageItem, KeyTypes } from 'uiSrc/constants' import { KeyViewType } from 'uiSrc/slices/interfaces/keys' -import { checkIsAnalyticsGranted } from 'uiSrc/telemetry/checkAnalytics' +import { StreamViewType } from 'uiSrc/slices/interfaces/stream' +import { checkIsAnalyticsGranted, getAppType } from 'uiSrc/telemetry/checkAnalytics' import { ITelemetrySendEvent, ITelemetrySendPageView, ITelemetryService, MatchType } from './interfaces' import { TelemetryEvent } from './events' import { NON_TRACKING_ANONYMOUS_ID, SegmentTelemetryService } from './segment' @@ -50,10 +51,13 @@ const sendEventTelemetry = (payload: ITelemetrySendEvent) => { const isAnalyticsGranted = checkIsAnalyticsGranted() setAnonymousId(isAnalyticsGranted) + const appType = getAppType() + if (isAnalyticsGranted || nonTracking) { telemetryService?.event({ event, properties: { + buildType: appType, ...eventData, }, }) @@ -72,9 +76,10 @@ const sendPageViewTelemetry = (payload: ITelemetrySendPageView) => { const isAnalyticsGranted = checkIsAnalyticsGranted() setAnonymousId(isAnalyticsGranted) + const appType = getAppType() if (isAnalyticsGranted || nonTracking) { - telemetryService?.pageView(name, databaseId) + telemetryService?.pageView(name, appType, databaseId) } } @@ -164,6 +169,36 @@ const getMatchType = (match: string): MatchType => ( : MatchType.PATTERN ) +export const getRefreshEventData = (eventData: any, type: string, streamViewType?: StreamViewType) => { + if (type === 'stream') { + switch (streamViewType) { + case StreamViewType.Data: + return { + ...eventData, + streamView: 'entries' + } + case StreamViewType.Groups: + return { + ...eventData, + streamView: 'consumer_groups' + } + case StreamViewType.Consumers: + return { + ...eventData, + streamView: 'consumers' + } + case StreamViewType.Messages: + return { + ...eventData, + streamView: 'pending_messages_list' + } + default: + return eventData + } + } + return eventData +} + export { getTelemetryService, sendEventTelemetry, From dc5d72ec4f0708fe0d434da6080811f41aca788c Mon Sep 17 00:00:00 2001 From: Amir Allayarov Date: Fri, 17 Jun 2022 14:56:04 +0400 Subject: [PATCH 2/3] fix test --- redisinsight/ui/src/telemetry/checkAnalytics.ts | 2 +- redisinsight/ui/src/utils/test-utils.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/redisinsight/ui/src/telemetry/checkAnalytics.ts b/redisinsight/ui/src/telemetry/checkAnalytics.ts index 58cda8a433..5ee4be792a 100644 --- a/redisinsight/ui/src/telemetry/checkAnalytics.ts +++ b/redisinsight/ui/src/telemetry/checkAnalytics.ts @@ -5,4 +5,4 @@ import store from 'uiSrc/slices/store' export const checkIsAnalyticsGranted = () => !!get(store.getState(), 'user.settings.config.agreements.analytics', false) -export const getAppType = () => store.getState().app?.info?.server?.appType +export const getAppType = () => get(store.getState(), 'app.info.server.appType') diff --git a/redisinsight/ui/src/utils/test-utils.tsx b/redisinsight/ui/src/utils/test-utils.tsx index 103771e1d1..154a960a0f 100644 --- a/redisinsight/ui/src/utils/test-utils.tsx +++ b/redisinsight/ui/src/utils/test-utils.tsx @@ -163,7 +163,8 @@ jest.mock( jest.mock( 'uiSrc/telemetry/checkAnalytics', () => ({ - checkIsAnalyticsGranted: jest.fn() + checkIsAnalyticsGranted: jest.fn(), + getAppType: jest.fn() }) ) From 33870f3ad251ef7929b73571ac4b54b7e36d0c1d Mon Sep 17 00:00:00 2001 From: Amir Allayarov Date: Fri, 17 Jun 2022 16:43:07 +0400 Subject: [PATCH 3/3] resolve comments --- redisinsight/ui/src/constants/index.ts | 1 + redisinsight/ui/src/constants/streamViews.ts | 8 +++++ .../ui/src/telemetry/telemetryUtils.ts | 30 ++++--------------- 3 files changed, 14 insertions(+), 25 deletions(-) create mode 100644 redisinsight/ui/src/constants/streamViews.ts diff --git a/redisinsight/ui/src/constants/index.ts b/redisinsight/ui/src/constants/index.ts index 5a1c3a006b..466cb1a059 100644 --- a/redisinsight/ui/src/constants/index.ts +++ b/redisinsight/ui/src/constants/index.ts @@ -21,4 +21,5 @@ export * from './mocks/mock-tutorials' export * from './socketErrors' export * from './browser' export * from './durationUnits' +export * from './streamViews' export { ApiEndpoints, BrowserStorageItem, ApiStatusCode, apiErrors } diff --git a/redisinsight/ui/src/constants/streamViews.ts b/redisinsight/ui/src/constants/streamViews.ts new file mode 100644 index 0000000000..922182f73d --- /dev/null +++ b/redisinsight/ui/src/constants/streamViews.ts @@ -0,0 +1,8 @@ +import { StreamViewType } from 'uiSrc/slices/interfaces/stream' + +export const StreamViews = Object.freeze({ + [StreamViewType.Data]: 'entries', + [StreamViewType.Groups]: 'consumer_groups', + [StreamViewType.Consumers]: 'consumers', + [StreamViewType.Messages]: 'pending_messages_list' +}) diff --git a/redisinsight/ui/src/telemetry/telemetryUtils.ts b/redisinsight/ui/src/telemetry/telemetryUtils.ts index f09166a565..e30c77a15c 100644 --- a/redisinsight/ui/src/telemetry/telemetryUtils.ts +++ b/redisinsight/ui/src/telemetry/telemetryUtils.ts @@ -6,7 +6,7 @@ import isGlob from 'is-glob' import * as jsonpath from 'jsonpath' import { Nullable } from 'uiSrc/utils' import { localStorageService } from 'uiSrc/services' -import { ApiEndpoints, BrowserStorageItem, KeyTypes } from 'uiSrc/constants' +import { ApiEndpoints, BrowserStorageItem, KeyTypes, StreamViews } from 'uiSrc/constants' import { KeyViewType } from 'uiSrc/slices/interfaces/keys' import { StreamViewType } from 'uiSrc/slices/interfaces/stream' import { checkIsAnalyticsGranted, getAppType } from 'uiSrc/telemetry/checkAnalytics' @@ -170,30 +170,10 @@ const getMatchType = (match: string): MatchType => ( ) export const getRefreshEventData = (eventData: any, type: string, streamViewType?: StreamViewType) => { - if (type === 'stream') { - switch (streamViewType) { - case StreamViewType.Data: - return { - ...eventData, - streamView: 'entries' - } - case StreamViewType.Groups: - return { - ...eventData, - streamView: 'consumer_groups' - } - case StreamViewType.Consumers: - return { - ...eventData, - streamView: 'consumers' - } - case StreamViewType.Messages: - return { - ...eventData, - streamView: 'pending_messages_list' - } - default: - return eventData + if (type === KeyTypes.Stream) { + return { + ...eventData, + streamView: StreamViews[streamViewType!] } } return eventData