Skip to content

Commit a61699f

Browse files
mabaasitmcasimir
authored andcommitted
feat(aggregations): telemetry COMPASS-6177 (#3741)
1 parent 829c816 commit a61699f

File tree

11 files changed

+99
-21
lines changed

11 files changed

+99
-21
lines changed

packages/compass-aggregations/src/components/saved-pipelines/saved-pipeline-card.spec.jsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ import SavedPipelineCard from './saved-pipeline-card';
66
import { createStore } from 'redux';
77
import { Provider } from 'react-redux';
88

9-
const store = createStore(() => {});
9+
const store = createStore(() => {
10+
return {
11+
pipelineBuilder: {
12+
pipelineMode: 'builder-ui'
13+
}
14+
}
15+
});
1016

1117
describe('SavedPipelineCard [Component]', function() {
1218
context('when the component is rendered', function() {

packages/compass-aggregations/src/components/saved-pipelines/saved-pipeline-card.tsx

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,18 @@ import {
1212
KeylineCard,
1313
spacing
1414
} from '@mongodb-js/compass-components';
15+
import type { RootState } from '../../modules';
16+
import {
17+
type EditorViewType,
18+
mapPipelineModeToEditorViewType,
19+
} from '../../modules/pipeline-builder/builder-helpers';
1520

1621
const { track } = createLoggerAndTelemetry('COMPASS-AGGREGATIONS-UI');
1722

1823
type SavePipelineCardProps = {
1924
id: string;
2025
name: string;
26+
editor_view_type: EditorViewType;
2127
onOpenPipelineConfirm: (id: string) => void;
2228
onDeletePipeline: (id: string) => void;
2329
};
@@ -51,6 +57,7 @@ const button = css({
5157
const SavePipelineCard: React.FunctionComponent<SavePipelineCardProps> = ({
5258
id,
5359
name,
60+
editor_view_type,
5461
onOpenPipelineConfirm,
5562
onDeletePipeline
5663
}) => {
@@ -59,16 +66,21 @@ const SavePipelineCard: React.FunctionComponent<SavePipelineCardProps> = ({
5966
const onDelete = useCallback(() => {
6067
track('Aggregation Deleted', {
6168
id,
62-
screen: 'aggregations'
69+
editor_view_type,
70+
screen: 'aggregations',
6371
});
6472
onDeletePipeline(id);
65-
}, [id, onDeletePipeline]);
73+
}, [id, editor_view_type, onDeletePipeline]);
6674

6775
const onOpenConfirm = useCallback(() => {
68-
track('Aggregation Opened', { id, screen: 'aggregations' });
76+
track('Aggregation Opened', {
77+
id,
78+
editor_view_type,
79+
screen: 'aggregations',
80+
});
6981
setShowConfirmModal(false);
7082
onOpenPipelineConfirm(id);
71-
}, [id, onOpenPipelineConfirm]);
83+
}, [id, editor_view_type, onOpenPipelineConfirm]);
7284

7385
return (
7486
<>
@@ -123,7 +135,14 @@ const SavePipelineCard: React.FunctionComponent<SavePipelineCardProps> = ({
123135
);
124136
};
125137

126-
export default connect(null, {
127-
onOpenPipelineConfirm: openPipelineById,
128-
onDeletePipeline: deletePipeline
129-
})(SavePipelineCard);
138+
export default connect(
139+
(state: RootState) => ({
140+
editor_view_type: mapPipelineModeToEditorViewType(
141+
state.pipelineBuilder.pipelineMode
142+
),
143+
}),
144+
{
145+
onOpenPipelineConfirm: openPipelineById,
146+
onDeletePipeline: deletePipeline,
147+
}
148+
)(SavePipelineCard);

packages/compass-aggregations/src/components/saved-pipelines/saved-pipelines.spec.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import { createStore } from 'redux';
88

99
const emptyStateTestId = 'p[data-testid="saved-pipelines-empty-state"]';
1010

11-
const store = createStore(() => {})
11+
const store = createStore(() => ({
12+
pipelineBuilder: {
13+
pipelinMode: 'builder-ui',
14+
}
15+
}));
1216

1317
describe('SavedPipelines [Component]', function() {
1418
context('when the component is rendered', function() {

packages/compass-aggregations/src/components/stage-editor-toolbar/delete-stage.spec.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ describe('DeleteStage [Component]', function() {
5454
component = null;
5555
});
5656

57-
it('toggles the expansion and flags as modified', function() {
57+
it('calls delete handler when clicked', function() {
5858
component.find('button').simulate('click');
5959
expect(spy.calledWith(1)).to.equal(true);
6060
});

packages/compass-aggregations/src/modules/aggregation.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { aggregatePipeline } from '../utils/cancellable-aggregation';
88
import { ActionTypes as WorkspaceActionTypes } from './workspace';
99
import { createLoggerAndTelemetry } from '@mongodb-js/compass-logging';
1010
import { NEW_PIPELINE } from './import-pipeline';
11-
import { getPipelineFromBuilderState } from './pipeline-builder/builder-helpers';
11+
import { getPipelineFromBuilderState, mapPipelineModeToEditorViewType } from './pipeline-builder/builder-helpers';
1212
import { getStageOperator } from '../utils/stage';
1313

1414
const { log, mongoLogId, track } = createLoggerAndTelemetry(
@@ -182,7 +182,8 @@ export const runAggregation = (): PipelineBuilderThunkAction<Promise<void>> => {
182182
pipeline,
183183
})
184184
track('Aggregation Executed', () => ({
185-
num_stages: pipeline.length
185+
num_stages: pipeline.length,
186+
editor_view_type: mapPipelineModeToEditorViewType(getState().pipelineBuilder.pipelineMode),
186187
}));
187188
return dispatch(fetchAggregationData());
188189
};

packages/compass-aggregations/src/modules/explain.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { PipelineBuilderThunkAction } from '.';
88
import { DEFAULT_MAX_TIME_MS } from '../constants';
99
import type { IndexInfo } from './indexes';
1010
import { NEW_PIPELINE } from './import-pipeline';
11-
import { getPipelineFromBuilderState } from './pipeline-builder/builder-helpers';
11+
import { getPipelineFromBuilderState, mapPipelineModeToEditorViewType } from './pipeline-builder/builder-helpers';
1212

1313
const { log, mongoLogId, track } = createLoggerAndTelemetry(
1414
'COMPASS-AGGREGATIONS-UI'
@@ -132,7 +132,8 @@ export const explainAggregation = (): PipelineBuilderThunkAction<Promise<void>>
132132
maxTimeMS,
133133
dataService: { dataService },
134134
indexes: collectionIndexes,
135-
collationString: { value: collation }
135+
collationString: { value: collation },
136+
pipelineBuilder: { pipelineMode },
136137
} = getState();
137138

138139
if (!dataService) {
@@ -192,6 +193,7 @@ export const explainAggregation = (): PipelineBuilderThunkAction<Promise<void>>
192193
track('Aggregation Explained', {
193194
num_stages: pipeline.length,
194195
index_used: explain.stats?.indexes?.length ?? 0,
196+
editor_view_type: mapPipelineModeToEditorViewType(pipelineMode),
195197
});
196198
// If parsing fails, we still show raw explain json.
197199
dispatch({

packages/compass-aggregations/src/modules/pipeline-builder/builder-helpers.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { PipelineBuilderThunkAction, RootState } from '..';
22
import type { PipelineBuilder } from './pipeline-builder';
3+
import type { PipelineMode } from './pipeline-mode';
34
import { loadPreviewForStagesFrom } from './stage-editor';
45
import { loadPreviewForPipeline } from './text-editor-pipeline';
56

@@ -74,3 +75,8 @@ export function getIsPipelineInvalidFromBuilderState(
7475
const { serverError, syntaxErrors } = state.pipelineBuilder.textEditor.pipeline;
7576
return Boolean((serverError && includeServerErrors) || syntaxErrors.length > 0);
7677
}
78+
79+
export type EditorViewType = 'stage' | 'text';
80+
export function mapPipelineModeToEditorViewType(mode: PipelineMode): EditorViewType {
81+
return mode === 'builder-ui' ? 'stage' : 'text';
82+
}

packages/compass-aggregations/src/modules/pipeline-builder/pipeline-mode.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ import type { Reducer } from 'redux';
22
import type { Document } from 'mongodb';
33
import type { PipelineBuilderThunkAction } from '..';
44
import { isAction } from '../../utils/is-action';
5-
import { updatePipelinePreview } from './builder-helpers';
5+
import { getPipelineFromBuilderState, mapPipelineModeToEditorViewType, updatePipelinePreview } from './builder-helpers';
66
import type Stage from './stage';
77
import type { PipelineParserError } from './pipeline-parser/utils';
8+
import { createLoggerAndTelemetry } from '@mongodb-js/compass-logging';
9+
10+
const { track } = createLoggerAndTelemetry('COMPASS-AGGREGATIONS-UI');
811

912
export type PipelineMode = 'builder-ui' | 'as-text';
1013

@@ -46,6 +49,12 @@ export const changePipelineMode = (
4649
pipelineBuilder.sourceToStages();
4750
}
4851

52+
const num_stages = getPipelineFromBuilderState(getState(), pipelineBuilder).length;
53+
track('Editor Type Changed', {
54+
num_stages,
55+
editor_view_type: mapPipelineModeToEditorViewType(newMode),
56+
});
57+
4958
dispatch({
5059
type: ActionTypes.PipelineModeToggled,
5160
mode: newMode,

packages/compass-aggregations/src/modules/pipeline-builder/stage-editor.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { aggregatePipeline } from '../../utils/cancellable-aggregation';
1919
import type { PipelineParserError } from './pipeline-parser/utils';
2020
import { ActionTypes as PipelineModeActionTypes } from './pipeline-mode';
2121
import type { PipelineModeToggledAction } from './pipeline-mode';
22+
import { createLoggerAndTelemetry } from '@mongodb-js/compass-logging';
23+
const { track } = createLoggerAndTelemetry('COMPASS-AGGREGATIONS-UI');
2224

2325
export const enum StageEditorActionTypes {
2426
StagePreviewFetch = 'compass-aggregations/pipeline-builder/stage-editor/StagePreviewFetch',
@@ -368,6 +370,12 @@ export const changeStageOperator = (
368370
const currentOp = stage.operator;
369371

370372
stage.changeOperator(newVal);
373+
track('Aggregation Edited', {
374+
num_stages: stages.length,
375+
stage_action: 'stage_renamed',
376+
stage_name: stage.operator,
377+
editor_view_type: 'stage',
378+
});
371379
dispatch({ type: StageEditorActionTypes.StageOperatorChange, id, stage });
372380

373381
// If there is no stage operator (this is a newly added stage) or current
@@ -417,6 +425,11 @@ export const addStage = (
417425
): PipelineBuilderThunkAction<void, StageAddAction> => {
418426
return (dispatch, getState, { pipelineBuilder }) => {
419427
const stage = pipelineBuilder.addStage(after);
428+
track('Aggregation Edited', {
429+
num_stages: getState().pipelineBuilder.stageEditor.stages.length,
430+
stage_action: 'stage_added',
431+
editor_view_type: 'stage',
432+
});
420433
dispatch({ type: StageEditorActionTypes.StageAdded, after, stage });
421434
};
422435
};
@@ -425,7 +438,14 @@ export const removeStage = (
425438
at: number
426439
): PipelineBuilderThunkAction<void, StageRemoveAction> => {
427440
return (dispatch, getState, { pipelineBuilder }) => {
428-
pipelineBuilder.removeStage(at);
441+
const num_stages = getState().pipelineBuilder.stageEditor.stages.length;
442+
const stage = pipelineBuilder.removeStage(at);
443+
track('Aggregation Edited', {
444+
num_stages,
445+
stage_action: 'stage_deleted',
446+
stage_name: stage.operator,
447+
editor_view_type: 'stage',
448+
});
429449
dispatch({ type: StageEditorActionTypes.StageRemoved, at });
430450
dispatch(loadPreviewForStagesFrom(at));
431451
};
@@ -439,6 +459,13 @@ export const moveStage = (
439459
if (from === to) {
440460
return;
441461
}
462+
const pipeline = getState().pipelineBuilder.stageEditor.stages;
463+
track('Aggregation Edited', {
464+
num_stages: pipeline.length,
465+
stage_action: 'stage_reordered',
466+
stage_name: pipeline[from].stageOperator,
467+
editor_view_type: 'stage',
468+
});
442469
pipelineBuilder.moveStage(from, to);
443470
dispatch({ type: StageEditorActionTypes.StageMoved, from, to });
444471
dispatch(loadPreviewForStagesFrom(Math.min(from, to)));

packages/compass-aggregations/src/modules/saved-pipeline.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { AnyAction } from 'redux';
44
import { createId } from './id';
55
import type { PipelineBuilderThunkAction } from '.';
66
import type { StoredPipeline } from '../utils/pipeline-storage';
7-
import { getPipelineFromBuilderState, getPipelineStringFromBuilderState } from './pipeline-builder/builder-helpers';
7+
import { getPipelineFromBuilderState, getPipelineStringFromBuilderState, mapPipelineModeToEditorViewType } from './pipeline-builder/builder-helpers';
88
import { updatePipelinePreview } from './pipeline-builder/builder-helpers';
99

1010
const { track, debug } = createLoggerAndTelemetry('COMPASS-AGGREGATIONS-UI');
@@ -175,7 +175,8 @@ export const saveCurrentPipeline = (): PipelineBuilderThunkAction<void> => async
175175

176176
track('Aggregation Saved', {
177177
id: savedPipeline.id,
178-
num_stages: getPipelineFromBuilderState(getState(), pipelineBuilder).length
178+
num_stages: getPipelineFromBuilderState(getState(), pipelineBuilder).length,
179+
editor_view_type: mapPipelineModeToEditorViewType(getState().pipelineBuilder.pipelineMode)
179180
});
180181

181182
dispatch(updatePipelineList());

0 commit comments

Comments
 (0)