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;
+}