Telemetry for Data Workspaces extension (#13846)

* Add CodeQL Analysis workflow (#10195)

* Add CodeQL Analysis workflow

* Fix path

* test commit pls ignore

* telemetry points

* yarn lock changes

* making test xplat friendly

* PR feedback

* Adding additional telemetry points

Co-authored-by: Justin Hutchings <jhutchings1@users.noreply.github.com>
This commit is contained in:
Benjin Dubishar
2021-01-22 14:18:43 -08:00
committed by GitHub
parent e280205340
commit c903cd87bf
18 changed files with 626 additions and 17 deletions

View File

@@ -6,13 +6,13 @@
import { IProjectProvider } from 'dataworkspace';
import * as vscode from 'vscode';
import { IProjectProviderRegistry } from './interfaces';
import { TelemetryReporter, TelemetryViews } from './telemetry';
export const ProjectProviderRegistry: IProjectProviderRegistry = new class implements IProjectProviderRegistry {
private _providers = new Array<IProjectProvider>();
private _providerFileExtensionMapping: { [key: string]: IProjectProvider } = {};
private _providerProjectTypeMapping: { [key: string]: IProjectProvider } = {};
registerProvider(provider: IProjectProvider): vscode.Disposable {
this.validateProvider(provider);
this._providers.push(provider);
@@ -20,6 +20,14 @@ export const ProjectProviderRegistry: IProjectProviderRegistry = new class imple
this._providerFileExtensionMapping[projectType.projectFileExtension.toUpperCase()] = provider;
this._providerProjectTypeMapping[projectType.id.toUpperCase()] = provider;
});
TelemetryReporter.createActionEvent(TelemetryViews.ProviderRegistration, 'ProviderRegistered')
.withAdditionalProperties({
providerId: provider.providerExtensionId,
extensions: provider.supportedProjectTypes.map(p => p.projectFileExtension).sort().join(', ')
})
.send();
return new vscode.Disposable(() => {
const idx = this._providers.indexOf(provider);
if (idx >= 0) {

View File

@@ -3,15 +3,43 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import * as path from 'path';
import * as utils from './utils';
import * as vscode from 'vscode';
import AdsTelemetryReporter from 'ads-extension-telemetry';
import * as Utils from './utils';
const packageJson = require('../../package.json');
const packageJson = require('../package.json');
let packageInfo = Utils.getPackageInfo(packageJson)!;
let packageInfo = utils.getPackageInfo(packageJson)!;
export const TelemetryReporter = new AdsTelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey);
export enum TelemetryViews {
WorkspaceTreePane = 'WorkspaceTreePane',
OpenExistingDialog = 'OpenExistingDialog',
NewProjectDialog = 'NewProjectDialog',
ProviderRegistration = 'ProviderRegistration'
}
export function calculateRelativity(projectPath: string, workspacePath?: string): string {
workspacePath = workspacePath ?? vscode.workspace.workspaceFile?.fsPath;
if (!workspacePath) {
return 'noWorkspace';
}
const relativePath = path.relative(path.dirname(projectPath), path.dirname(workspacePath));
if (relativePath.length === 0) { // no path difference
return 'sameFolder';
}
const pathParts = relativePath.split(path.sep);
if (pathParts.every(x => x === '..')) {
return 'directAncestor';
}
return 'other'; // sibling, cousin, descendant, etc.
}

View File

@@ -4,9 +4,11 @@
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import * as path from 'path';
import { IWorkspaceService } from './interfaces';
import { UnknownProjectsError } from './constants';
import { WorkspaceTreeItem } from 'dataworkspace';
import { TelemetryReporter } from './telemetry';
/**
* Tree data provider for the workspace main view
@@ -40,8 +42,14 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider<Worksp
await vscode.commands.executeCommand('setContext', 'isProjectsViewEmpty', projects.length === 0);
const unknownProjects: string[] = [];
const treeItems: WorkspaceTreeItem[] = [];
const typeMetric: Record<string, number> = {};
for (const project of projects) {
const projectProvider = await this._workspaceService.getProjectProvider(project);
this.incrementProjectTypeMetric(typeMetric, project);
if (projectProvider === undefined) {
unknownProjects.push(project.path);
continue;
@@ -60,10 +68,30 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider<Worksp
});
});
}
TelemetryReporter.sendMetricsEvent(typeMetric, 'OpenWorkspaceProjectTypes');
TelemetryReporter.sendMetricsEvent(
{
'handled': projects.length - unknownProjects.length,
'unhandled': unknownProjects.length
},
'OpenWorkspaceProjectsHandled');
if (unknownProjects.length > 0) {
vscode.window.showErrorMessage(UnknownProjectsError(unknownProjects));
}
return treeItems;
}
}
private incrementProjectTypeMetric(typeMetric: Record<string, number>, projectUri: vscode.Uri) {
const ext = path.extname(projectUri.fsPath);
if (!typeMetric.hasOwnProperty(ext)) {
typeMetric[ext] = 0;
}
typeMetric[ext]++;
}
}