From 7b472bcd8083b0e6b4a002f2f1a8964977d03b07 Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Fri, 8 Sep 2023 16:46:38 +0200 Subject: [PATCH] Merge pull request #14732 from overleaf/jpa-split-test-metrics [web] collect metrics for split test system GitOrigin-RevId: 6440b9b9d9900cb8eac9a82ab2f62ae93d7e502a --- .../src/Features/SplitTests/SplitTestCache.js | 4 ++ .../Features/SplitTests/SplitTestHandler.js | 43 ++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/services/web/app/src/Features/SplitTests/SplitTestCache.js b/services/web/app/src/Features/SplitTests/SplitTestCache.js index fcf720504e..5b61783051 100644 --- a/services/web/app/src/Features/SplitTests/SplitTestCache.js +++ b/services/web/app/src/Features/SplitTests/SplitTestCache.js @@ -1,3 +1,4 @@ +const Metrics = require('@overleaf/metrics') const SplitTestManager = require('./SplitTestManager') const { CacheLoader } = require('cache-flow') @@ -9,6 +10,9 @@ class SplitTestCache extends CacheLoader { } async load(name) { + Metrics.inc('split_test_get_split_test_from_mongo', 1, { + path: name, + }) const splitTest = await SplitTestManager.getSplitTest({ name, archived: { $ne: true }, diff --git a/services/web/app/src/Features/SplitTests/SplitTestHandler.js b/services/web/app/src/Features/SplitTests/SplitTestHandler.js index 0e7bf8cbe6..91181a261f 100644 --- a/services/web/app/src/Features/SplitTests/SplitTestHandler.js +++ b/services/web/app/src/Features/SplitTests/SplitTestHandler.js @@ -1,3 +1,4 @@ +const Metrics = require('@overleaf/metrics') const UserGetter = require('../User/UserGetter') const UserUpdater = require('../User/UserUpdater') const AnalyticsManager = require('../Analytics/AnalyticsManager') @@ -79,6 +80,7 @@ async function getAssignment(req, res, splitTestName, { sync = false } = {}) { session: req.session, sync, }) + _collectSessionStats(req.session) } } @@ -223,9 +225,19 @@ async function _getAssignment( currentVersion ) if (cachedVariant) { + Metrics.inc('split_test_get_assignment_source', 1, { status: 'cache' }) return _makeAssignment(splitTest, cachedVariant, currentVersion) } } + + if (user) { + Metrics.inc('split_test_get_assignment_source', 1, { status: 'provided' }) + } else if (userId) { + Metrics.inc('split_test_get_assignment_source', 1, { status: 'mongo' }) + } else { + Metrics.inc('split_test_get_assignment_source', 1, { status: 'none' }) + } + user = user || (userId && (await _getUser(userId))) const { activeForUser, selectedVariantName, phase, versionNumber } = await _getAssignmentMetadata(analyticsId, user, splitTest) @@ -386,12 +398,18 @@ function _getCachedVariantFromSession(session, splitTestName, currentVersion) { } async function _getUser(id) { - return UserGetter.promises.getUser(id, { + const user = await UserGetter.promises.getUser(id, { analyticsId: 1, splitTests: 1, alphaProgram: 1, betaProgram: 1, }) + Metrics.histogram( + 'split_test_get_user_from_mongo_size', + JSON.stringify(user).length, + [0, 100, 500, 1000, 2000, 5000, 10000, 15000, 20000, 50000, 100000] + ) + return user } async function _loadSplitTestInfoInLocals(locals, splitTestName) { @@ -417,6 +435,29 @@ function _getNonSaasAssignment(splitTestName) { return DEFAULT_ASSIGNMENT } +function _collectSessionStats(session) { + if (session.cachedSplitTestAssignments) { + Metrics.summary( + 'split_test_session_cache_count', + Object.keys(session.cachedSplitTestAssignments).length + ) + Metrics.summary( + 'split_test_session_cache_size', + JSON.stringify(session.cachedSplitTestAssignments).length + ) + } + if (session.splitTests) { + Metrics.summary( + 'split_test_session_storage_count', + Object.keys(session.splitTests).length + ) + Metrics.summary( + 'split_test_session_storage_size', + JSON.stringify(session.splitTests).length + ) + } +} + module.exports = { getPercentile, getAssignment: callbackify(getAssignment),