From 94c7f6c2f9bb04057ad97e61870413514f82e8e6 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 18 Oct 2018 08:45:25 -0700 Subject: [PATCH 1/3] remove file --- src/client/telemetry/telemetry.ts | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 src/client/telemetry/telemetry.ts diff --git a/src/client/telemetry/telemetry.ts b/src/client/telemetry/telemetry.ts deleted file mode 100644 index 6ae05f9de6c0..000000000000 --- a/src/client/telemetry/telemetry.ts +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -'use strict'; - -// tslint:disable-next-line:no-reference -/// -import { extensions } from 'vscode'; -// tslint:disable-next-line:import-name -import TelemetryReporter from 'vscode-extension-telemetry'; -import { PVSC_EXTENSION_ID } from '../common/constants'; - -// tslint:disable-next-line:no-any -let telemetryReporter: TelemetryReporter; -export function getTelemetryReporter() { - if (telemetryReporter) { - return telemetryReporter; - } - const extensionId = PVSC_EXTENSION_ID; - // tslint:disable-next-line:no-non-null-assertion - const extension = extensions.getExtension(extensionId)!; - // tslint:disable-next-line:no-unsafe-any - const extensionVersion = extension.packageJSON.version; - // tslint:disable-next-line:no-unsafe-any - const aiKey = extension.packageJSON.contributes.debuggers[0].aiKey; - - // tslint:disable-next-line:no-unsafe-any - return telemetryReporter = new TelemetryReporter(extensionId, extensionVersion, aiKey); -} From 670aaeebd7bff6b74bec546d39d4e1b7c5ad6f77 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 18 Oct 2018 08:45:49 -0700 Subject: [PATCH 2/3] Logging of extension load times --- news/2 Fixes/2732.md | 1 + news/2 Fixes/2827.md | 2 +- src/client/activation/activationService.ts | 5 ++-- .../languageServer/languageServer.ts | 7 ++--- .../nuget/azureBlobStoreNugetRepository.ts | 8 +++-- src/client/extension.ts | 7 +++-- .../configuration/pythonPathUpdaterService.ts | 2 +- src/client/telemetry/index.ts | 30 ++++++++++++++++--- src/client/telemetry/types.ts | 7 ++++- 9 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 news/2 Fixes/2732.md diff --git a/news/2 Fixes/2732.md b/news/2 Fixes/2732.md new file mode 100644 index 000000000000..d3c96b186de4 --- /dev/null +++ b/news/2 Fixes/2732.md @@ -0,0 +1 @@ +Disable activation of conda environments in PowerShell. diff --git a/news/2 Fixes/2827.md b/news/2 Fixes/2827.md index d3c96b186de4..83fdf9e5d31f 100644 --- a/news/2 Fixes/2827.md +++ b/news/2 Fixes/2827.md @@ -1 +1 @@ -Disable activation of conda environments in PowerShell. +Add logging along with some some improvements to the load times of the extension. diff --git a/src/client/activation/activationService.ts b/src/client/activation/activationService.ts index 83620b7f2c53..d580f998ee6e 100644 --- a/src/client/activation/activationService.ts +++ b/src/client/activation/activationService.ts @@ -21,8 +21,8 @@ import { } from '../common/types'; import { OSDistro, OSType } from '../common/utils/platform'; import { IServiceContainer } from '../ioc/types'; +import { sendTelemetryEvent } from '../telemetry'; import { PYTHON_LANGUAGE_SERVER_PLATFORM_NOT_SUPPORTED } from '../telemetry/constants'; -import { getTelemetryReporter } from '../telemetry/telemetry'; import { ExtensionActivators, IExtensionActivationService, IExtensionActivator @@ -69,10 +69,9 @@ export class ExtensionActivationService implements IExtensionActivationService, let jedi = this.useJedi(); if (!jedi && !isLSSupported(this.serviceContainer)) { this.appShell.showWarningMessage('The Python Language Server is not supported on your platform.'); - const reporter = getTelemetryReporter(); // tslint:disable-next-line:no-suspicious-comment // TODO: Only send once (ever)? - reporter.sendTelemetryEvent(PYTHON_LANGUAGE_SERVER_PLATFORM_NOT_SUPPORTED); + sendTelemetryEvent(PYTHON_LANGUAGE_SERVER_PLATFORM_NOT_SUPPORTED); jedi = true; } diff --git a/src/client/activation/languageServer/languageServer.ts b/src/client/activation/languageServer/languageServer.ts index 1c04c177fec2..37c3752d09c5 100644 --- a/src/client/activation/languageServer/languageServer.ts +++ b/src/client/activation/languageServer/languageServer.ts @@ -30,11 +30,11 @@ import { StopWatch } from '../../common/utils/stopWatch'; import { IEnvironmentVariablesProvider } from '../../common/variables/types'; import { IServiceContainer } from '../../ioc/types'; import { LanguageServerSymbolProvider } from '../../providers/symbolProvider'; +import { sendTelemetryEvent } from '../../telemetry'; import { PYTHON_LANGUAGE_SERVER_ENABLED, PYTHON_LANGUAGE_SERVER_ERROR } from '../../telemetry/constants'; -import { getTelemetryReporter } from '../../telemetry/telemetry'; import { IUnitTestManagementService } from '../../unittests/types'; import { LanguageServerDownloader } from '../downloader'; import { InterpreterData, InterpreterDataService } from '../interpreterDataService'; @@ -144,8 +144,7 @@ export class LanguageServerExtensionActivator implements IExtensionActivator { private async startLanguageServer(clientOptions: LanguageClientOptions): Promise { // Determine if we are running MSIL/Universal via dotnet or self-contained app. - const reporter = getTelemetryReporter(); - reporter.sendTelemetryEvent(PYTHON_LANGUAGE_SERVER_ENABLED); + sendTelemetryEvent(PYTHON_LANGUAGE_SERVER_ENABLED); const settings = this.configuration.getSettings(); if (!settings.downloadLanguageServer) { @@ -168,7 +167,7 @@ export class LanguageServerExtensionActivator implements IExtensionActivator { return true; } catch (ex) { this.appShell.showErrorMessage(`Language server failed to start. Error ${ex}`); - reporter.sendTelemetryEvent(PYTHON_LANGUAGE_SERVER_ERROR, { error: 'Failed to start (platform)' }); + sendTelemetryEvent(PYTHON_LANGUAGE_SERVER_ERROR, undefined, { error: 'Failed to start (platform)' }); return false; } } diff --git a/src/client/common/nuget/azureBlobStoreNugetRepository.ts b/src/client/common/nuget/azureBlobStoreNugetRepository.ts index 2ca0f46a013a..2e0cad6d3ccc 100644 --- a/src/client/common/nuget/azureBlobStoreNugetRepository.ts +++ b/src/client/common/nuget/azureBlobStoreNugetRepository.ts @@ -3,7 +3,7 @@ 'use strict'; -import { common, createBlobServiceAnonymous } from 'azure-storage'; +import * as azStorageTypes from 'azure-storage'; import { inject, injectable, unmanaged } from 'inversify'; import { IServiceContainer } from '../../ioc/types'; import { captureTelemetry } from '../../telemetry'; @@ -23,12 +23,14 @@ export class AzureBlobStoreNugetRepository implements INugetRepository { @captureTelemetry(PYTHON_LANGUAGE_SERVER_LIST_BLOB_STORE_PACKAGES) @log('Listing Nuget Packages', LogOptions.Arguments) public listPackages(azureBlobStorageAccount: string, azureBlobStorageContainer: string, packageName: string) { - const blobStore = createBlobServiceAnonymous(azureBlobStorageAccount); + // tslint:disable-next-line:no-require-imports + const az = require('azure-storage') as typeof azStorageTypes; + const blobStore = az.createBlobServiceAnonymous(azureBlobStorageAccount); const nugetService = this.serviceContainer.get(INugetService); return new Promise((resolve, reject) => { // We must pass undefined according to docs, but type definition doesn't all it to be undefined or null!!! // tslint:disable-next-line:no-any - const token = undefined as any as common.ContinuationToken; + const token = undefined as any as azStorageTypes.common.ContinuationToken; blobStore.listBlobsSegmentedWithPrefix(azureBlobStorageContainer, packageName, token, (error, result) => { if (error) { diff --git a/src/client/extension.ts b/src/client/extension.ts index 2486f47ed1d5..685488872764 100644 --- a/src/client/extension.ts +++ b/src/client/extension.ts @@ -5,6 +5,7 @@ if ((Reflect as any).metadata === undefined) { // tslint:disable-next-line:no-require-imports no-var-requires require('reflect-metadata'); } +const durations: { [key: string]: number } = {}; import { StopWatch } from './common/utils/stopWatch'; // Do not move this linne of code (used to measure extension load times). const stopWatch = new StopWatch(); @@ -59,10 +60,12 @@ import { ICodeExecutionManager, ITerminalAutoActivation } from './terminals/type import { TEST_OUTPUT_CHANNEL } from './unittests/common/constants'; import { registerTypes as unitTestsRegisterTypes } from './unittests/serviceRegistry'; +durations.codeLoadingTime = stopWatch.elapsedTime; const activationDeferred = createDeferred(); // tslint:disable-next-line:max-func-body-length export async function activate(context: ExtensionContext): Promise { + durations.startActivateTime = stopWatch.elapsedTime; const cont = new Container(); const serviceManager = new ServiceManager(cont); const serviceContainer = new ServiceContainer(cont); @@ -148,6 +151,7 @@ export async function activate(context: ExtensionContext): Promise(IDebuggerBanner).initialize(); + durations.endActivateTime = stopWatch.elapsedTime; activationDeferred.resolve(); return { ready: activationDeferred.promise }; @@ -197,7 +201,6 @@ async function sendStartupTelemetry(activatedPromise: Promise, serviceCont await activatedPromise; const terminalHelper = serviceContainer.get(ITerminalHelper); const terminalShellType = terminalHelper.identifyTerminalShell(terminalHelper.getTerminalShellPath()); - const duration = stopWatch.elapsedTime; const condaLocator = serviceContainer.get(ICondaService); const interpreterService = serviceContainer.get(IInterpreterService); const [condaVersion, interpreter, interpreters] = await Promise.all([ @@ -214,7 +217,7 @@ async function sendStartupTelemetry(activatedPromise: Promise, serviceCont .length > 0; const props = { condaVersion, terminal: terminalShellType, pythonVersion, interpreterType, workspaceFolderCount, hasPython3 }; - sendTelemetryEvent(EDITOR_LOAD, duration, props); + sendTelemetryEvent(EDITOR_LOAD, durations, props); } catch (ex) { logger.logError('sendStartupTelemetry failed.', ex); } diff --git a/src/client/interpreter/configuration/pythonPathUpdaterService.ts b/src/client/interpreter/configuration/pythonPathUpdaterService.ts index 8129885af957..b4b5cb69e0e2 100644 --- a/src/client/interpreter/configuration/pythonPathUpdaterService.ts +++ b/src/client/interpreter/configuration/pythonPathUpdaterService.ts @@ -50,7 +50,7 @@ export class PythonPathUpdaterService implements IPythonPathUpdaterServiceManage .catch(() => ''); const [info, pipVersion] = await Promise.all([infoPromise, pipVersionPromise]); if (info) { - telemtryProperties.pyVersion = info.version; + telemtryProperties.pythonVersion = info.version; } if (pipVersion) { telemtryProperties.pipVersion = pipVersion; diff --git a/src/client/telemetry/index.ts b/src/client/telemetry/index.ts index 18101bd74db2..6e436e509bb9 100644 --- a/src/client/telemetry/index.ts +++ b/src/client/telemetry/index.ts @@ -1,17 +1,39 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -import { isTestExecution } from '../common/constants'; +// tslint:disable-next-line:no-reference +/// +import { extensions } from 'vscode'; +// tslint:disable-next-line:import-name +import TelemetryReporter from 'vscode-extension-telemetry'; +import { isTestExecution, PVSC_EXTENSION_ID } from '../common/constants'; import { StopWatch } from '../common/utils/stopWatch'; -import { getTelemetryReporter } from './telemetry'; import { TelemetryProperties } from './types'; -export function sendTelemetryEvent(eventName: string, durationMs?: number, properties?: TelemetryProperties) { +let telemetryReporter: TelemetryReporter; +function getTelemetryReporter() { + if (telemetryReporter) { + return telemetryReporter; + } + const extensionId = PVSC_EXTENSION_ID; + // tslint:disable-next-line:no-non-null-assertion + const extension = extensions.getExtension(extensionId)!; + // tslint:disable-next-line:no-unsafe-any + const extensionVersion = extension.packageJSON.version; + // tslint:disable-next-line:no-unsafe-any + const aiKey = extension.packageJSON.contributes.debuggers[0].aiKey; + + // tslint:disable-next-line:no-require-imports + const reporter = require('vscode-extension-telemetry').default as typeof TelemetryReporter; + return telemetryReporter = new reporter(extensionId, extensionVersion, aiKey); +} + +export function sendTelemetryEvent(eventName: string, durationMs?: { [key: string]: number } | number, properties?: TelemetryProperties) { if (isTestExecution()) { return; } const reporter = getTelemetryReporter(); - const measures = typeof durationMs === 'number' ? { duration: durationMs } : undefined; + const measures = typeof durationMs === 'number' ? { duration: durationMs } : (durationMs ? durationMs : undefined); // tslint:disable-next-line:no-any const customProperties: { [key: string]: string } = {}; diff --git a/src/client/telemetry/types.ts b/src/client/telemetry/types.ts index 97bd2de7665a..94680da80220 100644 --- a/src/client/telemetry/types.ts +++ b/src/client/telemetry/types.ts @@ -20,6 +20,10 @@ export type LanguageServerTelemetry = { lsVersion?: string; }; +export type LanguageServerErrorTelemetry = { + error: string; +}; + export type LinterTrigger = 'auto' | 'save'; export type LintingTelemetry = { @@ -31,7 +35,7 @@ export type LintingTelemetry = { export type PythonInterpreterTelemetry = { trigger: 'ui' | 'shebang' | 'load'; failed: boolean; - pyVersion?: string; + pythonVersion?: string; pipVersion?: string; }; export type CodeExecutionTelemetry = { @@ -89,6 +93,7 @@ export type TerminalTelemetry = { }; export type TelemetryProperties = FormatTelemetry | LanguageServerTelemetry + | LanguageServerErrorTelemetry | LintingTelemetry | EditorLoadTelemetry | PythonInterpreterTelemetry From e815c2255556422f0c9730b3eea4e14f88f32d84 Mon Sep 17 00:00:00 2001 From: Don Jayamanne Date: Thu, 18 Oct 2018 09:15:08 -0700 Subject: [PATCH 3/3] Send version info --- .../interpreter/configuration/pythonPathUpdaterService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/interpreter/configuration/pythonPathUpdaterService.ts b/src/client/interpreter/configuration/pythonPathUpdaterService.ts index b4b5cb69e0e2..38687cf45721 100644 --- a/src/client/interpreter/configuration/pythonPathUpdaterService.ts +++ b/src/client/interpreter/configuration/pythonPathUpdaterService.ts @@ -50,7 +50,7 @@ export class PythonPathUpdaterService implements IPythonPathUpdaterServiceManage .catch(() => ''); const [info, pipVersion] = await Promise.all([infoPromise, pipVersionPromise]); if (info) { - telemtryProperties.pythonVersion = info.version; + telemtryProperties.pythonVersion = info.version_info.join('.'); } if (pipVersion) { telemtryProperties.pipVersion = pipVersion;