* Remove all custom telemetry events

* Remove unneeded timer

Co-authored-by: Aditya Bist <adbist@microsoft.com>
This commit is contained in:
Charles Gagnon 2020-02-21 08:41:06 -08:00 коммит произвёл GitHub
Родитель c6cbe31ee5
Коммит 4f848c355e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
16 изменённых файлов: 13 добавлений и 399 удалений

Просмотреть файл

@ -265,7 +265,7 @@ gulp.task('ext:test', (done) => {
console.log(`stdout: ${process.stdout}`);
console.log(`stderr: ${process.stderr}`);
console.error(`exec error: ${error}`);
throw(error);
done(error);
});
}
})

Просмотреть файл

@ -131,7 +131,6 @@
"semver": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz",
"tmp": "^0.0.28",
"underscore": "^1.8.3",
"vscode-extension-telemetry": "^0.1.1",
"vscode-languageclient": "5.2.1",
"vscode-nls": "^2.0.2",
"zone.js": "^0.6.26"

Просмотреть файл

@ -16,7 +16,6 @@ import { ConnectionUI } from '../views/connectionUI';
import StatusView from '../views/statusView';
import SqlToolsServerClient from '../languageservice/serviceclient';
import { IPrompter } from '../prompts/question';
import Telemetry from '../models/telemetry';
import VscodeWrapper from './vscodeWrapper';
import {NotificationHandler} from 'vscode-languageclient';
import {Runtime, PlatformInformation} from '../models/platform';
@ -49,21 +48,6 @@ export class ConnectionInfo {
*/
public serverInfo: ConnectionContracts.ServerInfo;
/**
* Timer for tracking extension connection time.
*/
public extensionTimer: Utils.Timer;
/**
* Timer for tracking service connection time.
*/
public serviceTimer: Utils.Timer;
/**
* Timer for tracking intelliSense activation time.
*/
public intelliSenseTimer: Utils.Timer;
/**
* Whether the connection is in the process of connecting.
*/
@ -256,21 +240,12 @@ export default class ConnectionManager {
self._statusView.languageServiceStatusChanged(event.ownerUri, LocalizedConstants.intelliSenseUpdatedStatus);
let connection = self.getConnectionInfo(event.ownerUri);
if (connection !== undefined) {
connection.intelliSenseTimer.end();
let duration = connection.intelliSenseTimer.getDuration();
let numberOfCharacters: number = 0;
if (this.vscodeWrapper.activeTextEditor !== undefined
&& this.vscodeWrapper.activeTextEditor.document !== undefined) {
let document = this.vscodeWrapper.activeTextEditor.document;
numberOfCharacters = document.getText().length;
}
Telemetry.sendTelemetryEvent('IntelliSenseActivated',
{
isAzure: connection.serverInfo && connection.serverInfo.isCloud ? '1' : '0'},
{
duration: duration,
fileSize: numberOfCharacters
});
}
};
}
@ -306,7 +281,6 @@ export default class ConnectionManager {
return async (result: ConnectionContracts.ConnectionCompleteParams): Promise<void> => {
let fileUri = result.ownerUri;
let connection = self.getConnectionInfo(fileUri);
connection.serviceTimer.end();
connection.connecting = false;
// Convert to credentials if it's a connection string based connection
if (connection.credentials.connectionString) {
@ -368,20 +342,6 @@ export default class ConnectionManager {
this._vscodeWrapper.logToOutputChannel(
Utils.formatString(LocalizedConstants.msgConnectedServerInfo, connection.credentials.server, fileUri, JSON.stringify(connection.serverInfo))
);
connection.extensionTimer.end();
Telemetry.sendTelemetryEvent('DatabaseConnected', {
connectionType: connection.serverInfo ? (connection.serverInfo.isCloud ? 'Azure' : 'Standalone') : '',
serverVersion: connection.serverInfo ? connection.serverInfo.serverVersion : '',
serverEdition: connection.serverInfo ? connection.serverInfo.serverEdition : '',
serverOs: connection.serverInfo ? this.getIsServerLinux(connection.serverInfo.osVersion) : ''
}, {
isEncryptedConnection: connection.credentials.encrypt ? 1 : 0,
isIntegratedAuthentication: connection.credentials.authenticationType === 'Integrated' ? 1 : 0,
extensionConnectionTime: connection.extensionTimer.getDuration() - connection.serviceTimer.getDuration(),
serviceConnectionTime: connection.serviceTimer.getDuration()
});
}
private async handleConnectionErrors(fileUri: string, connection: ConnectionInfo, result: ConnectionContracts.ConnectionCompleteParams): Promise<void> {
@ -511,8 +471,6 @@ export default class ConnectionManager {
self.disconnect(fileUri).then( () => {
self.connect(fileUri, newDatabaseCredentials).then( () => {
Telemetry.sendTelemetryEvent('UseDatabase');
self.vscodeWrapper.logToOutputChannel(
Utils.formatString(
LocalizedConstants.msgChangedDatabase,
@ -547,7 +505,6 @@ export default class ConnectionManager {
}
await self.disconnect(fileUri);
await self.connect(fileUri, newDatabaseCredentials);
Telemetry.sendTelemetryEvent('UseDatabase');
self.vscodeWrapper.logToOutputChannel(
Utils.formatString(
LocalizedConstants.msgChangedDatabase,
@ -605,8 +562,6 @@ export default class ConnectionManager {
self.statusView.notConnected(fileUri);
}
if (result) {
Telemetry.sendTelemetryEvent('DatabaseDisconnected');
self.vscodeWrapper.logToOutputChannel(
Utils.formatString(LocalizedConstants.msgDisconnected, fileUri)
);
@ -730,8 +685,6 @@ export default class ConnectionManager {
const self = this;
let connectionPromise = new Promise<boolean>(async (resolve, reject) => {
let connectionInfo: ConnectionInfo = new ConnectionInfo();
connectionInfo.extensionTimer = new Utils.Timer();
connectionInfo.intelliSenseTimer = new Utils.Timer();
connectionInfo.credentials = connectionCreds;
connectionInfo.connecting = true;
this._connections[fileUri] = connectionInfo;
@ -761,8 +714,6 @@ export default class ConnectionManager {
connectParams.ownerUri = fileUri;
connectParams.connection = connectionDetails;
connectionInfo.serviceTimer = new Utils.Timer();
// send connection request message to service host
this._uriToConnectionPromiseMap.set(connectParams.ownerUri, promise);
try {

Просмотреть файл

@ -16,7 +16,6 @@ import ConnectionManager from './connectionManager';
import SqlToolsServerClient from '../languageservice/serviceclient';
import { IPrompter } from '../prompts/question';
import CodeAdapter from '../prompts/adapter';
import Telemetry from '../models/telemetry';
import VscodeWrapper from './vscodeWrapper';
import UntitledSqlDocumentService from './untitledSqlDocumentService';
import { ISelectionData, IConnectionProfile, IConnectionCredentials } from './../models/interfaces';
@ -109,16 +108,15 @@ export default class MainController implements vscode.Disposable {
*/
public activate(): Promise<boolean> {
const self = this;
let activationTimer = new Utils.Timer();
// initialize the language client then register the commands
return this.initialize(activationTimer).then((didInitialize) => {
return this.initialize().then((didInitialize) => {
if (didInitialize) {
// register VS Code commands
this.registerCommand(Constants.cmdConnect);
this._event.on(Constants.cmdConnect, () => { self.runAndLogErrors(self.onNewConnection(), 'onNewConnection'); });
this._event.on(Constants.cmdConnect, () => { self.runAndLogErrors(self.onNewConnection()); });
this.registerCommand(Constants.cmdDisconnect);
this._event.on(Constants.cmdDisconnect, () => { self.runAndLogErrors(self.onDisconnect(), 'onDisconnect'); });
this._event.on(Constants.cmdDisconnect, () => { self.runAndLogErrors(self.onDisconnect()); });
this.registerCommand(Constants.cmdRunQuery);
this._event.on(Constants.cmdRunQuery, () => { self.onRunQuery(); });
this.registerCommand(Constants.cmdManageConnectionProfiles);
@ -126,15 +124,15 @@ export default class MainController implements vscode.Disposable {
this.registerCommand(Constants.cmdRunCurrentStatement);
this._event.on(Constants.cmdManageConnectionProfiles, async () => { await self.onManageProfiles(); });
this.registerCommand(Constants.cmdChooseDatabase);
this._event.on(Constants.cmdChooseDatabase, () => { self.runAndLogErrors(self.onChooseDatabase(), 'onChooseDatabase') ; } );
this._event.on(Constants.cmdChooseDatabase, () => { self.runAndLogErrors(self.onChooseDatabase()) ; } );
this.registerCommand(Constants.cmdChooseLanguageFlavor);
this._event.on(Constants.cmdChooseLanguageFlavor, () => { self.runAndLogErrors(self.onChooseLanguageFlavor(), 'onChooseLanguageFlavor') ; } );
this._event.on(Constants.cmdChooseLanguageFlavor, () => { self.runAndLogErrors(self.onChooseLanguageFlavor()) ; } );
this.registerCommand(Constants.cmdCancelQuery);
this._event.on(Constants.cmdCancelQuery, () => { self.onCancelQuery(); });
this.registerCommand(Constants.cmdShowGettingStarted);
this._event.on(Constants.cmdShowGettingStarted, () => { self.launchGettingStartedPage(); });
this.registerCommand(Constants.cmdNewQuery);
this._event.on(Constants.cmdNewQuery, () => self.runAndLogErrors(self.onNewQuery(), 'onNewQuery'));
this._event.on(Constants.cmdNewQuery, () => self.runAndLogErrors(self.onNewQuery()));
this.registerCommand(Constants.cmdRebuildIntelliSenseCache);
this._event.on(Constants.cmdRebuildIntelliSenseCache, () => { self.onRebuildIntelliSense(); });
this.registerCommandWithArgs(Constants.cmdLoadCompletionExtension);
@ -201,13 +199,11 @@ export default class MainController implements vscode.Disposable {
/**
* Initializes the extension
*/
public initialize(activationTimer: Utils.Timer): Promise<boolean> {
public initialize(): Promise<boolean> {
const self = this;
// initialize language service client
return new Promise<boolean>( (resolve, reject) => {
// Ensure telemetry is disabled
Telemetry.disable();
SqlToolsServerClient.instance.initialize(self._context).then(serverResult => {
// Init status bar
self._statusview = new StatusView(self._vscodeWrapper);
@ -221,12 +217,6 @@ export default class MainController implements vscode.Disposable {
// Init connection manager and connection MRU
self._connectionMgr = new ConnectionManager(self._context, self._statusview, self._prompter);
activationTimer.end();
// telemetry for activation
Telemetry.sendTelemetryEvent('ExtensionActivated', {},
{ activationTime: activationTimer.getDuration(), serviceInstalled: serverResult.installedBeforeInitializing ? 1 : 0 }
);
self.showReleaseNotesPrompt();
@ -240,7 +230,6 @@ export default class MainController implements vscode.Disposable {
self._initialized = true;
resolve(true);
}).catch(err => {
Telemetry.sendTelemetryEventForException(err, 'initialize');
reject(err);
});
});
@ -505,10 +494,9 @@ export default class MainController implements vscode.Disposable {
}
try {
let uri = this._vscodeWrapper.activeTextEditorUri;
Telemetry.sendTelemetryEvent('CancelQuery');
this._outputContentProvider.cancelQuery(uri);
} catch (err) {
Telemetry.sendTelemetryEventForException(err, 'onCancelQuery');
console.warn(`Unexpected error cancelling query : ${err}`);
}
}
@ -559,7 +547,6 @@ export default class MainController implements vscode.Disposable {
*/
public async onManageProfiles(): Promise<void> {
if (this.canRunCommand()) {
Telemetry.sendTelemetryEvent('ManageProfiles');
await this._connectionMgr.onManageProfiles();
return;
}
@ -627,8 +614,6 @@ export default class MainController implements vscode.Disposable {
return;
}
Telemetry.sendTelemetryEvent('RunCurrentStatement');
let editor = self._vscodeWrapper.activeTextEditor;
let uri = self._vscodeWrapper.activeTextEditorUri;
let title = path.basename(editor.document.fileName);
@ -648,7 +633,7 @@ export default class MainController implements vscode.Disposable {
await self._outputContentProvider.runCurrentStatement(self._statusview, uri, querySelection, title);
} catch (err) {
Telemetry.sendTelemetryEventForException(err, 'onRunCurrentStatement');
console.warn(`Unexpected error running current statement : ${err}`);
}
}
@ -695,12 +680,9 @@ export default class MainController implements vscode.Disposable {
if (editor.document.getText(selectionToTrim).trim().length === 0) {
return;
}
Telemetry.sendTelemetryEvent('RunQuery');
await self._outputContentProvider.runQuery(self._statusview, uri, querySelection, title);
} catch (err) {
Telemetry.sendTelemetryEventForException(err, 'onRunQuery');
console.warn(`Unexpected error running query : ${err}`);
}
}
@ -741,11 +723,10 @@ export default class MainController implements vscode.Disposable {
/**
* Executes a callback and logs any errors raised
*/
private runAndLogErrors<T>(promise: Promise<T>, handlerName: string): Promise<T> {
private runAndLogErrors<T>(promise: Promise<T>): Promise<T> {
let self = this;
return promise.catch(err => {
self._vscodeWrapper.showErrorMessage(LocalizedConstants.msgError + err);
Telemetry.sendTelemetryEventForException(err, handlerName);
return undefined;
});
}

Просмотреть файл

@ -11,7 +11,6 @@ import {
} from 'vscode-languageclient';
import * as path from 'path';
import VscodeWrapper from '../controllers/vscodeWrapper';
import Telemetry from '../models/telemetry';
import * as Utils from '../models/utils';
import { VersionRequest } from '../models/contracts';
import { Logger } from '../models/logger';
@ -59,8 +58,6 @@ class LanguageClientErrorHandler {
* @memberOf LanguageClientErrorHandler
*/
showOnErrorPrompt(): void {
Telemetry.sendTelemetryEvent('SqlToolsServiceCrash');
this.vscodeWrapper.showErrorMessage(
Constants.sqlToolsServiceCrashMessage,
Constants.sqlToolsServiceCrashButton).then(action => {
@ -169,7 +166,6 @@ export default class SqlToolsServiceClient {
this._logger.append(`Platform: ${platformInfo.toString()}`);
if (!platformInfo.isValidRuntime()) {
Utils.showErrorMsg(Constants.unsupportedPlatformErrorMessage);
Telemetry.sendTelemetryEvent('UnsupportedPlatform', { platform: platformInfo.toString() });
reject('Invalid Platform');
} else {
if (platformInfo.runtimeId) {
@ -200,7 +196,6 @@ export default class SqlToolsServiceClient {
}).catch(err => {
Utils.logDebug(Constants.serviceLoadingFailed + ' ' + err);
Utils.showErrorMsg(Constants.serviceLoadingFailed);
Telemetry.sendTelemetryEvent('ServiceInitializingFailed');
reject(err);
});
}
@ -299,7 +294,6 @@ export default class SqlToolsServiceClient {
client.onReady().then(() => {
this.checkServiceCompatibility();
client.onNotification(LanguageServiceContracts.TelemetryNotification.type, this.handleLanguageServiceTelemetryNotification());
client.onNotification(LanguageServiceContracts.StatusChangedNotification.type, this.handleLanguageServiceStatusNotification());
});
@ -320,12 +314,6 @@ export default class SqlToolsServiceClient {
return client;
}
private handleLanguageServiceTelemetryNotification(): NotificationHandler<LanguageServiceContracts.TelemetryParams> {
return (event: LanguageServiceContracts.TelemetryParams): void => {
Telemetry.sendTelemetryEvent(event.params.eventName, event.params.properties, event.params.measures);
};
}
/**
* Public for testing purposes only.
*/

Просмотреть файл

@ -4,7 +4,6 @@
*--------------------------------------------------------------------------------------------*/
import {NotificationType, RequestType} from 'vscode-languageclient';
import {Telemetry} from '../telemetry';
// ------------------------------- < IntelliSense Ready Event > ------------------------------------
@ -43,27 +42,7 @@ export class RebuildIntelliSenseParams {
}
// ------------------------------- </ IntelliSense Ready Event > ----------------------------------
// ------------------------------- < Telemetry Sent Event > ------------------------------------
/**
* Event sent when the language service send a telemetry event
*/
export namespace TelemetryNotification {
export const type = new NotificationType<TelemetryParams, void>('telemetry/sqlevent');
}
/**
* Update event parameters
*/
export class TelemetryParams {
public params: {
eventName: string;
properties: Telemetry.ITelemetryEventProperties;
measures: Telemetry.ITelemetryEventMeasures;
};
}
// ------------------------------- </ Telemetry Sent Event > ----------------------------------
// ------------------------------- < Status Event > ------------------------------------
/**

Просмотреть файл

@ -12,7 +12,6 @@ import { RequestType } from 'vscode-languageclient';
import VscodeWrapper from '../controllers/vscodeWrapper';
import SqlToolsServerClient from '../languageservice/serviceclient';
import * as Contracts from '../models/contracts';
import Telemetry from '../models/telemetry';
import * as Utils from '../models/utils';
let opener = require('opener');
@ -190,8 +189,6 @@ export default class ResultsSerializer {
self._vscodeWrapper.logToOutputChannel(LocalizedConstants.msgSaveSucceeded + filePath);
self.openSavedFile(self._filePath, format);
}
// telemetry for save results
Telemetry.sendTelemetryEvent('SavedResults', { 'type': format });
}, error => {
self._vscodeWrapper.showErrorMessage(LocalizedConstants.msgSaveFailed + error.message);

Просмотреть файл

@ -1,149 +0,0 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import vscode = require('vscode');
import TelemetryReporter from 'vscode-extension-telemetry';
import Utils = require('./utils');
import { PlatformInformation } from './platform';
export namespace Telemetry {
let reporter: TelemetryReporter;
let userId: string;
let platformInformation: PlatformInformation;
let disabled: boolean;
// Get the unique ID for the current user of the extension
function getUserId(): Promise<string> {
return new Promise<string>(resolve => {
// Generate the user id if it has not been created already
if (typeof userId === 'undefined') {
let id = Utils.generateUserId();
id.then( newId => {
userId = newId;
resolve(userId);
});
} else {
resolve(userId);
}
});
}
function getPlatformInformation(): Promise<PlatformInformation> {
if (platformInformation) {
return Promise.resolve(platformInformation);
} else {
return new Promise<PlatformInformation>(resolve => {
PlatformInformation.getCurrent().then(info => {
platformInformation = info;
resolve(platformInformation);
});
});
}
}
export interface ITelemetryEventProperties {
[key: string]: string;
}
export interface ITelemetryEventMeasures {
[key: string]: number;
}
/**
* Disable telemetry reporting
*/
export function disable(): void {
disabled = true;
}
/**
* Initialize the telemetry reporter for use.
*/
export function initialize(context: vscode.ExtensionContext): void {
if (typeof reporter === 'undefined') {
// Check if the user has opted out of telemetry
if (!vscode.workspace.getConfiguration('telemetry').get<boolean>('enableTelemetry', true)) {
disable();
return;
}
let packageInfo = Utils.getPackageInfo(context);
reporter = new TelemetryReporter('vscode-mssql', packageInfo.version, packageInfo.aiKey);
}
}
/**
* Filters error paths to only include source files. Exported to support testing
*/
export function filterErrorPath(line: string): string {
if (line) {
let values: string[] = line.split('/out/');
if (values.length <= 1) {
// Didn't match expected format
return line;
} else {
return values[1];
}
}
}
/**
* Send a telemetry event for an exception
*/
export function sendTelemetryEventForException(
err: any, methodName: string): void {
try {
let stackArray: string[];
let firstLine: string = '';
if ( err !== undefined && err.stack !== undefined) {
stackArray = err.stack.split('\n');
if (stackArray !== undefined && stackArray.length >= 2) {
firstLine = stackArray[1]; // The fist line is the error message and we don't want to send that telemetry event
firstLine = filterErrorPath(firstLine);
}
}
// Only adding the method name and the fist line of the stack trace. We don't add the error message because it might have PII
Telemetry.sendTelemetryEvent('Exception', {methodName: methodName, errorLine: firstLine});
Utils.logDebug('Unhandled Exception occurred. error: ' + err + ' method: ' + methodName );
} catch (telemetryErr) {
// If sending telemetry event fails ignore it so it won't break the extension
Utils.logDebug('Failed to send telemetry event. error: ' + telemetryErr );
}
}
/**
* Send a telemetry event using application insights
*/
export function sendTelemetryEvent(
eventName: string,
properties?: ITelemetryEventProperties,
measures?: ITelemetryEventMeasures): void {
if (typeof disabled === 'undefined') {
disabled = false;
}
if (disabled || typeof(reporter) === 'undefined') {
// Don't do anything if telemetry is disabled
return;
}
if (!properties || typeof properties === 'undefined') {
properties = {};
}
// Augment the properties structure with additional common properties before sending
Promise.all<string|PlatformInformation>([getUserId(), getPlatformInformation()]).then(() => {
properties['userId'] = userId;
properties['distribution'] = (platformInformation && platformInformation.distribution) ?
`${platformInformation.distribution.name}, ${platformInformation.distribution.version}` : '';
reporter.sendTelemetryEvent(eventName, properties, measures);
});
}
}
export default Telemetry;

Просмотреть файл

@ -6,13 +6,8 @@
import assert = require('assert');
import Config from '../src/configurations/config';
import Telemetry from '../src/models/telemetry';
suite('Config Tests', () => {
setup(() => {
// Ensure that telemetry is disabled while testing
Telemetry.disable();
});
test('getSqlToolsServiceDownloadUrl should return valid value', (done) => {
return new Promise((resolve, reject) => {

Просмотреть файл

@ -9,7 +9,6 @@ import vscode = require('vscode');
import * as Extension from '../src/extension';
import ConnectionManager from '../src/controllers/connectionManager';
import MainController from '../src/controllers/mainController';
import Telemetry from '../src/models/telemetry';
function ensureExtensionIsActive(): Promise<any> {
return new Promise((resolve, reject) => {
@ -27,10 +26,6 @@ function waitForExtensionToBeActive(resolve): void {
}
suite('Initialization Tests', () => {
setup(() => {
// Ensure that telemetry is disabled while testing
Telemetry.disable();
});
test('Connection manager is initialized properly', (done) => {
// Wait for the extension to activate

Просмотреть файл

@ -18,7 +18,6 @@ import MainController from '../src/controllers/mainController';
import * as Interfaces from '../src/models/interfaces';
import { ConnectionStore } from '../src/models/connectionStore';
import StatusView from '../src/views/statusView';
import Telemetry from '../src/models/telemetry';
import * as Utils from '../src/models/utils';
import { TestExtensionContext, TestPrompter } from './stubs';
import VscodeWrapper from '../src/controllers/vscodeWrapper';
@ -106,10 +105,6 @@ function createTestListDatabasesResult(): ConnectionContracts.ListDatabasesResul
}
suite('Per File Connection Tests', () => {
setup(() => {
// Ensure that telemetry is disabled while testing
Telemetry.disable();
});
test('onNewConnection should ask user for different credentials if connection failed because of invalid credentials', done => {
let vscodeWrapperMock: TypeMoq.IMock<VscodeWrapper> = TypeMoq.Mock.ofType(VscodeWrapper);

Просмотреть файл

@ -6,7 +6,6 @@
import assert = require('assert');
import { expect } from 'chai';
import {Runtime, PlatformInformation, LinuxDistribution} from '../src/models/platform';
import Telemetry from '../src/models/telemetry';
function getPlatform(): Promise<Runtime> {
return PlatformInformation.getCurrent().then (platformInfo => {
@ -16,11 +15,6 @@ function getPlatform(): Promise<Runtime> {
suite('Platform Tests', () => {
setup(() => {
// Ensure that telemetry is disabled while testing
Telemetry.disable();
});
test('getCurrentPlatform should return valid value', (done) => {
getPlatform().then(platform => {
assert.notEqual(platform, Runtime.UnknownRuntime);

Просмотреть файл

@ -7,13 +7,8 @@ import assert = require('assert');
import StatusView from '../src/views/statusView';
import LocalizedConstants = require('../src/constants/localizedConstants');
import Telemetry from '../src/models/telemetry';
suite('Status View Tests', () => {
setup(() => {
// Ensure that telemetry is disabled while testing
Telemetry.disable();
});
test('updateStatusMessage should not immediately update status message for definition request', (done) => {
return new Promise((resolve, reject) => {

Просмотреть файл

@ -1,22 +0,0 @@
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
import assert = require('assert');
import Telemetry from '../src/models/telemetry';
suite('Telemetry Tests', () => {
test('Path before /out/ is stripped', () => {
let errorString = '/User/myuser/vscode/extensions/ms-mssql.mssql-0.1.5/out/src/controller/mainController.js:216.45';
let expectedErrorString = 'src/controller/mainController.js:216.45';
let actualErrorString = Telemetry.filterErrorPath(errorString);
assert.equal(actualErrorString, expectedErrorString);
});
test('Path without /out/ is retained', () => {
let errorString = '/User/should/never/happen/src/controller/mainController.js:216.45';
let actualErrorString = Telemetry.filterErrorPath(errorString);
assert.equal(actualErrorString, errorString);
});
});

6
typings/vscode-extension-telemetry.d.ts поставляемый
Просмотреть файл

@ -1,6 +0,0 @@
declare module 'vscode-extension-telemetry' {
export default class TelemetryReporter {
constructor(extensionId: string,extensionVersion: string, key: string);
sendTelemetryEvent(eventName: string, properties?: { [key: string]: string }, measures?: { [key: string]: number }): void;
}
}

Просмотреть файл

@ -241,16 +241,6 @@ append-buffer@^1.0.2:
dependencies:
buffer-equal "^1.0.0"
applicationinsights@1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.4.0.tgz#e17e436427b6e273291055181e29832cca978644"
integrity sha512-TV8MYb0Kw9uE2cdu4V/UvTKdOABkX2+Fga9iDz0zqV7FLrNXfmAugWZmmdTx4JoynYkln3d5CUHY3oVSUEbfFw==
dependencies:
cls-hooked "^4.2.2"
continuation-local-storage "^3.2.1"
diagnostic-channel "0.2.0"
diagnostic-channel-publishers "^0.3.2"
aproba@^1.0.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@ -433,21 +423,6 @@ async-each@^1.0.1:
resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
async-hook-jl@^1.7.6:
version "1.7.6"
resolved "https://registry.yarnpkg.com/async-hook-jl/-/async-hook-jl-1.7.6.tgz#4fd25c2f864dbaf279c610d73bf97b1b28595e68"
integrity sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==
dependencies:
stack-chain "^1.3.7"
async-listener@^0.6.0:
version "0.6.10"
resolved "https://registry.yarnpkg.com/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc"
integrity sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==
dependencies:
semver "^5.3.0"
shimmer "^1.1.0"
async-settle@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b"
@ -1032,15 +1007,6 @@ cloneable-readable@^1.0.0:
process-nextick-args "^2.0.0"
readable-stream "^2.3.5"
cls-hooked@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/cls-hooked/-/cls-hooked-4.2.2.tgz#ad2e9a4092680cdaffeb2d3551da0e225eae1908"
integrity sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==
dependencies:
async-hook-jl "^1.7.6"
emitter-listener "^1.0.1"
semver "^5.4.1"
code-point-at@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
@ -1151,14 +1117,6 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
continuation-local-storage@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb"
integrity sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==
dependencies:
async-listener "^0.6.0"
emitter-listener "^1.1.1"
convert-source-map@1.X, convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
@ -1499,18 +1457,6 @@ detect-newline@2.X:
resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
diagnostic-channel-publishers@^0.3.2:
version "0.3.3"
resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-0.3.3.tgz#376b7798f4fa90f37eb4f94d2caca611b0e9c330"
integrity sha512-qIocRYU5TrGUkBlDDxaziAK1+squ8Yf2Ls4HldL3xxb/jzmWO2Enux7CvevNKYmF2kDXZ9HiRqwjPsjk8L+i2Q==
diagnostic-channel@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz#cc99af9612c23fb1fff13612c72f2cbfaa8d5a17"
integrity sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=
dependencies:
semver "^5.3.0"
didyoumean@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff"
@ -1649,13 +1595,6 @@ ejs@^2.6.2:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.2.tgz#749037c4c09bd57626a6140afbe6b7e650661614"
integrity sha512-rHGwtpl67oih3xAHbZlpw5rQAt+YV1mSCu2fUZ9XNrfaGEhom7E+AUiMci+ByP4aSfuAWx7hE0BPuJLMrpXwOw==
emitter-listener@^1.0.1, emitter-listener@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8"
integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==
dependencies:
shimmer "^1.2.0"
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@ -4955,7 +4894,7 @@ semver-greatest-satisfied-range@^1.1.0:
dependencies:
sver-compat "^1.5.0"
"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@ -4989,11 +4928,6 @@ set-value@^2.0.0, set-value@^2.0.1:
is-plain-object "^2.0.3"
split-string "^3.0.1"
shimmer@^1.1.0, shimmer@^1.2.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
sigmund@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
@ -5177,11 +5111,6 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
stack-chain@^1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285"
integrity sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=
stack-trace@0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
@ -6040,13 +5969,6 @@ vsce@^1.58.0:
yauzl "^2.3.1"
yazl "^2.2.2"
vscode-extension-telemetry@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/vscode-extension-telemetry/-/vscode-extension-telemetry-0.1.2.tgz#049207f5453930888ff68ca925b07bab08f2c955"
integrity sha512-FSbaZKlIH3VKvBJsKw7v5bESWHXzltji2rtjaJeJglpQH4tfClzwHMzlMXUZGiblV++djEzb1gW8mb5E+wxFsg==
dependencies:
applicationinsights "1.4.0"
vscode-jsonrpc@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz#a7bf74ef3254d0a0c272fab15c82128e378b3be9"