Add telemetry for Python on Jupyter server startup (#19970)

* add telemetry for python on jupyter server startup

* remove extra lines
This commit is contained in:
Lucy Zhang
2022-07-11 12:20:22 -07:00
committed by GitHub
parent 2265144909
commit b8435a67df
4 changed files with 28 additions and 15 deletions

View File

@@ -22,7 +22,7 @@ import { BookTocManager, IBookTocManager, quickPickResults } from './bookTocMana
import { CreateBookDialog } from '../dialog/createBookDialog'; import { CreateBookDialog } from '../dialog/createBookDialog';
import { AddTocEntryDialog } from '../dialog/addTocEntryDialog'; import { AddTocEntryDialog } from '../dialog/addTocEntryDialog';
import { getContentPath } from './bookVersionHandler'; import { getContentPath } from './bookVersionHandler';
import { TelemetryReporter, BookTelemetryView, NbTelemetryActions } from '../telemetry'; import { sendNotebookActionEvent, NbTelemetryView, NbTelemetryAction } from '../telemetry';
interface BookSearchResults { interface BookSearchResults {
notebookPaths: string[]; notebookPaths: string[];
@@ -124,7 +124,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
} }
}); });
} }
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.TrustNotebook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.TrustNotebook);
void vscode.window.showInformationMessage(loc.msgBookTrusted); void vscode.window.showInformationMessage(loc.msgBookTrusted);
} else { } else {
void vscode.window.showInformationMessage(loc.msgBookAlreadyTrusted); void vscode.window.showInformationMessage(loc.msgBookAlreadyTrusted);
@@ -136,7 +136,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
let bookPathToUpdate = bookTreeItem.book?.contentPath; let bookPathToUpdate = bookTreeItem.book?.contentPath;
if (bookPathToUpdate) { if (bookPathToUpdate) {
let pinStatusChanged = await this.bookPinManager.pinNotebook(bookTreeItem); let pinStatusChanged = await this.bookPinManager.pinNotebook(bookTreeItem);
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.PinNotebook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.PinNotebook);
if (pinStatusChanged) { if (pinStatusChanged) {
bookTreeItem.contextValue = 'pinnedNotebook'; bookTreeItem.contextValue = 'pinnedNotebook';
} }
@@ -155,7 +155,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
async createBook(): Promise<void> { async createBook(): Promise<void> {
const dialog = new CreateBookDialog(this.bookTocManager); const dialog = new CreateBookDialog(this.bookTocManager);
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.CreateBook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.CreateBook);
return dialog.createDialog(); return dialog.createDialog();
} }
@@ -211,7 +211,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
* @param treeItems Elements to be moved * @param treeItems Elements to be moved
*/ */
async moveTreeItems(treeItems: BookTreeItem[]): Promise<void> { async moveTreeItems(treeItems: BookTreeItem[]): Promise<void> {
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.MoveNotebook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.MoveNotebook);
const selectionResults = await this.bookSectionQuickPick(); const selectionResults = await this.bookSectionQuickPick();
if (selectionResults) { if (selectionResults) {
let pickedSection = selectionResults.quickPickSection; let pickedSection = selectionResults.quickPickSection;
@@ -250,7 +250,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
await this.showPreviewFile(urlToOpen); await this.showPreviewFile(urlToOpen);
} }
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.OpenBook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.OpenBook);
} catch (e) { } catch (e) {
// if there is an error remove book from context // if there is an error remove book from context
const index = this.books.findIndex(book => book.bookPath === bookPath); const index = this.books.findIndex(book => book.bookPath === bookPath);
@@ -317,7 +317,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
} }
this._onDidChangeTreeData.fire(undefined); this._onDidChangeTreeData.fire(undefined);
} }
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.CloseBook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.CloseBook);
} catch (e) { } catch (e) {
void vscode.window.showErrorMessage(loc.closeBookError(book.root, e instanceof Error ? e.message : e)); void vscode.window.showErrorMessage(loc.closeBookError(book.root, e instanceof Error ? e.message : e));
} finally { } finally {
@@ -402,7 +402,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
this._visitedNotebooks = this._visitedNotebooks.concat([normalizedResource]); this._visitedNotebooks = this._visitedNotebooks.concat([normalizedResource]);
} }
} }
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.OpenNotebookFromBook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.OpenNotebookFromBook);
} catch (e) { } catch (e) {
void vscode.window.showErrorMessage(loc.openNotebookError(resource, e instanceof Error ? e.message : e)); void vscode.window.showErrorMessage(loc.openNotebookError(resource, e instanceof Error ? e.message : e));
} }
@@ -754,7 +754,7 @@ export class BookTreeViewProvider implements vscode.TreeDataProvider<BookTreeIte
async onDrop(sources: vscode.TreeDataTransfer, target: BookTreeItem): Promise<void> { async onDrop(sources: vscode.TreeDataTransfer, target: BookTreeItem): Promise<void> {
if (target.contextValue === BookTreeItemType.savedBook || target.contextValue === BookTreeItemType.section) { if (target.contextValue === BookTreeItemType.savedBook || target.contextValue === BookTreeItemType.section) {
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.DragAndDrop); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.DragAndDrop);
// gets the tree items that are dragged and dropped // gets the tree items that are dragged and dropped
let treeItems = JSON.parse(await sources.items.get(this.supportedTypes[0])!.asString()) as BookTreeItem[]; let treeItems = JSON.parse(await sources.items.get(this.supportedTypes[0])!.asString()) as BookTreeItem[];
let rootItems = this.getLocalRoots(treeItems); let rootItems = this.getLocalRoots(treeItems);

View File

@@ -20,7 +20,7 @@ import { IconPathHelper } from './common/iconHelper';
import { ExtensionContextHelper } from './common/extensionContextHelper'; import { ExtensionContextHelper } from './common/extensionContextHelper';
import { BookTreeItem } from './book/bookTreeItem'; import { BookTreeItem } from './book/bookTreeItem';
import Logger from './common/logger'; import Logger from './common/logger';
import { TelemetryReporter, BookTelemetryView, NbTelemetryActions } from './telemetry'; import { sendNotebookActionEvent, NbTelemetryView, NbTelemetryAction } from './telemetry';
const localize = nls.loadMessageBundle(); const localize = nls.loadMessageBundle();
@@ -81,7 +81,7 @@ export async function activate(extensionContext: vscode.ExtensionContext): Promi
extensionContext.subscriptions.push(vscode.commands.registerCommand('notebook.command.openRemoteBook', async () => { extensionContext.subscriptions.push(vscode.commands.registerCommand('notebook.command.openRemoteBook', async () => {
let dialog = new RemoteBookDialog(remoteBookController); let dialog = new RemoteBookDialog(remoteBookController);
TelemetryReporter.sendActionEvent(BookTelemetryView, NbTelemetryActions.AddRemoteBook); sendNotebookActionEvent(NbTelemetryView.Book, NbTelemetryAction.AddRemoteBook);
return dialog.createDialog(); return dialog.createDialog();
})); }));

View File

@@ -16,6 +16,7 @@ import { IServerInstance } from './common';
import { JupyterServerInstallation } from './jupyterServerInstallation'; import { JupyterServerInstallation } from './jupyterServerInstallation';
import * as utils from '../common/utils'; import * as utils from '../common/utils';
import * as constants from '../common/constants'; import * as constants from '../common/constants';
import { sendNotebookActionEvent, NbTelemetryView, NbTelemetryAction } from '../telemetry';
const NotebookConfigFilename = 'jupyter_notebook_config.py'; const NotebookConfigFilename = 'jupyter_notebook_config.py';
const CustomJsFilename = 'custom.js'; const CustomJsFilename = 'custom.js';
@@ -218,6 +219,7 @@ export class PerFolderServerInstance implements IServerInstance {
// Execute the command // Execute the command
await this.executeStartCommand(startCommand); await this.executeStartCommand(startCommand);
sendNotebookActionEvent(NbTelemetryView.Jupyter, NbTelemetryAction.JupyterServerStarted, { pythonVersion: this.options.install.installedPythonVersion, usingExistingPython: String(JupyterServerInstallation.getExistingPythonSetting()), usingConda: String(this.options.install.usingConda) });
} }
private executeStartCommand(startCommand: string): Promise<void> { private executeStartCommand(startCommand: string): Promise<void> {

View File

@@ -3,14 +3,17 @@
* Licensed under the Source EULA. See License.txt in the project root for license information. * Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import AdsTelemetryReporter from '@microsoft/ads-extension-telemetry'; import AdsTelemetryReporter, { TelemetryEventMeasures, TelemetryEventProperties } from '@microsoft/ads-extension-telemetry';
const packageJson = require('../package.json'); const packageJson = require('../package.json');
export const TelemetryReporter = new AdsTelemetryReporter(packageJson.name, packageJson.version, packageJson.aiKey); export const TelemetryReporter = new AdsTelemetryReporter(packageJson.name, packageJson.version, packageJson.aiKey);
export const BookTelemetryView = 'Book'; export enum NbTelemetryView {
Book = 'Book',
Jupyter = 'Jupyter'
}
export enum NbTelemetryActions { export enum NbTelemetryAction {
OpenNotebook = 'NotebookOpened', OpenNotebook = 'NotebookOpened',
OpenMarkdown = 'MarkdownOpened', OpenMarkdown = 'MarkdownOpened',
OpenBook = 'BookOpened', OpenBook = 'BookOpened',
@@ -22,6 +25,14 @@ export enum NbTelemetryActions {
OpenNotebookFromBook = 'NotebookOpenedFromBook', OpenNotebookFromBook = 'NotebookOpenedFromBook',
MoveNotebook = 'MoveNotebook', MoveNotebook = 'MoveNotebook',
DragAndDrop = 'DragAndDrop', DragAndDrop = 'DragAndDrop',
AddRemoteBook = 'AddRemoteBook' AddRemoteBook = 'AddRemoteBook',
JupyterServerStarted = 'JupyterServerStarted'
}
export function sendNotebookActionEvent(telemetryView: NbTelemetryView, telemetryAction: NbTelemetryAction, additionalProps?: TelemetryEventProperties, additionalMeasurements?: TelemetryEventMeasures): void {
TelemetryReporter.createActionEvent(telemetryView, telemetryAction)
.withAdditionalProperties(additionalProps)
.withAdditionalMeasurements(additionalMeasurements)
.send();
} }