Skip to content

Commit 01e798a

Browse files
authored
Share telemetry from core extension. (#20893)
it turns out the new telemetry API removed a way to set extension id and version when telemetry reporter is created and it implicitly sets from extension reporter is created. the same way how LSP client is working. since we want to keep using the same extension id and etc for our telemetry, we need the reporter created from core ext.
1 parent 807b9fe commit 01e798a

File tree

5 files changed

+39
-24
lines changed

5 files changed

+39
-24
lines changed

src/client/api.ts

+4-14
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ import { ILanguageServerOutputChannel } from './activation/types';
1212
import { IExtensionApi } from './apiTypes';
1313
import { isTestExecution, PYTHON_LANGUAGE } from './common/constants';
1414
import { IConfigurationService, Resource } from './common/types';
15-
import { IEnvironmentVariablesProvider } from './common/variables/types';
1615
import { getDebugpyLauncherArgs, getDebugpyPackagePath } from './debugger/extension/adapter/remoteLaunchers';
1716
import { IInterpreterService } from './interpreter/contracts';
1817
import { IServiceContainer, IServiceManager } from './ioc/types';
1918
import { JupyterExtensionIntegration } from './jupyter/jupyterIntegration';
2019
import { traceError } from './logging';
2120
import { IDiscoveryAPI } from './pythonEnvironments/base/locator';
2221
import { buildEnvironmentApi } from './environmentApi';
22+
import { ApiForPylance } from './pylanceApi';
23+
import { getTelemetryReporter } from './telemetry';
2324

2425
export function buildApi(
2526
ready: Promise<any>,
@@ -31,21 +32,14 @@ export function buildApi(
3132
const interpreterService = serviceContainer.get<IInterpreterService>(IInterpreterService);
3233
serviceManager.addSingleton<JupyterExtensionIntegration>(JupyterExtensionIntegration, JupyterExtensionIntegration);
3334
const jupyterIntegration = serviceContainer.get<JupyterExtensionIntegration>(JupyterExtensionIntegration);
34-
const envService = serviceContainer.get<IEnvironmentVariablesProvider>(IEnvironmentVariablesProvider);
3535
const outputChannel = serviceContainer.get<ILanguageServerOutputChannel>(ILanguageServerOutputChannel);
3636

3737
const api: IExtensionApi & {
3838
/**
3939
* @deprecated Temporarily exposed for Pylance until we expose this API generally. Will be removed in an
4040
* iteration or two.
4141
*/
42-
pylance: {
43-
getPythonPathVar: (resource?: Uri) => Promise<string | undefined>;
44-
readonly onDidEnvironmentVariablesChange: Event<Uri | undefined>;
45-
createClient(...args: any[]): BaseLanguageClient;
46-
start(client: BaseLanguageClient): Promise<void>;
47-
stop(client: BaseLanguageClient): Promise<void>;
48-
};
42+
pylance: ApiForPylance;
4943
} & {
5044
/**
5145
* @deprecated Use IExtensionApi.environments API instead.
@@ -126,11 +120,6 @@ export function buildApi(
126120
: (noop as any),
127121
},
128122
pylance: {
129-
getPythonPathVar: async (resource?: Uri) => {
130-
const envs = await envService.getEnvironmentVariables(resource);
131-
return envs.PYTHONPATH;
132-
},
133-
onDidEnvironmentVariablesChange: envService.onDidEnvironmentVariablesChange,
134123
createClient: (...args: any[]): BaseLanguageClient => {
135124
// Make sure we share output channel so that we can share one with
136125
// Jedi as well.
@@ -141,6 +130,7 @@ export function buildApi(
141130
},
142131
start: (client: BaseLanguageClient): Promise<void> => client.start(),
143132
stop: (client: BaseLanguageClient): Promise<void> => client.stop(),
133+
getTelemetryReporter: () => getTelemetryReporter(),
144134
},
145135
environments: buildEnvironmentApi(discoveryApi, serviceContainer),
146136
};

src/client/browser/api.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,25 @@
66
import { BaseLanguageClient } from 'vscode-languageclient';
77
import { LanguageClient } from 'vscode-languageclient/browser';
88
import { PYTHON_LANGUAGE } from '../common/constants';
9+
import { ApiForPylance, TelemetryReporter } from '../pylanceApi';
910

1011
export interface IBrowserExtensionApi {
1112
/**
1213
* @deprecated Temporarily exposed for Pylance until we expose this API generally. Will be removed in an
1314
* iteration or two.
1415
*/
15-
pylance: {
16-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
17-
createClient(...args: any[]): BaseLanguageClient;
18-
start(client: BaseLanguageClient): Promise<void>;
19-
stop(client: BaseLanguageClient): Promise<void>;
20-
};
16+
pylance: ApiForPylance;
2117
}
2218

23-
export function buildApi(): IBrowserExtensionApi {
19+
export function buildApi(reporter: TelemetryReporter): IBrowserExtensionApi {
2420
const api: IBrowserExtensionApi = {
2521
pylance: {
2622
// eslint-disable-next-line @typescript-eslint/no-explicit-any
2723
createClient: (...args: any[]): BaseLanguageClient =>
2824
new LanguageClient(PYTHON_LANGUAGE, 'Python Language Server', args[0], args[1]),
2925
start: (client: BaseLanguageClient): Promise<void> => client.start(),
3026
stop: (client: BaseLanguageClient): Promise<void> => client.stop(),
27+
getTelemetryReporter: () => reporter,
3128
},
3229
};
3330

src/client/browser/extension.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ let languageClient: LanguageClient | undefined;
2121
let pylanceApi: PylanceApi | undefined;
2222

2323
export async function activate(context: vscode.ExtensionContext): Promise<IBrowserExtensionApi> {
24+
const reporter = getTelemetryReporter();
25+
2426
const pylanceExtension = vscode.extensions.getExtension<PylanceApi>(PYLANCE_EXTENSION_ID);
2527
if (pylanceExtension) {
2628
await runPylance(context, pylanceExtension);
27-
return buildApi();
29+
return buildApi(reporter);
2830
}
2931

3032
const changeDisposable = vscode.extensions.onDidChange(async () => {
@@ -35,7 +37,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<IBrows
3537
}
3638
});
3739

38-
return buildApi();
40+
return buildApi(reporter);
3941
}
4042

4143
export async function deactivate(): Promise<void> {

src/client/pylanceApi.ts

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
import { TelemetryEventMeasurements, TelemetryEventProperties } from '@vscode/extension-telemetry';
5+
import { BaseLanguageClient } from 'vscode-languageclient';
6+
7+
export interface TelemetryReporter {
8+
sendTelemetryEvent(
9+
eventName: string,
10+
properties?: TelemetryEventProperties,
11+
measurements?: TelemetryEventMeasurements,
12+
): void;
13+
sendTelemetryErrorEvent(
14+
eventName: string,
15+
properties?: TelemetryEventProperties,
16+
measurements?: TelemetryEventMeasurements,
17+
): void;
18+
}
19+
20+
export interface ApiForPylance {
21+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
22+
createClient(...args: any[]): BaseLanguageClient;
23+
start(client: BaseLanguageClient): Promise<void>;
24+
stop(client: BaseLanguageClient): Promise<void>;
25+
getTelemetryReporter(): TelemetryReporter;
26+
}

src/client/telemetry/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export function _resetSharedProperties(): void {
7676
}
7777

7878
let telemetryReporter: TelemetryReporter | undefined;
79-
function getTelemetryReporter() {
79+
export function getTelemetryReporter(): TelemetryReporter {
8080
if (!isTestExecution() && telemetryReporter) {
8181
return telemetryReporter;
8282
}

0 commit comments

Comments
 (0)