Skip to content

Commit 1ce3ef0

Browse files
authored
Send environment type (tests, prod) in telemetry events (#944)
## Changes Set the type based on a presence of TEST_DEFAULT_CLUSTER_ID env var, which is only set in e2e tests. Also don't sent telemetry to a prod endpoint when we run unit tests.p ## Tests Manually and with new unit tests
1 parent cc61280 commit 1ce3ef0

File tree

5 files changed

+64
-2
lines changed

5 files changed

+64
-2
lines changed

packages/databricks-vscode/src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ import {FeatureId, FeatureManager} from "./feature-manager/FeatureManager";
4141
import {DbConnectAccessVerifier} from "./language/DbConnectAccessVerifier";
4242
import {MsPythonExtensionWrapper} from "./language/MsPythonExtensionWrapper";
4343
import {DatabricksEnvFileManager} from "./file-managers/DatabricksEnvFileManager";
44-
import {Telemetry, toUserMetadata} from "./telemetry";
44+
import {getContextMetadata, Telemetry, toUserMetadata} from "./telemetry";
4545
import "./telemetry/commandExtensions";
4646
import {Events, Metadata} from "./telemetry/constants";
4747
import {DbConnectInstallPrompt} from "./language/DbConnectInstallPrompt";
@@ -100,6 +100,7 @@ export async function activate(
100100
}
101101

102102
const telemetry = Telemetry.createDefault();
103+
telemetry.setMetadata(Metadata.CONTEXT, getContextMetadata());
103104

104105
const packageMetadata = await PackageJsonUtils.getMetadata(context);
105106
logging.NamedLogger.getOrCreate(Loggers.Extension).debug("Metadata", {

packages/databricks-vscode/src/telemetry/constants.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,15 @@ export type EventProperties = {
110110
: never;
111111
};
112112

113+
export type EnvironmentType = "tests" | "prod";
114+
113115
/**
114116
* Additional metadata collected from the extension, independent of the event itself.
115117
*/
116118
/* eslint-disable @typescript-eslint/naming-convention */
117119
export enum Metadata {
118120
USER = "user",
121+
CONTEXT = "context",
119122
}
120123
/* eslint-enable @typescript-eslint/naming-convention */
121124

@@ -141,6 +144,12 @@ export class MetadataTypes {
141144
comment: "The kind of authentication used by the user",
142145
},
143146
};
147+
[Metadata.CONTEXT]: EventType<{environmentType: EnvironmentType}> = {
148+
environmentType: {
149+
comment:
150+
"A type of the environment this extension is running with (test, staging, prod)",
151+
},
152+
};
144153
}
145154

146155
/** The type of all extra metadata collected by the extension. */

packages/databricks-vscode/src/telemetry/index.test.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import TelemetryReporter from "@vscode/extension-telemetry";
33
import assert from "assert";
44
import {mock, instance, capture, when} from "ts-mockito";
5-
import {Telemetry, toUserMetadata} from ".";
5+
import {Telemetry, getContextMetadata, toUserMetadata} from ".";
66
import {Events, Metadata} from "./constants";
77
import {DatabricksWorkspace} from "../configuration/DatabricksWorkspace";
88
import {Uri} from "vscode";
@@ -12,10 +12,14 @@ import {ApiClient, Config} from "@databricks/databricks-sdk";
1212
describe(__filename, () => {
1313
let reporter: TelemetryReporter;
1414
let telemetry: Telemetry;
15+
const defaultClusterId = process.env["TEST_DEFAULT_CLUSTER_ID"];
1516
beforeEach(async () => {
1617
reporter = mock(TelemetryReporter);
1718
telemetry = new Telemetry(instance(reporter));
1819
});
20+
afterEach(() => {
21+
process.env["TEST_DEFAULT_CLUSTER_ID"] = defaultClusterId;
22+
});
1923
it("should record expected properties and metrics", async () => {
2024
telemetry.recordEvent(Events.COMMAND_EXECUTION, {
2125
command: "testCommand",
@@ -36,6 +40,42 @@ describe(__filename, () => {
3640
});
3741
});
3842

43+
it("sets context metadata with prod env type", async () => {
44+
delete process.env["TEST_DEFAULT_CLUSTER_ID"];
45+
telemetry.setMetadata(Metadata.CONTEXT, getContextMetadata());
46+
telemetry.recordEvent(Events.COMMAND_EXECUTION, {
47+
command: "testCommand",
48+
success: true,
49+
duration: 100,
50+
});
51+
const [eventName, props] = capture(reporter.sendTelemetryEvent).last();
52+
assert.equal(eventName, "commandExecution");
53+
assert.deepEqual(props, {
54+
"version": "1.0",
55+
"event.command": "testCommand",
56+
"event.success": "true",
57+
"context.environmentType": "prod",
58+
});
59+
});
60+
61+
it("sets context metadata with tests env type", async () => {
62+
process.env["TEST_DEFAULT_CLUSTER_ID"] = "123";
63+
telemetry.setMetadata(Metadata.CONTEXT, getContextMetadata());
64+
telemetry.recordEvent(Events.COMMAND_EXECUTION, {
65+
command: "testCommand",
66+
success: true,
67+
duration: 100,
68+
});
69+
const [eventName, props] = capture(reporter.sendTelemetryEvent).last();
70+
assert.equal(eventName, "commandExecution");
71+
assert.deepEqual(props, {
72+
"version": "1.0",
73+
"event.command": "testCommand",
74+
"event.success": "true",
75+
"context.environmentType": "tests",
76+
});
77+
});
78+
3979
it("sets user metadata correctly after logged in", async () => {
4080
const ws = mock(DatabricksWorkspace);
4181
when(ws.userName).thenReturn("miles@databricks.com");

packages/databricks-vscode/src/telemetry/index.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,14 @@ export async function toUserMetadata(
7979
return {...dbWorkspaceMetadata, ...authType};
8080
}
8181

82+
export function getContextMetadata(): ExtraMetadata[Metadata.CONTEXT] {
83+
return {
84+
environmentType: process.env["TEST_DEFAULT_CLUSTER_ID"]
85+
? "tests"
86+
: "prod",
87+
};
88+
}
89+
8290
function getTelemetryKey(): string {
8391
if (isDevExtension()) {
8492
return DEV_APP_INSIGHTS_CONFIGURATION_STRING;

packages/databricks-vscode/src/test/runTest.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import path from "path";
22
import os from "os";
33
import fs from "fs/promises";
44

5+
import {EXTENSION_DEVELOPMENT} from "../utils/developmentUtils";
56
import {downloadAndUnzipVSCode, runTests} from "@vscode/test-electron";
67

78
async function main() {
@@ -28,6 +29,9 @@ async function main() {
2829
extensionDevelopmentPath,
2930
extensionTestsPath,
3031
launchArgs: ["--user-data-dir", `${os.tmpdir()}`],
32+
extensionTestsEnv: {
33+
[EXTENSION_DEVELOPMENT]: "true",
34+
},
3135
});
3236
} catch (err) {
3337
// eslint-disable-next-line no-console

0 commit comments

Comments
 (0)