extension/src/goTelemetry: set telemetry env vars

GOTELEMETRY_GOPLS_CLIENT_START_TIME and
GOTELEMETRY_GOPLS_CLIENT_TOKEN are the env vars
read by gopls v0.17+. See CL 589517

Use them to forward the vscode-go's telemetry
decision as we transition to gopls based prompting
logic.

For golang/go#67821

Change-Id: Ib3e014217ae7718a8677c7d8f181005fbc0577f6
Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/595535
Commit-Queue: Hyang-Ah Hana Kim <hyangah@gmail.com>
Reviewed-by: Robert Findley <rfindley@google.com>
kokoro-CI: kokoro <noreply+kokoro@google.com>
diff --git a/extension/src/goMain.ts b/extension/src/goMain.ts
index 4f213f0..015b1eb 100644
--- a/extension/src/goMain.ts
+++ b/extension/src/goMain.ts
@@ -72,7 +72,7 @@
 import * as commands from './commands';
 import { toggleVulncheckCommandFactory } from './goVulncheck';
 import { GoTaskProvider } from './goTaskProvider';
-import { telemetryReporter } from './goTelemetry';
+import { setTelemetryEnvVars, telemetryReporter } from './goTelemetry';
 
 const goCtx: GoExtensionContext = {};
 
@@ -99,6 +99,8 @@
 	setWorkspaceState(ctx.workspaceState);
 	setEnvironmentVariableCollection(ctx.environmentVariableCollection);
 
+	setTelemetryEnvVars(ctx.globalState, process.env);
+
 	const cfg = getGoConfig();
 	WelcomePanel.activate(ctx, goCtx);
 
diff --git a/extension/src/goTelemetry.ts b/extension/src/goTelemetry.ts
index f37bd39..8f348dc 100644
--- a/extension/src/goTelemetry.ts
+++ b/extension/src/goTelemetry.ts
@@ -215,7 +215,27 @@
 
 	// exported for testing.
 	public hashMachineID(salt?: string): number {
-		const hash = createHash('md5').update(`${vscode.env.machineId}${salt}`).digest('hex');
-		return parseInt(hash.substring(0, 8), 16);
+		return hashMachineID(salt);
 	}
 }
+
+// Set telemetry env vars for gopls. See gopls/internal/server/prompt.go
+// TODO(hyangah): add an integration testing after gopls v0.17 becomes available.
+export function setTelemetryEnvVars(globalState: vscode.Memento, env: NodeJS.ProcessEnv) {
+	if (!env['GOTELEMETRY_GOPLS_CLIENT_TOKEN']) {
+		env['GOTELEMETRY_GOPLS_CLIENT_TOKEN'] = `${hashMachineID() + 1}`; // [1, 1000]
+	}
+	if (!env['GOTELEMETRY_GOPLS_CLIENT_START_TIME']) {
+		const start = readTelemetryStartTime(globalState);
+		if (start) {
+			const unixSec = Math.floor(start.getTime() / 1000);
+			env['GOTELEMETRY_GOPLS_CLIENT_START_TIME'] = `${unixSec}`;
+		}
+	}
+}
+
+// Map vscode.env.machineId to an integer in [0, 1000).
+function hashMachineID(salt?: string): number {
+	const hash = createHash('md5').update(`${vscode.env.machineId}${salt}`).digest('hex');
+	return parseInt(hash.substring(0, 8), 16) % 1000;
+}