'use strict';
|
|
import { Disposable, env, version, workspace } from 'vscode';
|
|
import { ExtensionKey, IConfig } from './configuration';
|
|
import * as os from 'os';
|
|
|
|
let _reporter: TelemetryReporter;
|
|
|
|
export class Telemetry extends Disposable {
|
|
|
|
static configure(key: string) {
|
|
const cfg = workspace.getConfiguration().get<IConfig>(ExtensionKey)!;
|
|
if (!cfg.advanced.telemetry.enabled || !workspace.getConfiguration('telemetry').get<boolean>('enableTelemetry', true)) return;
|
|
|
|
_reporter = new TelemetryReporter(key);
|
|
}
|
|
|
|
static setContext(context?: { [key: string]: string }) {
|
|
if (_reporter === undefined) return;
|
|
|
|
_reporter.setContext(context);
|
|
}
|
|
|
|
static trackEvent(name: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number; }) {
|
|
if (_reporter === undefined) return;
|
|
|
|
_reporter.trackEvent(name, properties, measurements);
|
|
}
|
|
|
|
static trackException(ex: Error) {
|
|
if (_reporter === undefined) return;
|
|
|
|
_reporter.trackException(ex);
|
|
}
|
|
}
|
|
|
|
export class TelemetryReporter {
|
|
|
|
private appInsights: ApplicationInsights;
|
|
private _client: Client;
|
|
private _context: { [key: string]: string };
|
|
|
|
constructor(key: string) {
|
|
const diagChannelState = process.env['APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL'];
|
|
(process.env['APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL'] as any) = true;
|
|
this.appInsights = require('applicationinsights') as ApplicationInsights;
|
|
process.env['APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL'] = diagChannelState;
|
|
|
|
if (this.appInsights.client) {
|
|
this._client = this.appInsights.getClient(key);
|
|
// no other way to enable offline mode
|
|
this._client.channel.setOfflineMode(true);
|
|
}
|
|
else {
|
|
this._client = this.appInsights.setup(key)
|
|
.setAutoCollectRequests(false)
|
|
.setAutoCollectPerformance(false)
|
|
.setAutoCollectExceptions(false)
|
|
.setAutoCollectDependencies(false)
|
|
.setAutoCollectConsole(false)
|
|
.setAutoDependencyCorrelation(false)
|
|
.setOfflineMode(true)
|
|
.start()
|
|
.client;
|
|
}
|
|
|
|
this.setContext();
|
|
this._stripPII(this._client);
|
|
}
|
|
|
|
setContext(context?: { [key: string]: string }) {
|
|
if (!this._context) {
|
|
this._context = Object.create(null);
|
|
|
|
// Add vscode properties
|
|
this._context['code.language'] = env.language;
|
|
this._context['code.version'] = version;
|
|
this._context[this._client.context.keys.sessionId] = env.sessionId;
|
|
|
|
// Add os properties
|
|
this._context['os.platform'] = os.platform();
|
|
this._context['os.version'] = os.release();
|
|
}
|
|
|
|
if (context) {
|
|
Object.assign(this._context, context);
|
|
}
|
|
|
|
Object.assign(this._client.commonProperties, this._context);
|
|
}
|
|
|
|
trackEvent(name: string, properties?: { [key: string]: string }, measurements?: { [key: string]: number; }) {
|
|
this._client.trackEvent(name, properties, measurements);
|
|
}
|
|
|
|
trackException(ex: Error) {
|
|
this._client.trackException(ex);
|
|
}
|
|
|
|
private _stripPII(client: Client) {
|
|
if (client && client.context && client.context.keys && client.context.tags) {
|
|
const machineNameKey = client.context.keys.deviceMachineName;
|
|
client.context.tags[machineNameKey] = '';
|
|
}
|
|
}
|
|
}
|