From 1cd60b4319006dc41e542ffc8faf39dc3df652c6 Mon Sep 17 00:00:00 2001 From: Tim Down Date: Tue, 29 Nov 2022 10:09:36 +0000 Subject: [PATCH] Merge pull request #10587 from overleaf/td-commit-hash-metric Add editing session segmentation values for long tasks and release GitOrigin-RevId: ee22238ae40b342cbd6b1e6cddcb2d0e67dba138 --- services/web/frontend/js/ide.js | 2 ++ .../js/infrastructure/cm6-performance.ts | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/services/web/frontend/js/ide.js b/services/web/frontend/js/ide.js index 3d631798ea..fe99db82a0 100644 --- a/services/web/frontend/js/ide.js +++ b/services/web/frontend/js/ide.js @@ -287,6 +287,8 @@ If the project has been renamed please look in your project list for a new proje 'MeanLagsPerMeasure', 'MeanKeypressesPerMeasure', 'MeanKeypressPaint', + 'LongTasks', + 'Release', ] for (const prop of perfProps) { diff --git a/services/web/frontend/js/infrastructure/cm6-performance.ts b/services/web/frontend/js/infrastructure/cm6-performance.ts index 2a58957675..bc206d46c5 100644 --- a/services/web/frontend/js/infrastructure/cm6-performance.ts +++ b/services/web/frontend/js/infrastructure/cm6-performance.ts @@ -2,6 +2,7 @@ import { Transaction } from '@codemirror/state' import { EditorView } from '@codemirror/view' import { round } from 'lodash' import grammarlyExtensionPresent from '../shared/utils/grammarly' +import getMeta from '../utils/meta' const TIMER_START_NAME = 'CM6-BeforeUpdate' const TIMER_END_NAME = 'CM6-AfterUpdate' @@ -47,6 +48,22 @@ try { } } catch (e) {} +let performanceLongtaskSupported = false +let longTaskSinceLastReportCount = 0 + +// Detect support for long task monitoring +try { + if (PerformanceObserver.supportedEntryTypes.includes('longtask')) { + performanceLongtaskSupported = true + + // Register observer for long task notifications + const observer = new PerformanceObserver(list => { + longTaskSinceLastReportCount += list.getEntries().length + }) + observer.observe({ entryTypes: ['longtask'] }) + } +} catch (e) {} + function isInputOrDelete(userEventType: string | undefined) { return ( !!userEventType && ['input', 'delete'].includes(userEventType.split('.')[0]) @@ -242,6 +259,16 @@ export function reportCM6Perf() { performance.clearMeasures(TIMER_KEYPRESS_MEASURE_NAME) + let longTasks = null + + // Get long task entries (Chromium-based browsers only at time of writing) + if (performanceLongtaskSupported) { + longTasks = longTaskSinceLastReportCount + longTaskSinceLastReportCount = 0 + } + + const release = getMeta('ol-ExposedSettings')?.sentryRelease || null + return { max, mean, @@ -259,6 +286,8 @@ export function reportCM6Perf() { meanLagsPerMeasure, meanKeypressesPerMeasure, meanKeypressPaint, + longTasks, + release, } }