diff --git a/packages/compass-connections/src/stores/connections-store-redux.ts b/packages/compass-connections/src/stores/connections-store-redux.ts index f9a4e9abacf..fbe6b14a83f 100644 --- a/packages/compass-connections/src/stores/connections-store-redux.ts +++ b/packages/compass-connections/src/stores/connections-store-redux.ts @@ -1492,6 +1492,7 @@ const connectWithOptions = ( forceConnectionOptions, browserCommandForOIDCAuth, maximumNumberOfActiveConnections, + telemetryAnonymousId, } = preferences.getPreferences(); const connectionProgress = getNotificationTriggers(); @@ -1553,10 +1554,12 @@ const connectWithOptions = ( cloneDeep(connectionOptions), SecretsForConnection.get(connectionInfo.id) ?? {} ), + connectionInfo, defaultAppName: appName, preferences: { forceConnectionOptions: forceConnectionOptions ?? [], browserCommandForOIDCAuth, + telemetryAnonymousId, }, notifyDeviceFlow: (deviceFlowInfo) => { connectionProgress.openNotifyDeviceAuthModal( diff --git a/packages/connection-form/src/hooks/use-connect-form.ts b/packages/connection-form/src/hooks/use-connect-form.ts index 117e546265b..bfad34f1073 100644 --- a/packages/connection-form/src/hooks/use-connect-form.ts +++ b/packages/connection-form/src/hooks/use-connect-form.ts @@ -843,11 +843,13 @@ function setInitialState({ export function adjustConnectionOptionsBeforeConnect({ connectionOptions, + connectionInfo, defaultAppName, notifyDeviceFlow, preferences, }: { connectionOptions: Readonly; + connectionInfo: Readonly>; defaultAppName?: string; notifyDeviceFlow?: (deviceFlowInformation: { verificationUrl: string; @@ -855,6 +857,7 @@ export function adjustConnectionOptionsBeforeConnect({ }) => void; preferences: { browserCommandForOIDCAuth?: string; + telemetryAnonymousId?: string; forceConnectionOptions: [string, string][]; }; }): ConnectionOptions { @@ -863,7 +866,12 @@ export function adjustConnectionOptionsBeforeConnect({ ) => ConnectionOptions)[] = [ adjustCSFLEParams, unsetFleOptionsIfEmptyAutoEncryption, - setAppNameParamIfMissing(defaultAppName), + setAppNameParamIfMissing({ + defaultAppName, + connectionId: connectionInfo.id, + isAtlas: !!connectionInfo.atlasMetadata, + telemetryAnonymousId: preferences.telemetryAnonymousId, + }), adjustOIDCConnectionOptionsBeforeConnect({ browserCommandForOIDCAuth: preferences.browserCommandForOIDCAuth, notifyDeviceFlow, diff --git a/packages/connection-form/src/utils/set-app-name-if-missing.spec.ts b/packages/connection-form/src/utils/set-app-name-if-missing.spec.ts index e867fd2ebd8..3495cd8df4c 100644 --- a/packages/connection-form/src/utils/set-app-name-if-missing.spec.ts +++ b/packages/connection-form/src/utils/set-app-name-if-missing.spec.ts @@ -4,7 +4,11 @@ import { setAppNameParamIfMissing } from './set-app-name-if-missing'; describe('setAppNameParamIfMissing', function () { it('leaves options unchanged if no default appName was specified', function () { expect( - setAppNameParamIfMissing()({ + setAppNameParamIfMissing({ + connectionId: '123', + telemetryAnonymousId: '789', + isAtlas: false, + })({ connectionString: 'mongodb://localhost/', }) ).to.deep.equal({ @@ -14,7 +18,12 @@ describe('setAppNameParamIfMissing', function () { it('leaves options unchanged if appName was already part of the connection string', function () { expect( - setAppNameParamIfMissing('defaultAppName')({ + setAppNameParamIfMissing({ + defaultAppName: 'defaultAppName', + connectionId: '123', + telemetryAnonymousId: '789', + isAtlas: false, + })({ connectionString: 'mongodb://localhost/?appName=foobar', }) ).to.deep.equal({ @@ -22,13 +31,33 @@ describe('setAppNameParamIfMissing', function () { }); }); - it('sets appName to a default value if not already set', function () { + it('sets appName to a default app name if not atlas and not already set', function () { expect( - setAppNameParamIfMissing('defaultAppName')({ + setAppNameParamIfMissing({ + defaultAppName: 'defaultAppName', + connectionId: '123', + telemetryAnonymousId: '789', + isAtlas: false, + })({ connectionString: 'mongodb://localhost/', }) ).to.deep.equal({ connectionString: 'mongodb://localhost/?appName=defaultAppName', }); }); + + it('sets appName to a default app name, anonymous id, and connection id if it is atlas and not already set', function () { + expect( + setAppNameParamIfMissing({ + defaultAppName: 'defaultAppName', + connectionId: '123', + telemetryAnonymousId: '789', + isAtlas: true, + })({ + connectionString: 'mongodb://atlas/', + }) + ).to.deep.equal({ + connectionString: 'mongodb://atlas/?appName=defaultAppName-789-123', + }); + }); }); diff --git a/packages/connection-form/src/utils/set-app-name-if-missing.ts b/packages/connection-form/src/utils/set-app-name-if-missing.ts index 015c1918683..d52dab7c5a8 100644 --- a/packages/connection-form/src/utils/set-app-name-if-missing.ts +++ b/packages/connection-form/src/utils/set-app-name-if-missing.ts @@ -3,9 +3,17 @@ import type { MongoClientOptions } from 'mongodb'; import { ConnectionString } from 'mongodb-connection-string-url'; import type { ConnectionOptions } from 'mongodb-data-service'; -export function setAppNameParamIfMissing( - defaultAppName?: string -): (connectionOptions: Readonly) => ConnectionOptions { +export function setAppNameParamIfMissing({ + defaultAppName, + telemetryAnonymousId, + connectionId, + isAtlas, +}: { + defaultAppName?: string; + telemetryAnonymousId?: string; + connectionId: string; + isAtlas: boolean; +}): (connectionOptions: Readonly) => ConnectionOptions { return (connectionOptions) => { const connectionStringUrl = new ConnectionString( connectionOptions.connectionString @@ -14,7 +22,13 @@ export function setAppNameParamIfMissing( const searchParams = connectionStringUrl.typedSearchParams(); if (!searchParams.has('appName') && defaultAppName !== undefined) { - searchParams.set('appName', defaultAppName); + const appName = isAtlas + ? `${defaultAppName}${ + telemetryAnonymousId ? `-${telemetryAnonymousId}` : '' + }-${connectionId}` + : defaultAppName; + + searchParams.set('appName', appName); connectionOptions = { ...cloneDeep(connectionOptions), connectionString: connectionStringUrl.toString(),