From c4074b9976caa33c14e5664bb2e8a5068e2040b2 Mon Sep 17 00:00:00 2001 From: Mikhail Arkhipov Date: Tue, 23 Oct 2018 14:32:12 -0700 Subject: [PATCH] Add support for telemetry from LS and remove obsolete LS option (#2978) For #2940 --- package-lock.json | 34 +++++++++++++------ .../activation/interpreterDataService.ts | 12 +++---- .../languageServer/languageServer.ts | 12 ++++--- src/client/telemetry/constants.ts | 1 + src/client/telemetry/types.ts | 7 +++- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1679820b4df1..3741f60c5eb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2130,7 +2130,7 @@ }, "dotenv": { "version": "5.0.1", - "resolved": "http://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" }, "download": { @@ -2919,12 +2919,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2939,17 +2941,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -3066,7 +3071,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -3078,6 +3084,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -3092,6 +3099,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -3105,6 +3113,7 @@ "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -3203,7 +3212,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3215,6 +3225,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -3337,6 +3348,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -6761,7 +6773,7 @@ }, "md5.js": { "version": "1.3.4", - "resolved": "http://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { "hash-base": "^3.0.0", @@ -7741,7 +7753,7 @@ }, "pretty-hrtime": { "version": "1.0.3", - "resolved": "http://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, @@ -9590,7 +9602,7 @@ }, "validator": { "version": "9.4.1", - "resolved": "http://registry.npmjs.org/validator/-/validator-9.4.1.tgz", + "resolved": "https://registry.npmjs.org/validator/-/validator-9.4.1.tgz", "integrity": "sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA==" }, "value-or-function": { @@ -10085,7 +10097,7 @@ }, "xmlbuilder": { "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xtend": { diff --git a/src/client/activation/interpreterDataService.ts b/src/client/activation/interpreterDataService.ts index 897863053369..daa595ebf383 100644 --- a/src/client/activation/interpreterDataService.ts +++ b/src/client/activation/interpreterDataService.ts @@ -20,7 +20,6 @@ export class InterpreterData { // tslint:disable-next-line:no-shadowed-variable public readonly path: string, public readonly version: string, - public readonly prefix: string, public readonly searchPaths: string, public readonly hash: string ) { } @@ -81,15 +80,13 @@ export class InterpreterDataService { } private async getInterpreterDataFromPython(execService: IPythonExecutionService, interpreterPath: string): Promise { - const result = await execService.exec(['-c', 'import sys; print(sys.version_info); print(sys.prefix)'], {}); - // 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) <> - // [MSC v.1500 32 bit (Intel)] - // C:\Python27 + const result = await execService.exec(['-c', 'import sys; print(sys.version_info)'], {}); + // sys.version_info(major=3, minor=6, micro=6, releaselevel='final', serial=0) if (!result.stdout) { throw Error('Unable to determine Python interpreter version and system prefix.'); } const output = result.stdout.splitLines({ removeEmptyEntries: true, trim: true }); - if (!output || output.length < 2) { + if (!output || output.length < 1) { throw Error('Unable to parse version and and system prefix from the Python interpreter output.'); } const majorMatches = output[0].match(/major=(\d*?),/); @@ -97,10 +94,9 @@ export class InterpreterDataService { if (!majorMatches || majorMatches.length < 2 || !minorMatches || minorMatches.length < 2) { throw Error('Unable to parse interpreter version.'); } - const prefix = output[output.length - 1]; const hash = await this.getInterpreterHash(interpreterPath); const searchPaths = await this.getSearchPaths(execService); - return new InterpreterData(DataVersion, interpreterPath, `${majorMatches[1]}.${minorMatches[1]}`, prefix, searchPaths, hash); + return new InterpreterData(DataVersion, interpreterPath, `${majorMatches[1]}.${minorMatches[1]}`, searchPaths, hash); } private async getSearchPaths(execService: IPythonExecutionService): Promise { diff --git a/src/client/activation/languageServer/languageServer.ts b/src/client/activation/languageServer/languageServer.ts index 37c3752d09c5..d22d8e80cfd8 100644 --- a/src/client/activation/languageServer/languageServer.ts +++ b/src/client/activation/languageServer/languageServer.ts @@ -33,7 +33,8 @@ import { LanguageServerSymbolProvider } from '../../providers/symbolProvider'; import { sendTelemetryEvent } from '../../telemetry'; import { PYTHON_LANGUAGE_SERVER_ENABLED, - PYTHON_LANGUAGE_SERVER_ERROR + PYTHON_LANGUAGE_SERVER_ERROR, + PYTHON_LANGUAGE_SERVER_TELEMETRY } from '../../telemetry/constants'; import { IUnitTestManagementService } from '../../unittests/types'; import { LanguageServerDownloader } from '../downloader'; @@ -164,6 +165,10 @@ export class LanguageServerExtensionActivator implements IExtensionActivator { this.languageClient = this.createSelfContainedLanguageClient(serverModule, clientOptions); try { await this.startLanguageClient(); + this.languageClient.onTelemetry(telemetryEvent => { + const eventName = telemetryEvent.Name ? telemetryEvent.Name : PYTHON_LANGUAGE_SERVER_TELEMETRY; + sendTelemetryEvent(eventName, telemetryEvent.Measurements, telemetryEvent.Properties); + }); return true; } catch (ex) { this.appShell.showErrorMessage(`Language server failed to start. Error ${ex}`); @@ -212,8 +217,7 @@ export class LanguageServerExtensionActivator implements IExtensionActivator { // tslint:disable-next-line:member-ordering public async getAnalysisOptions(): Promise { - // tslint:disable-next-line:no-any - const properties = new Map(); + const properties = new Map(); let interpreterData: InterpreterData | undefined; let pythonPath = ''; @@ -231,8 +235,6 @@ export class LanguageServerExtensionActivator implements IExtensionActivator { properties['InterpreterPath'] = interpreterData.path; // tslint:disable-next-line:no-string-literal properties['Version'] = interpreterData.version; - // tslint:disable-next-line:no-string-literal - properties['PrefixPath'] = interpreterData.prefix; } // tslint:disable-next-line:no-string-literal diff --git a/src/client/telemetry/constants.ts b/src/client/telemetry/constants.ts index 6cd04b1a8060..dc49860857df 100644 --- a/src/client/telemetry/constants.ts +++ b/src/client/telemetry/constants.ts @@ -40,6 +40,7 @@ export const PYTHON_LANGUAGE_SERVER_DOWNLOADED = 'PYTHON_LANGUAGE_SERVER.DOWNLOA export const PYTHON_LANGUAGE_SERVER_ERROR = 'PYTHON_LANGUAGE_SERVER.ERROR'; export const PYTHON_LANGUAGE_SERVER_STARTUP = 'PYTHON_LANGUAGE_SERVER.STARTUP'; export const PYTHON_LANGUAGE_SERVER_PLATFORM_NOT_SUPPORTED = 'PYTHON_LANGUAGE_SERVER.PLATFORM_NOT_SUPPORTED'; +export const PYTHON_LANGUAGE_SERVER_TELEMETRY = 'PYTHON_LANGUAGE_SERVER.EVENT'; export const TERMINAL_CREATE = 'TERMINAL.CREATE'; export const PYTHON_LANGUAGE_SERVER_LIST_BLOB_STORE_PACKAGES = 'PYTHON_LANGUAGE_SERVER.LIST_BLOB_PACKAGES'; diff --git a/src/client/telemetry/types.ts b/src/client/telemetry/types.ts index 4335ac79de42..5ed17a41fed5 100644 --- a/src/client/telemetry/types.ts +++ b/src/client/telemetry/types.ts @@ -15,7 +15,7 @@ export type FormatTelemetry = { formatSelection: boolean; }; -export type LanguageServerTelemetry = { +export type LanguageServerVersionTelemetry = { success: boolean; lsVersion?: string; }; @@ -24,6 +24,10 @@ export type LanguageServerErrorTelemetry = { error: string; }; +export type LanguageServerTelemetry = { + [key: string]: string; +}; + export type LinterTrigger = 'auto' | 'save'; export type LintingTelemetry = { @@ -86,6 +90,7 @@ export type TerminalTelemetry = { }; export type TelemetryProperties = FormatTelemetry | LanguageServerTelemetry + | LanguageServerVersionTelemetry | LanguageServerErrorTelemetry | LintingTelemetry | EditorLoadTelemetry