From 3eedc884f24788a0f6993d5992f94af55b79efbe Mon Sep 17 00:00:00 2001 From: Jimmy Domagala-Tang Date: Wed, 17 Jul 2024 08:55:53 -0400 Subject: [PATCH] Merge pull request #19328 from overleaf/jdt-global-metrics Allow for site wide metrics and counters GitOrigin-RevId: e788488bdd673aef4ba0e45a9e39832d6203c44c --- .../GlobalMetrics/GlobalMetricsManager.js | 38 +++++++++++++++++++ .../web/app/src/infrastructure/mongodb.js | 1 + services/web/app/src/models/GlobalMetric.js | 19 ++++++++++ 3 files changed, 58 insertions(+) create mode 100644 services/web/app/src/Features/GlobalMetrics/GlobalMetricsManager.js create mode 100644 services/web/app/src/models/GlobalMetric.js diff --git a/services/web/app/src/Features/GlobalMetrics/GlobalMetricsManager.js b/services/web/app/src/Features/GlobalMetrics/GlobalMetricsManager.js new file mode 100644 index 0000000000..b3c304724c --- /dev/null +++ b/services/web/app/src/Features/GlobalMetrics/GlobalMetricsManager.js @@ -0,0 +1,38 @@ +const { GlobalMetric } = require('../../models/GlobalMetric') +/** + * A Generic collection used to track metrics shared across the entirety of the application + * examples: + * - a metric to measure how many signups we have for an expensive labs experiment, so we can end stop signups + * - a metric to measure how many users have been added to a test, so we can stop adding more once a cap is reached + * + */ + +async function getMetric(key, defaultValue = 0) { + const metric = await GlobalMetric.findById(key) + if (!metric) { + return defaultValue + } + return metric +} + +async function setMetric(key, value) { + return await GlobalMetric.findOneAndUpdate( + { _id: key }, + { $set: { value } }, + { new: true, upsert: true } + ) +} + +async function incrementMetric(key, value = 1) { + return await GlobalMetric.findOneAndUpdate( + { _id: key }, + { $inc: { value } }, + { new: true, upsert: true, setDefaultsOnInsert: true } + ) +} + +module.exports = { + getMetric, + setMetric, + incrementMetric, +} diff --git a/services/web/app/src/infrastructure/mongodb.js b/services/web/app/src/infrastructure/mongodb.js index ada77c4380..b5997be2db 100644 --- a/services/web/app/src/infrastructure/mongodb.js +++ b/services/web/app/src/infrastructure/mongodb.js @@ -61,6 +61,7 @@ async function setupDb() { db.githubSyncUserCredentials = internalDb.collection( 'githubSyncUserCredentials' ) + db.globalMetrics = internalDb.collection('globalMetrics') db.grouppolicies = internalDb.collection('grouppolicies') db.institutions = internalDb.collection('institutions') db.messages = internalDb.collection('messages') diff --git a/services/web/app/src/models/GlobalMetric.js b/services/web/app/src/models/GlobalMetric.js new file mode 100644 index 0000000000..824c1478a2 --- /dev/null +++ b/services/web/app/src/models/GlobalMetric.js @@ -0,0 +1,19 @@ +const mongoose = require('../infrastructure/Mongoose') +const { Schema } = mongoose + +const GlobalMetricSchema = new Schema( + { + _id: { type: String, required: true }, + value: { + type: Number, + default: 0, + }, + }, + { + collection: 'globalMetrics', + minimize: false, + } +) + +exports.GlobalMetric = mongoose.model('GlobalMetric', GlobalMetricSchema) +exports.GlobalMetricSchema = GlobalMetricSchema