Skip to content

Commit 8ce486a

Browse files
authored
chore(telemetry): add device ID to compass telemetry COMPASS-8443 (#6889)
1 parent 9e054e4 commit 8ce486a

15 files changed

+100
-49
lines changed

.github/dependabot.yml

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ updates:
1515
- dependency-name: "@mongosh/*"
1616
- dependency-name: "@mongodb-js/*"
1717
- dependency-name: os-dns-native
18+
- dependency-name: native-machine-id
1819
- dependency-name: system-ca
1920

2021
# All the electron and its related deps
@@ -36,6 +37,7 @@ updates:
3637
- "mongodb-client-encryption"
3738
- "kerberos"
3839
- "os-dns-native"
40+
- "native-machine-id"
3941
- "system-ca"
4042
- "saslprep"
4143

configs/webpack-config-compass/src/externals.ts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export const sharedExternals: string[] = [
1212
'keytar',
1313
'kerberos',
1414
'interruptor',
15+
'native-machine-id',
1516
'os-dns-native',
1617
'system-ca',
1718
'win-export-certificate-and-key',

docs/tracking-plan.md

+2
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ Traits sent along with the Segment identify call
230230
- **arch** (required): `string`
231231
- The architecture of the system's processor, derived from Node.js `os.arch()`.
232232
'x64' for 64-bit processors and 'arm' for ARM processors.
233+
- **device_id** (required): `string`
234+
- A unique identifier for the device running Compass. Set to `"unknown"` if not available.
233235
- **os_type** (optional): `string | undefined`
234236
- The type of operating system, including specific operating system
235237
names or types (e.g., 'Linux', 'Windows_NT', 'Darwin').

package-lock.json

+15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/compass-e2e-tests/helpers/telemetry.ts

+9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { EJSON } from 'bson';
55
import type { MongoLogEntry } from 'mongodb-log-writer';
66
import { TEST_COMPASS_WEB } from './compass';
77
import type { CompassBrowser } from './compass-browser';
8+
import { expect } from 'chai';
89

910
export type Telemetry = {
1011
requests: any[];
@@ -109,3 +110,11 @@ export async function startTelemetryServer(): Promise<Telemetry> {
109110
screens,
110111
};
111112
}
113+
114+
export function deleteCommonVariedProperties(entry: unknown): void {
115+
expect(entry).to.have.property('connection_id');
116+
delete (entry as { connection_id: unknown }).connection_id;
117+
118+
// Device ID is not set in all track events so we delete without asserting.
119+
delete (entry as { device_id: unknown }).device_id;
120+
}

packages/compass-e2e-tests/tests/collection-bulk-delete.test.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { expect } from 'chai';
22
import type { CompassBrowser } from '../helpers/compass-browser';
3-
import { startTelemetryServer } from '../helpers/telemetry';
3+
import {
4+
deleteCommonVariedProperties,
5+
startTelemetryServer,
6+
} from '../helpers/telemetry';
47
import type { Telemetry } from '../helpers/telemetry';
58
import {
69
init,
@@ -59,8 +62,7 @@ describe('Bulk Delete', function () {
5962
// Check the telemetry
6063
const openedEvent = await telemetryEntry('Bulk Delete Opened');
6164

62-
expect(openedEvent.connection_id).to.exist;
63-
delete openedEvent.connection_id; // connection_id varies
65+
deleteCommonVariedProperties(openedEvent);
6466

6567
expect(openedEvent).to.deep.equal({});
6668

@@ -95,8 +97,7 @@ describe('Bulk Delete', function () {
9597

9698
// this id is always different, because the connection is not a saved one
9799
// so we just check it exists for simplicity
98-
expect(executedEvent.connection_id).to.exist;
99-
delete executedEvent.connection_id;
100+
deleteCommonVariedProperties(executedEvent);
100101

101102
expect(executedEvent).to.deep.equal({});
102103

@@ -177,8 +178,7 @@ describe('Bulk Delete', function () {
177178
// Check the telemetry
178179
const openedEvent = await telemetryEntry('Delete Export Opened');
179180

180-
expect(openedEvent.connection_id).to.exist;
181-
delete openedEvent.connection_id; // connection_id varies
181+
deleteCommonVariedProperties(openedEvent);
182182

183183
expect(openedEvent).to.deep.equal({});
184184

packages/compass-e2e-tests/tests/collection-bulk-update.test.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { expect } from 'chai';
22
import type { CompassBrowser } from '../helpers/compass-browser';
3-
import { startTelemetryServer } from '../helpers/telemetry';
3+
import {
4+
deleteCommonVariedProperties,
5+
startTelemetryServer,
6+
} from '../helpers/telemetry';
47
import type { Telemetry } from '../helpers/telemetry';
58
import {
69
init,
@@ -59,8 +62,7 @@ describe('Bulk Update', () => {
5962
// Check the telemetry
6063
const openedEvent = await telemetryEntry('Bulk Update Opened');
6164

62-
expect(openedEvent.connection_id).to.exist;
63-
delete openedEvent.connection_id; // connection_id varies
65+
deleteCommonVariedProperties(openedEvent);
6466

6567
expect(openedEvent).to.deep.equal({
6668
isUpdatePreviewSupported: true,
@@ -125,8 +127,7 @@ describe('Bulk Update', () => {
125127
// Check the telemetry
126128
const executedEvent = await telemetryEntry('Bulk Update Executed');
127129

128-
expect(executedEvent.connection_id).to.exist;
129-
delete executedEvent.connection_id; // connection_id varies
130+
deleteCommonVariedProperties(executedEvent);
130131

131132
expect(executedEvent).to.deep.equal({
132133
isUpdatePreviewSupported: true,
@@ -173,8 +174,7 @@ describe('Bulk Update', () => {
173174
// Check the telemetry
174175
const favoritedEvent = await telemetryEntry('Bulk Update Favorited');
175176

176-
expect(favoritedEvent.connection_id).to.exist;
177-
delete favoritedEvent.connection_id; // connection_id varies
177+
deleteCommonVariedProperties(favoritedEvent);
178178

179179
expect(favoritedEvent).to.deep.equal({
180180
isUpdatePreviewSupported: true,

packages/compass-e2e-tests/tests/collection-documents-tab.test.ts

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import chai from 'chai';
22
import clipboard from 'clipboardy';
33
import type { CompassBrowser } from '../helpers/compass-browser';
4-
import { startTelemetryServer } from '../helpers/telemetry';
4+
import {
5+
deleteCommonVariedProperties,
6+
startTelemetryServer,
7+
} from '../helpers/telemetry';
58
import type { Telemetry } from '../helpers/telemetry';
69
import {
710
init,
@@ -168,8 +171,7 @@ describe('Collection documents tab', function () {
168171
// Check the telemetry
169172
const queryExecutedEvent = await telemetryEntry('Query Executed');
170173

171-
expect(queryExecutedEvent.connection_id).to.exist;
172-
delete queryExecutedEvent.connection_id; // connection_id varies
174+
deleteCommonVariedProperties(queryExecutedEvent);
173175

174176
expect(queryExecutedEvent).to.deep.equal({
175177
changed_maxtimems: false,
@@ -208,8 +210,7 @@ describe('Collection documents tab', function () {
208210
// Check the telemetry
209211
const queryExecutedEvent = await telemetryEntry('Query Executed');
210212

211-
expect(queryExecutedEvent.connection_id).to.exist;
212-
delete queryExecutedEvent.connection_id; // connection_id varies
213+
deleteCommonVariedProperties(queryExecutedEvent);
213214

214215
expect(queryExecutedEvent).to.deep.equal({
215216
changed_maxtimems: false,

packages/compass-e2e-tests/tests/collection-export.test.ts

+17-27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import { promises as fs } from 'fs';
22
import { expect } from 'chai';
33
import type { CompassBrowser } from '../helpers/compass-browser';
4-
import { startTelemetryServer } from '../helpers/telemetry';
4+
import {
5+
deleteCommonVariedProperties,
6+
startTelemetryServer,
7+
} from '../helpers/telemetry';
58
import type { Telemetry } from '../helpers/telemetry';
69
import {
710
init,
@@ -143,8 +146,7 @@ describe('Collection export', function () {
143146

144147
const exportCompletedEvent = await telemetryEntry('Export Completed');
145148
delete exportCompletedEvent.duration; // Duration varies.
146-
expect(exportCompletedEvent.connection_id).to.exist;
147-
delete exportCompletedEvent.connection_id; // connection_id varies
149+
deleteCommonVariedProperties(exportCompletedEvent);
148150
expect(exportCompletedEvent).to.deep.equal({
149151
all_docs: false,
150152
has_projection: false,
@@ -214,8 +216,7 @@ describe('Collection export', function () {
214216

215217
const exportCompletedEvent = await telemetryEntry('Export Completed');
216218
delete exportCompletedEvent.duration; // Duration varies.
217-
expect(exportCompletedEvent.connection_id).to.exist;
218-
delete exportCompletedEvent.connection_id; // connection_id varies
219+
deleteCommonVariedProperties(exportCompletedEvent);
219220
expect(exportCompletedEvent).to.deep.equal({
220221
all_docs: false,
221222
has_projection: false,
@@ -283,8 +284,7 @@ describe('Collection export', function () {
283284

284285
const exportCompletedEvent = await telemetryEntry('Export Completed');
285286
delete exportCompletedEvent.duration; // Duration varies.
286-
expect(exportCompletedEvent.connection_id).to.exist;
287-
delete exportCompletedEvent.connection_id; // connection_id varies
287+
deleteCommonVariedProperties(exportCompletedEvent);
288288
expect(exportCompletedEvent).to.deep.equal({
289289
all_docs: false,
290290
has_projection: true,
@@ -337,8 +337,7 @@ describe('Collection export', function () {
337337

338338
const exportCompletedEvent = await telemetryEntry('Export Completed');
339339
delete exportCompletedEvent.duration; // Duration varies.
340-
expect(exportCompletedEvent.connection_id).to.exist;
341-
delete exportCompletedEvent.connection_id; // connection_id varies
340+
deleteCommonVariedProperties(exportCompletedEvent);
342341
expect(exportCompletedEvent).to.deep.equal({
343342
all_docs: true,
344343
file_type: 'csv',
@@ -411,8 +410,7 @@ describe('Collection export', function () {
411410

412411
const exportCompletedEvent = await telemetryEntry('Export Completed');
413412
delete exportCompletedEvent.duration; // Duration varies.
414-
expect(exportCompletedEvent.connection_id).to.exist;
415-
delete exportCompletedEvent.connection_id; // connection_id varies
413+
deleteCommonVariedProperties(exportCompletedEvent);
416414
expect(exportCompletedEvent).to.deep.equal({
417415
all_docs: false,
418416
file_type: 'json',
@@ -480,8 +478,7 @@ describe('Collection export', function () {
480478

481479
const exportCompletedEvent = await telemetryEntry('Export Completed');
482480
delete exportCompletedEvent.duration; // Duration varies.
483-
expect(exportCompletedEvent.connection_id).to.exist;
484-
delete exportCompletedEvent.connection_id; // connection_id varies
481+
deleteCommonVariedProperties(exportCompletedEvent);
485482
expect(exportCompletedEvent).to.deep.equal({
486483
all_docs: false,
487484
file_type: 'json',
@@ -534,8 +531,7 @@ describe('Collection export', function () {
534531

535532
const exportCompletedEvent = await telemetryEntry('Export Completed');
536533
delete exportCompletedEvent.duration; // Duration varies.
537-
expect(exportCompletedEvent.connection_id).to.exist;
538-
delete exportCompletedEvent.connection_id; // connection_id varies
534+
deleteCommonVariedProperties(exportCompletedEvent);
539535
expect(exportCompletedEvent).to.deep.equal({
540536
all_docs: true,
541537
file_type: 'json',
@@ -590,8 +586,7 @@ describe('Collection export', function () {
590586

591587
const exportCompletedEvent = await telemetryEntry('Export Completed');
592588
delete exportCompletedEvent.duration; // Duration varies.
593-
expect(exportCompletedEvent.connection_id).to.exist;
594-
delete exportCompletedEvent.connection_id; // connection_id varies
589+
deleteCommonVariedProperties(exportCompletedEvent);
595590
expect(exportCompletedEvent).to.deep.equal({
596591
all_docs: true,
597592
file_type: 'json',
@@ -681,8 +676,7 @@ describe('Collection export', function () {
681676

682677
const exportCompletedEvent = await telemetryEntry('Export Completed');
683678
delete exportCompletedEvent.duration; // Duration varies.
684-
expect(exportCompletedEvent.connection_id).to.exist;
685-
delete exportCompletedEvent.connection_id; // connection_id varies
679+
deleteCommonVariedProperties(exportCompletedEvent);
686680
expect(exportCompletedEvent).to.deep.equal({
687681
all_docs: false,
688682
file_type: 'csv',
@@ -768,8 +762,7 @@ describe('Collection export', function () {
768762

769763
const exportCompletedEvent = await telemetryEntry('Export Completed');
770764
delete exportCompletedEvent.duration; // Duration varies.
771-
expect(exportCompletedEvent.connection_id).to.exist;
772-
delete exportCompletedEvent.connection_id; // connection_id varies
765+
deleteCommonVariedProperties(exportCompletedEvent);
773766
expect(exportCompletedEvent).to.deep.equal({
774767
all_docs: false,
775768
file_type: 'json',
@@ -863,8 +856,7 @@ describe('Collection export', function () {
863856

864857
const exportCompletedEvent = await telemetryEntry('Export Completed');
865858
delete exportCompletedEvent.duration; // Duration varies.
866-
expect(exportCompletedEvent.connection_id).to.exist;
867-
delete exportCompletedEvent.connection_id; // connection_id varies
859+
deleteCommonVariedProperties(exportCompletedEvent);
868860
expect(exportCompletedEvent).to.deep.equal({
869861
all_docs: false,
870862
file_type: 'csv',
@@ -978,8 +970,7 @@ describe('Collection export', function () {
978970

979971
const exportCompletedEvent = await telemetryEntry('Export Completed');
980972
delete exportCompletedEvent.duration; // Duration varies.
981-
expect(exportCompletedEvent.connection_id).to.exist;
982-
delete exportCompletedEvent.connection_id; // connection_id varies
973+
deleteCommonVariedProperties(exportCompletedEvent);
983974
expect(exportCompletedEvent).to.deep.equal({
984975
all_docs: false,
985976
file_type: 'csv',
@@ -1081,8 +1072,7 @@ describe('Collection export', function () {
10811072

10821073
const exportCompletedEvent = await telemetryEntry('Export Completed');
10831074
delete exportCompletedEvent.duration; // Duration varies.
1084-
expect(exportCompletedEvent.connection_id).to.exist;
1085-
delete exportCompletedEvent.connection_id; // connection_id varies
1075+
deleteCommonVariedProperties(exportCompletedEvent);
10861076
expect(exportCompletedEvent).to.deep.equal({
10871077
all_docs: false,
10881078
file_type: 'json',

packages/compass-e2e-tests/tests/collection-import.test.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ import {
1414
} from '../helpers/compass';
1515
import type { Compass } from '../helpers/compass';
1616
import * as Selectors from '../helpers/selectors';
17-
import { startTelemetryServer } from '../helpers/telemetry';
17+
import {
18+
deleteCommonVariedProperties,
19+
startTelemetryServer,
20+
} from '../helpers/telemetry';
1821
import type { Telemetry } from '../helpers/telemetry';
1922
import {
2023
createDummyCollections,
@@ -752,8 +755,7 @@ describe('Collection import', function () {
752755

753756
const importCompletedEvent = await telemetryEntry('Import Completed');
754757
delete importCompletedEvent.duration; // Duration varies.
755-
expect(importCompletedEvent.connection_id).to.exist;
756-
delete importCompletedEvent.connection_id; // connection_id varies
758+
deleteCommonVariedProperties(importCompletedEvent);
757759
expect(importCompletedEvent).to.deep.equal({
758760
delimiter: ',',
759761
newline: '\n',

0 commit comments

Comments
 (0)