diff --git a/extensions/ql-vscode/src/common/vscode/telemetry.ts b/extensions/ql-vscode/src/common/vscode/telemetry.ts index 8bab7b38d..d8c6f54c6 100644 --- a/extensions/ql-vscode/src/common/vscode/telemetry.ts +++ b/extensions/ql-vscode/src/common/vscode/telemetry.ts @@ -1,6 +1,7 @@ import type { Extension, ExtensionContext } from "vscode"; +import { ConfigurationTarget, env, Uri, window } from "vscode"; import TelemetryReporter from "vscode-extension-telemetry"; -import { LOG_TELEMETRY, isCanary } from "../../config"; +import { ENABLE_TELEMETRY, isCanary, LOG_TELEMETRY } from "../../config"; import type { TelemetryClient } from "applicationinsights"; import { extLogger } from "../logging/vscode"; import { UserCancellationException } from "./progress"; @@ -159,6 +160,45 @@ export class ExtensionTelemetryListener implements AppTelemetry, Disposable { } } +async function notifyTelemetryChange() { + const continueItem = { title: "Continue", isCloseAffordance: false }; + const vsCodeTelemetryItem = { + title: "More Information about VS Code Telemetry", + isCloseAffordance: false, + }; + const codeqlTelemetryItem = { + title: "More Information about CodeQL Telemetry", + isCloseAffordance: false, + }; + let chosenItem; + + do { + chosenItem = await window.showInformationMessage( + "The CodeQL extension now follows VS Code's telemetry settings. VS Code telemetry is currently enabled. Learn how to update your telemetry settings by clicking the links below.", + { modal: true }, + continueItem, + vsCodeTelemetryItem, + codeqlTelemetryItem, + ); + if (chosenItem === vsCodeTelemetryItem) { + await env.openExternal( + Uri.parse( + "https://code.visualstudio.com/docs/getstarted/telemetry", + true, + ), + ); + } + if (chosenItem === codeqlTelemetryItem) { + await env.openExternal( + Uri.parse( + "https://docs.github.com/en/code-security/codeql-for-vs-code/using-the-advanced-functionality-of-the-codeql-for-vs-code-extension/telemetry-in-codeql-for-visual-studio-code", + true, + ), + ); + } + } while (chosenItem !== continueItem); +} + /** * The global Telemetry instance */ @@ -172,11 +212,28 @@ export async function initializeTelemetry( if (telemetryListener !== undefined) { throw new Error("Telemetry is already initialized"); } + + if (ENABLE_TELEMETRY.getValue() === false) { + if (env.isTelemetryEnabled) { + // Await this so that the user is notified before any telemetry is sent + await notifyTelemetryChange(); + } + + // Remove the deprecated telemetry setting + ENABLE_TELEMETRY.updateValue(undefined, ConfigurationTarget.Global); + ENABLE_TELEMETRY.updateValue(undefined, ConfigurationTarget.Workspace); + ENABLE_TELEMETRY.updateValue( + undefined, + ConfigurationTarget.WorkspaceFolder, + ); + } + telemetryListener = new ExtensionTelemetryListener( extension.id, extension.packageJSON.version, key, ); ctx.subscriptions.push(telemetryListener); + return telemetryListener; } diff --git a/extensions/ql-vscode/src/config.ts b/extensions/ql-vscode/src/config.ts index cfabd9ea6..989e4931b 100644 --- a/extensions/ql-vscode/src/config.ts +++ b/extensions/ql-vscode/src/config.ts @@ -166,6 +166,12 @@ const TELEMETRY_SETTING = new Setting("telemetry", ROOT_SETTING); export const LOG_TELEMETRY = new Setting("logTelemetry", TELEMETRY_SETTING); +// Legacy setting that is no longer used, but is used for showing a message when the user upgrades. +export const ENABLE_TELEMETRY = new Setting( + "enableTelemetry", + TELEMETRY_SETTING, +); + // Distribution configuration const DISTRIBUTION_SETTING = new Setting("cli", ROOT_SETTING); export const CUSTOM_CODEQL_PATH_SETTING = new Setting(