Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions redisinsight/ui/src/constants/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
8 changes: 8 additions & 0 deletions redisinsight/ui/src/constants/streamViews.ts
Original file line number Diff line number Diff line change
@@ -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'
})
Original file line number Diff line number Diff line change
Expand Up @@ -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'

Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = () => {
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
<EmptyMessagesList isSpublishNotSupported />
<EmptyMessagesList connectionType={ConnectionType.Cluster} isSpublishNotSupported={false} />
)

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(
<EmptyMessagesList isSpublishNotSupported={false} />
<EmptyMessagesList connectionType={ConnectionType.Standalone} isSpublishNotSupported />
)

expect(queryByTestId('empty-messages-list-cluster')).not.toBeInTheDocument()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const EmptyMessagesList = ({ connectionType, isSpublishNotSupported }: Props) =>
<EuiIcon type="alert" className={styles.alertIcon} />
Running in production may decrease performance and memory available
</EuiText>
{(connectionType === ConnectionType.Cluster || isSpublishNotSupported) && (
{(connectionType === ConnectionType.Cluster && isSpublishNotSupported) && (
<>
<div className={styles.separator} />
<EuiText className={styles.cluster} data-testid="empty-messages-list-cluster">
Expand Down
2 changes: 2 additions & 0 deletions redisinsight/ui/src/telemetry/checkAnalytics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 = () => get(store.getState(), 'app.info.server.appType')
2 changes: 1 addition & 1 deletion redisinsight/ui/src/telemetry/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export interface ITelemetryIdentify {

export interface ITelemetryService {
initialize(): Promise<void>;
pageView(name: string, databaseId?: string): Promise<void>;
pageView(name: string, appType: string, databaseId?: string): Promise<void>;
identify(opts: ITelemetryIdentify): Promise<void>;
event(opts: ITelemetryEvent): Promise<void>;
anonymousId: string;
Expand Down
4 changes: 2 additions & 2 deletions redisinsight/ui/src/telemetry/segment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ export class SegmentTelemetryService implements ITelemetryService {
return this._anonymousId
}

async pageView(name: string, databaseId?: string): Promise<void> {
async pageView(name: string, appType: string, databaseId?: string): Promise<void> {
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
Expand Down
21 changes: 18 additions & 3 deletions redisinsight/ui/src/telemetry/telemetryUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ 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 { 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'
Expand Down Expand Up @@ -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,
},
})
Expand All @@ -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)
}
}

Expand Down Expand Up @@ -164,6 +169,16 @@ const getMatchType = (match: string): MatchType => (
: MatchType.PATTERN
)

export const getRefreshEventData = (eventData: any, type: string, streamViewType?: StreamViewType) => {
if (type === KeyTypes.Stream) {
return {
...eventData,
streamView: StreamViews[streamViewType!]
}
}
return eventData
}

export {
getTelemetryService,
sendEventTelemetry,
Expand Down
3 changes: 2 additions & 1 deletion redisinsight/ui/src/utils/test-utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,8 @@ jest.mock(
jest.mock(
'uiSrc/telemetry/checkAnalytics',
() => ({
checkIsAnalyticsGranted: jest.fn()
checkIsAnalyticsGranted: jest.fn(),
getAppType: jest.fn()
})
)

Expand Down