From 8f218ce2a5d8272e6dfaa800370315dac9c4fe30 Mon Sep 17 00:00:00 2001 From: Aaron Munger Date: Mon, 1 Apr 2024 14:49:43 -0700 Subject: [PATCH] notebook output performance (#209282) * record perf data for notebook outputs * debounce event per cell * send size info, emit directly from perf message listener * fix classification details * better names --- .../view/renderers/backLayerWebView.ts | 27 +++++++++++++++++++ .../browser/view/renderers/webviewMessages.ts | 2 ++ .../browser/view/renderers/webviewPreloads.ts | 16 ++++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 9b1a480c9c5..6a6e150c4a0 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -909,6 +909,9 @@ export class BackLayerWebView extends Themable { } case 'notebookPerformanceMessage': { this.notebookEditor.updatePerformanceMetadata(data.cellId, data.executionId, data.duration, data.rendererId); + if (data.mimeType && data.outputSize && data.rendererId === 'vscode.builtin-renderer') { + this._sendPerformanceData(data.mimeType, data.outputSize, data.duration); + } break; } case 'outputInputFocus': { @@ -927,6 +930,30 @@ export class BackLayerWebView extends Themable { return initializePromise.p; } + private _sendPerformanceData(mimeType: string, outputSize: number, renderTime: number) { + type NotebookOutputRenderClassification = { + owner: 'amunger'; + comment: 'Track performance data for output rendering'; + mimeType: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Presentation type of the output.' }; + outputSize: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Size of the output data buffer.'; isMeasurement: true }; + renderTime: { classification: 'SystemMetaData'; purpose: 'FeatureInsight'; comment: 'Time spent rendering output.'; isMeasurement: true }; + }; + + type NotebookOutputRenderEvent = { + mimeType: string; + outputSize: number; + renderTime: number; + }; + + const telemetryData = { + mimeType, + outputSize, + renderTime + }; + + this.telemetryService.publicLog2('NotebookCellOutputRender', telemetryData); + } + private _handleNotebookCellResource(uri: URI) { const notebookResource = uri.path.length > 0 ? uri : this.documentUri; diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts index cf46832a5c9..5d0e13ad3b2 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewMessages.ts @@ -485,6 +485,8 @@ export interface IPerformanceMessage extends BaseToWebviewMessage { readonly cellId: string; readonly duration: number; readonly rendererId: string; + readonly outputSize?: number; + readonly mimeType?: string; } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index f9b0319a445..edaf44036ca 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -2711,7 +2711,21 @@ async function webviewPreloads(ctx: PreloadContext) { outputElement/** outputNode */.element.style.visibility = data.initiallyHidden ? 'hidden' : ''; if (!!data.executionId && !!data.rendererId) { - postNotebookMessage('notebookPerformanceMessage', { cellId: data.cellId, executionId: data.executionId, duration: Date.now() - startTime, rendererId: data.rendererId }); + let outputSize: number | undefined = undefined; + let mimeType: string | undefined = undefined; + if (data.content.type === 1 /* extension */) { + outputSize = data.content.output.valueBytes.length; + mimeType = data.content.output.mime; + } + + postNotebookMessage('notebookPerformanceMessage', { + cellId: data.cellId, + executionId: data.executionId, + duration: Date.now() - startTime, + rendererId: data.rendererId, + outputSize, + mimeType + }); } }