Просмотр исходного кода

Merge pull request #14732 from overleaf/jpa-split-test-metrics

[web] collect metrics for split test system

GitOrigin-RevId: 6440b9b9d9900cb8eac9a82ab2f62ae93d7e502a
Jakob Ackermann 3 лет назад
Родитель
Сommit
7b472bcd80

+ 4 - 0
services/web/app/src/Features/SplitTests/SplitTestCache.js

@@ -1,3 +1,4 @@
+const Metrics = require('@overleaf/metrics')
 const SplitTestManager = require('./SplitTestManager')
 const SplitTestManager = require('./SplitTestManager')
 const { CacheLoader } = require('cache-flow')
 const { CacheLoader } = require('cache-flow')
 
 
@@ -9,6 +10,9 @@ class SplitTestCache extends CacheLoader {
   }
   }
 
 
   async load(name) {
   async load(name) {
+    Metrics.inc('split_test_get_split_test_from_mongo', 1, {
+      path: name,
+    })
     const splitTest = await SplitTestManager.getSplitTest({
     const splitTest = await SplitTestManager.getSplitTest({
       name,
       name,
       archived: { $ne: true },
       archived: { $ne: true },

+ 42 - 1
services/web/app/src/Features/SplitTests/SplitTestHandler.js

@@ -1,3 +1,4 @@
+const Metrics = require('@overleaf/metrics')
 const UserGetter = require('../User/UserGetter')
 const UserGetter = require('../User/UserGetter')
 const UserUpdater = require('../User/UserUpdater')
 const UserUpdater = require('../User/UserUpdater')
 const AnalyticsManager = require('../Analytics/AnalyticsManager')
 const AnalyticsManager = require('../Analytics/AnalyticsManager')
@@ -79,6 +80,7 @@ async function getAssignment(req, res, splitTestName, { sync = false } = {}) {
         session: req.session,
         session: req.session,
         sync,
         sync,
       })
       })
+      _collectSessionStats(req.session)
     }
     }
   }
   }
 
 
@@ -223,9 +225,19 @@ async function _getAssignment(
       currentVersion
       currentVersion
     )
     )
     if (cachedVariant) {
     if (cachedVariant) {
+      Metrics.inc('split_test_get_assignment_source', 1, { status: 'cache' })
       return _makeAssignment(splitTest, cachedVariant, currentVersion)
       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)))
   user = user || (userId && (await _getUser(userId)))
   const { activeForUser, selectedVariantName, phase, versionNumber } =
   const { activeForUser, selectedVariantName, phase, versionNumber } =
     await _getAssignmentMetadata(analyticsId, user, splitTest)
     await _getAssignmentMetadata(analyticsId, user, splitTest)
@@ -386,12 +398,18 @@ function _getCachedVariantFromSession(session, splitTestName, currentVersion) {
 }
 }
 
 
 async function _getUser(id) {
 async function _getUser(id) {
-  return UserGetter.promises.getUser(id, {
+  const user = await UserGetter.promises.getUser(id, {
     analyticsId: 1,
     analyticsId: 1,
     splitTests: 1,
     splitTests: 1,
     alphaProgram: 1,
     alphaProgram: 1,
     betaProgram: 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) {
 async function _loadSplitTestInfoInLocals(locals, splitTestName) {
@@ -417,6 +435,29 @@ function _getNonSaasAssignment(splitTestName) {
   return DEFAULT_ASSIGNMENT
   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 = {
 module.exports = {
   getPercentile,
   getPercentile,
   getAssignment: callbackify(getAssignment),
   getAssignment: callbackify(getAssignment),