From 4cc1505308443aa4f7c817c99c6821a7e3020263 Mon Sep 17 00:00:00 2001 From: David Leek Date: Thu, 15 Jun 2023 15:11:58 +0200 Subject: [PATCH] feat: add support for turning telemetry off with environment variable (#3987) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## About the changes Adds an environment variable for switching off feature telemetry in version check --- src/lib/__snapshots__/create-config.test.ts.snap | 1 + src/lib/create-config.ts | 4 ++++ src/lib/services/version-service.test.ts | 7 +++++++ src/lib/services/version-service.ts | 15 +++++++++++++-- src/lib/types/option.ts | 2 ++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/lib/__snapshots__/create-config.test.ts.snap b/src/lib/__snapshots__/create-config.test.ts.snap index 3e77646d44..928d6e63d7 100644 --- a/src/lib/__snapshots__/create-config.test.ts.snap +++ b/src/lib/__snapshots__/create-config.test.ts.snap @@ -185,6 +185,7 @@ exports[`should create default config 1`] = ` "ttlHours": 48, }, "strategySegmentsLimit": 5, + "telemetry": true, "ui": { "environment": "Open Source", }, diff --git a/src/lib/create-config.ts b/src/lib/create-config.ts index d07a0615fb..b9212470ec 100644 --- a/src/lib/create-config.ts +++ b/src/lib/create-config.ts @@ -397,6 +397,9 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig { options.versionCheck || {}, ]); + const telemetry: boolean = + options.telemetry || + parseEnvVarBoolean(process.env.SEND_TELEMETRY, true); const initApiTokens = loadInitApiTokens(); const authentication: IAuthOption = mergeAll([ @@ -475,6 +478,7 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig { server, listen, versionCheck, + telemetry, authentication, ui, import: importSetting, diff --git a/src/lib/services/version-service.test.ts b/src/lib/services/version-service.test.ts index 458321b893..38bd230670 100644 --- a/src/lib/services/version-service.test.ts +++ b/src/lib/services/version-service.test.ts @@ -50,6 +50,7 @@ test('yields current versions', async () => { getLogger, versionCheck: { url, enable: true }, flagResolver: getTestFlagResolver(true), + telemetry: true, }); await service.checkLatestVersion(); const versionInfo = service.getVersionInfo(); @@ -84,6 +85,7 @@ test('supports setting enterprise version as well', async () => { versionCheck: { url, enable: true }, enterpriseVersion, flagResolver: getTestFlagResolver(true), + telemetry: true, }); await service.checkLatestVersion(); const versionInfo = service.getVersionInfo(); @@ -118,6 +120,7 @@ test('if version check is not enabled should not make any calls', async () => { versionCheck: { url, enable: false }, enterpriseVersion, flagResolver: getTestFlagResolver(true), + telemetry: true, }); await service.checkLatestVersion(); const versionInfo = service.getVersionInfo(); @@ -160,6 +163,7 @@ test('sets featureinfo', async () => { versionCheck: { url, enable: true }, enterpriseVersion, flagResolver: getTestFlagResolver(true), + telemetry: true, }); await service.checkLatestVersion(); expect(scope.isDone()).toEqual(true); @@ -208,6 +212,7 @@ test('counts toggles', async () => { versionCheck: { url, enable: true }, enterpriseVersion, flagResolver: getTestFlagResolver(true), + telemetry: true, }); await service.checkLatestVersion(); expect(scope.isDone()).toEqual(true); @@ -247,6 +252,7 @@ test('doesnt report featureinfo when flag off', async () => { versionCheck: { url, enable: true }, enterpriseVersion, flagResolver: getTestFlagResolver(false), + telemetry: true, }); await service.checkLatestVersion(); expect(scope.isDone()).toEqual(true); @@ -309,6 +315,7 @@ test('counts custom strategies', async () => { versionCheck: { url, enable: true }, enterpriseVersion, flagResolver: getTestFlagResolver(true), + telemetry: true, }); await service.checkLatestVersion(); expect(scope.isDone()).toEqual(true); diff --git a/src/lib/services/version-service.ts b/src/lib/services/version-service.ts index 5c98a23c0b..5423da3857 100644 --- a/src/lib/services/version-service.ts +++ b/src/lib/services/version-service.ts @@ -92,6 +92,8 @@ export default class VersionService { private enabled: boolean; + private telemetryEnabled: boolean; + private versionCheckUrl: string; private instanceId?: string; @@ -136,9 +138,14 @@ export default class VersionService { versionCheck, enterpriseVersion, flagResolver, + telemetry, }: Pick< IUnleashConfig, - 'getLogger' | 'versionCheck' | 'enterpriseVersion' | 'flagResolver' + | 'getLogger' + | 'versionCheck' + | 'enterpriseVersion' + | 'flagResolver' + | 'telemetry' >, ) { this.logger = getLogger('lib/services/version-service.js'); @@ -159,6 +166,7 @@ export default class VersionService { enterprise: enterpriseVersion || '', }; this.enabled = versionCheck.enable; + this.telemetryEnabled = telemetry; this.versionCheckUrl = versionCheck.url; this.isLatest = true; this.flagResolver = flagResolver; @@ -193,7 +201,10 @@ export default class VersionService { }; if ( - this.flagResolver.isEnabled('experimentalExtendedTelemetry') + this.flagResolver.isEnabled( + 'experimentalExtendedTelemetry', + ) && + this.telemetryEnabled ) { const featureInfo = await this.getFeatureUsageInfo(); versionPayload.featureInfo = featureInfo; diff --git a/src/lib/types/option.ts b/src/lib/types/option.ts index 644a3e8d7f..f3a2b75413 100644 --- a/src/lib/types/option.ts +++ b/src/lib/types/option.ts @@ -98,6 +98,7 @@ export interface IUnleashOptions { logLevel?: LogLevel; server?: Partial; versionCheck?: Partial; + telemetry?: boolean; authentication?: Partial; ui?: object; frontendApi?: IFrontendApi; @@ -182,6 +183,7 @@ export interface IUnleashConfig { server: IServerOption; listen: IListeningHost | IListeningPipe; versionCheck: IVersionOption; + telemetry: boolean; authentication: IAuthOption; ui: IUIConfig; import: IImportOption;