Skip to content

Commit c06afec

Browse files
authored
feat(connection-form): add connection and anonymous id to app name for atlas connections COMPASS-8591 (#6750)
1 parent 89b0f48 commit c06afec

File tree

4 files changed

+63
-9
lines changed

4 files changed

+63
-9
lines changed

packages/compass-connections/src/stores/connections-store-redux.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1492,6 +1492,7 @@ const connectWithOptions = (
14921492
forceConnectionOptions,
14931493
browserCommandForOIDCAuth,
14941494
maximumNumberOfActiveConnections,
1495+
telemetryAnonymousId,
14951496
} = preferences.getPreferences();
14961497

14971498
const connectionProgress = getNotificationTriggers();
@@ -1553,10 +1554,12 @@ const connectWithOptions = (
15531554
cloneDeep(connectionOptions),
15541555
SecretsForConnection.get(connectionInfo.id) ?? {}
15551556
),
1557+
connectionInfo,
15561558
defaultAppName: appName,
15571559
preferences: {
15581560
forceConnectionOptions: forceConnectionOptions ?? [],
15591561
browserCommandForOIDCAuth,
1562+
telemetryAnonymousId,
15601563
},
15611564
notifyDeviceFlow: (deviceFlowInfo) => {
15621565
connectionProgress.openNotifyDeviceAuthModal(

packages/connection-form/src/hooks/use-connect-form.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,18 +843,21 @@ function setInitialState({
843843

844844
export function adjustConnectionOptionsBeforeConnect({
845845
connectionOptions,
846+
connectionInfo,
846847
defaultAppName,
847848
notifyDeviceFlow,
848849
preferences,
849850
}: {
850851
connectionOptions: Readonly<ConnectionOptions>;
852+
connectionInfo: Readonly<Pick<ConnectionInfo, 'id' | 'atlasMetadata'>>;
851853
defaultAppName?: string;
852854
notifyDeviceFlow?: (deviceFlowInformation: {
853855
verificationUrl: string;
854856
userCode: string;
855857
}) => void;
856858
preferences: {
857859
browserCommandForOIDCAuth?: string;
860+
telemetryAnonymousId?: string;
858861
forceConnectionOptions: [string, string][];
859862
};
860863
}): ConnectionOptions {
@@ -863,7 +866,12 @@ export function adjustConnectionOptionsBeforeConnect({
863866
) => ConnectionOptions)[] = [
864867
adjustCSFLEParams,
865868
unsetFleOptionsIfEmptyAutoEncryption,
866-
setAppNameParamIfMissing(defaultAppName),
869+
setAppNameParamIfMissing({
870+
defaultAppName,
871+
connectionId: connectionInfo.id,
872+
isAtlas: !!connectionInfo.atlasMetadata,
873+
telemetryAnonymousId: preferences.telemetryAnonymousId,
874+
}),
867875
adjustOIDCConnectionOptionsBeforeConnect({
868876
browserCommandForOIDCAuth: preferences.browserCommandForOIDCAuth,
869877
notifyDeviceFlow,

packages/connection-form/src/utils/set-app-name-if-missing.spec.ts

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import { setAppNameParamIfMissing } from './set-app-name-if-missing';
44
describe('setAppNameParamIfMissing', function () {
55
it('leaves options unchanged if no default appName was specified', function () {
66
expect(
7-
setAppNameParamIfMissing()({
7+
setAppNameParamIfMissing({
8+
connectionId: '123',
9+
telemetryAnonymousId: '789',
10+
isAtlas: false,
11+
})({
812
connectionString: 'mongodb://localhost/',
913
})
1014
).to.deep.equal({
@@ -14,21 +18,46 @@ describe('setAppNameParamIfMissing', function () {
1418

1519
it('leaves options unchanged if appName was already part of the connection string', function () {
1620
expect(
17-
setAppNameParamIfMissing('defaultAppName')({
21+
setAppNameParamIfMissing({
22+
defaultAppName: 'defaultAppName',
23+
connectionId: '123',
24+
telemetryAnonymousId: '789',
25+
isAtlas: false,
26+
})({
1827
connectionString: 'mongodb://localhost/?appName=foobar',
1928
})
2029
).to.deep.equal({
2130
connectionString: 'mongodb://localhost/?appName=foobar',
2231
});
2332
});
2433

25-
it('sets appName to a default value if not already set', function () {
34+
it('sets appName to a default app name if not atlas and not already set', function () {
2635
expect(
27-
setAppNameParamIfMissing('defaultAppName')({
36+
setAppNameParamIfMissing({
37+
defaultAppName: 'defaultAppName',
38+
connectionId: '123',
39+
telemetryAnonymousId: '789',
40+
isAtlas: false,
41+
})({
2842
connectionString: 'mongodb://localhost/',
2943
})
3044
).to.deep.equal({
3145
connectionString: 'mongodb://localhost/?appName=defaultAppName',
3246
});
3347
});
48+
49+
it('sets appName to a default app name, anonymous id, and connection id if it is atlas and not already set', function () {
50+
expect(
51+
setAppNameParamIfMissing({
52+
defaultAppName: 'defaultAppName',
53+
connectionId: '123',
54+
telemetryAnonymousId: '789',
55+
isAtlas: true,
56+
})({
57+
connectionString: 'mongodb://atlas/',
58+
})
59+
).to.deep.equal({
60+
connectionString: 'mongodb://atlas/?appName=defaultAppName-789-123',
61+
});
62+
});
3463
});

packages/connection-form/src/utils/set-app-name-if-missing.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@ import type { MongoClientOptions } from 'mongodb';
33
import { ConnectionString } from 'mongodb-connection-string-url';
44
import type { ConnectionOptions } from 'mongodb-data-service';
55

6-
export function setAppNameParamIfMissing(
7-
defaultAppName?: string
8-
): (connectionOptions: Readonly<ConnectionOptions>) => ConnectionOptions {
6+
export function setAppNameParamIfMissing({
7+
defaultAppName,
8+
telemetryAnonymousId,
9+
connectionId,
10+
isAtlas,
11+
}: {
12+
defaultAppName?: string;
13+
telemetryAnonymousId?: string;
14+
connectionId: string;
15+
isAtlas: boolean;
16+
}): (connectionOptions: Readonly<ConnectionOptions>) => ConnectionOptions {
917
return (connectionOptions) => {
1018
const connectionStringUrl = new ConnectionString(
1119
connectionOptions.connectionString
@@ -14,7 +22,13 @@ export function setAppNameParamIfMissing(
1422
const searchParams =
1523
connectionStringUrl.typedSearchParams<MongoClientOptions>();
1624
if (!searchParams.has('appName') && defaultAppName !== undefined) {
17-
searchParams.set('appName', defaultAppName);
25+
const appName = isAtlas
26+
? `${defaultAppName}${
27+
telemetryAnonymousId ? `-${telemetryAnonymousId}` : ''
28+
}-${connectionId}`
29+
: defaultAppName;
30+
31+
searchParams.set('appName', appName);
1832
connectionOptions = {
1933
...cloneDeep(connectionOptions),
2034
connectionString: connectionStringUrl.toString(),

0 commit comments

Comments
 (0)