Skip to content

Commit 5df10b6

Browse files
committed
feat(telemetry): add device ID logging
1 parent bc5cfd6 commit 5df10b6

File tree

6 files changed

+53
-5
lines changed

6 files changed

+53
-5
lines changed

package-lock.json

Lines changed: 5 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/logging/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
"@mongosh/history": "2.4.6",
2323
"@mongosh/types": "3.6.0",
2424
"mongodb-log-writer": "^2.3.1",
25-
"mongodb-redact": "^1.1.5"
25+
"mongodb-redact": "^1.1.5",
26+
"node-machine-id": "^1.1.12"
2627
},
2728
"devDependencies": {
2829
"@mongodb-js/eslint-config-mongosh": "^1.0.0",

packages/logging/src/analytics-helpers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import path from 'path';
33

44
export type MongoshAnalyticsIdentity =
55
| {
6+
deviceId?: string;
67
userId: string;
78
anonymousId?: never;
89
}
910
| {
11+
deviceId?: string;
1012
userId?: never;
1113
anonymousId: string;
1214
};

packages/logging/src/logging-and-telemetry.spec.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ describe('MongoshLoggingAndTelemetry', function () {
4040
loggingAndTelemetry = setupLoggingAndTelemetry({
4141
bus,
4242
analytics,
43+
deviceId: 'test-device',
4344
userTraits: {
4445
platform: process.platform,
4546
arch: process.arch,
@@ -105,6 +106,7 @@ describe('MongoshLoggingAndTelemetry', function () {
105106
'identify',
106107
{
107108
anonymousId: userId,
109+
deviceId: 'test-device',
108110
traits: {
109111
arch: process.arch,
110112
platform: process.platform,
@@ -116,6 +118,7 @@ describe('MongoshLoggingAndTelemetry', function () {
116118
'track',
117119
{
118120
anonymousId: userId,
121+
deviceId: 'test-device',
119122
event: 'New Connection',
120123
properties: {
121124
mongosh_version: '1.0.0',
@@ -163,6 +166,7 @@ describe('MongoshLoggingAndTelemetry', function () {
163166
'identify',
164167
{
165168
anonymousId: userId,
169+
deviceId: 'test-device',
166170
traits: {
167171
arch: process.arch,
168172
platform: process.platform,
@@ -174,6 +178,7 @@ describe('MongoshLoggingAndTelemetry', function () {
174178
'track',
175179
{
176180
anonymousId: userId,
181+
deviceId: 'test-device',
177182
event: 'New Connection',
178183
properties: {
179184
mongosh_version: '1.0.0',
@@ -576,6 +581,7 @@ describe('MongoshLoggingAndTelemetry', function () {
576581
'identify',
577582
{
578583
anonymousId: '53defe995fa47e6c13102d9d',
584+
deviceId: 'test-device',
579585
traits: {
580586
platform: process.platform,
581587
arch: process.arch,
@@ -587,6 +593,7 @@ describe('MongoshLoggingAndTelemetry', function () {
587593
'identify',
588594
{
589595
anonymousId: '53defe995fa47e6c13102d9d',
596+
deviceId: 'test-device',
590597
traits: {
591598
platform: process.platform,
592599
arch: process.arch,
@@ -598,6 +605,7 @@ describe('MongoshLoggingAndTelemetry', function () {
598605
'track',
599606
{
600607
anonymousId: '53defe995fa47e6c13102d9d',
608+
deviceId: 'test-device',
601609
event: 'Startup Time',
602610
properties: {
603611
is_interactive: true,
@@ -613,6 +621,7 @@ describe('MongoshLoggingAndTelemetry', function () {
613621
'track',
614622
{
615623
anonymousId: '53defe995fa47e6c13102d9d',
624+
deviceId: 'test-device',
616625
event: 'Error',
617626
properties: {
618627
mongosh_version: '1.0.0',
@@ -628,6 +637,7 @@ describe('MongoshLoggingAndTelemetry', function () {
628637
'track',
629638
{
630639
anonymousId: '53defe995fa47e6c13102d9d',
640+
deviceId: 'test-device',
631641
event: 'Error',
632642
properties: {
633643
mongosh_version: '1.0.0',
@@ -643,6 +653,7 @@ describe('MongoshLoggingAndTelemetry', function () {
643653
'track',
644654
{
645655
anonymousId: '53defe995fa47e6c13102d9d',
656+
deviceId: 'test-device',
646657
event: 'Use',
647658
properties: {
648659
mongosh_version: '1.0.0',
@@ -654,6 +665,7 @@ describe('MongoshLoggingAndTelemetry', function () {
654665
'track',
655666
{
656667
anonymousId: '53defe995fa47e6c13102d9d',
668+
deviceId: 'test-device',
657669
event: 'Show',
658670
properties: {
659671
mongosh_version: '1.0.0',
@@ -673,6 +685,7 @@ describe('MongoshLoggingAndTelemetry', function () {
673685
shell: true,
674686
},
675687
anonymousId: '53defe995fa47e6c13102d9d',
688+
deviceId: 'test-device',
676689
},
677690
],
678691
[
@@ -685,6 +698,7 @@ describe('MongoshLoggingAndTelemetry', function () {
685698
nested: false,
686699
},
687700
anonymousId: '53defe995fa47e6c13102d9d',
701+
deviceId: 'test-device',
688702
},
689703
],
690704
[
@@ -696,6 +710,7 @@ describe('MongoshLoggingAndTelemetry', function () {
696710
session_id: logId,
697711
},
698712
anonymousId: '53defe995fa47e6c13102d9d',
713+
deviceId: 'test-device',
699714
},
700715
],
701716
[
@@ -707,6 +722,7 @@ describe('MongoshLoggingAndTelemetry', function () {
707722
session_id: logId,
708723
},
709724
anonymousId: '53defe995fa47e6c13102d9d',
725+
deviceId: 'test-device',
710726
},
711727
],
712728
[
@@ -719,12 +735,14 @@ describe('MongoshLoggingAndTelemetry', function () {
719735
shell: true,
720736
},
721737
anonymousId: '53defe995fa47e6c13102d9d',
738+
deviceId: 'test-device',
722739
},
723740
],
724741
[
725742
'track',
726743
{
727744
anonymousId: '53defe995fa47e6c13102d9d',
745+
deviceId: 'test-device',
728746
event: 'Snippet Install',
729747
properties: {
730748
mongosh_version: '1.0.0',
@@ -819,6 +837,7 @@ describe('MongoshLoggingAndTelemetry', function () {
819837
'track',
820838
{
821839
anonymousId: '53defe995fa47e6c13102d9d',
840+
deviceId: 'test-device',
822841
event: 'Deprecated Method',
823842
properties: {
824843
mongosh_version: '1.0.0',
@@ -832,6 +851,7 @@ describe('MongoshLoggingAndTelemetry', function () {
832851
'track',
833852
{
834853
anonymousId: '53defe995fa47e6c13102d9d',
854+
deviceId: 'test-device',
835855
event: 'Deprecated Method',
836856
properties: {
837857
mongosh_version: '1.0.0',
@@ -845,6 +865,7 @@ describe('MongoshLoggingAndTelemetry', function () {
845865
'track',
846866
{
847867
anonymousId: '53defe995fa47e6c13102d9d',
868+
deviceId: 'test-device',
848869
event: 'Deprecated Method',
849870
properties: {
850871
mongosh_version: '1.0.0',
@@ -858,6 +879,7 @@ describe('MongoshLoggingAndTelemetry', function () {
858879
'track',
859880
{
860881
anonymousId: '53defe995fa47e6c13102d9d',
882+
deviceId: 'test-device',
861883
event: 'API Call',
862884
properties: {
863885
mongosh_version: '1.0.0',
@@ -872,6 +894,7 @@ describe('MongoshLoggingAndTelemetry', function () {
872894
'track',
873895
{
874896
anonymousId: '53defe995fa47e6c13102d9d',
897+
deviceId: 'test-device',
875898
event: 'API Call',
876899
properties: {
877900
mongosh_version: '1.0.0',
@@ -1023,6 +1046,7 @@ describe('MongoshLoggingAndTelemetry', function () {
10231046
'track',
10241047
{
10251048
anonymousId: undefined,
1049+
deviceId: 'test-device',
10261050
event: 'New Connection',
10271051
properties: {
10281052
mongosh_version: '1.0.0',

packages/logging/src/logging-and-telemetry.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,23 @@ import type {
5252
MongoshLoggingAndTelemetryArguments,
5353
MongoshTrackingProperties,
5454
} from './types';
55+
import { machineIdSync } from 'node-machine-id';
5556

5657
export function setupLoggingAndTelemetry(
5758
props: MongoshLoggingAndTelemetryArguments
5859
): MongoshLoggingAndTelemetry {
60+
if (!props.deviceId) {
61+
try {
62+
props.deviceId = machineIdSync();
63+
} catch (error) {
64+
props.bus.emit(
65+
'mongosh:error',
66+
new Error('Failed to get device ID'),
67+
'telemetry'
68+
);
69+
}
70+
}
71+
5972
const loggingAndTelemetry = new LoggingAndTelemetry(props);
6073

6174
loggingAndTelemetry.setup();
@@ -80,6 +93,7 @@ class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
8093
[key: string]: unknown;
8194
};
8295
private readonly mongoshVersion: string;
96+
private readonly deviceId: string | undefined;
8397

8498
private log: MongoLogWriter;
8599
private pendingLogEvents: CallableFunction[] = [];
@@ -91,12 +105,14 @@ class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
91105
analytics,
92106
userTraits,
93107
mongoshVersion,
108+
deviceId,
94109
}: MongoshLoggingAndTelemetryArguments) {
95110
this.bus = bus;
96111
this.analytics = analytics;
97112
this.log = LoggingAndTelemetry.dummyLogger;
98113
this.userTraits = userTraits;
99114
this.mongoshVersion = mongoshVersion;
115+
this.deviceId = deviceId;
100116
}
101117

102118
public setup(): void {
@@ -196,6 +212,7 @@ class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
196212
anonymousId:
197213
this.busEventState.telemetryAnonymousId ??
198214
(this.busEventState.userId as string),
215+
deviceId: this.deviceId,
199216
};
200217
};
201218

@@ -285,7 +302,7 @@ class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
285302
this.busEventState.telemetryAnonymousId =
286303
newTelemetryUserIdentity.anonymousId;
287304
this.analytics.identify({
288-
anonymousId: newTelemetryUserIdentity.anonymousId,
305+
...getTelemetryUserIdentity(),
289306
traits: getUserTraits(),
290307
});
291308
}

packages/logging/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export type MongoshLoggingAndTelemetryArguments = {
1515
[key: string]: unknown;
1616
};
1717
mongoshVersion: string;
18+
/** Machine-specific ID; gets set automatically when omitted */
19+
deviceId?: string | undefined;
1820
};
1921

2022
export type MongoshTrackingProperties = {

0 commit comments

Comments
 (0)