From b59326e96f648169793ae4b75f6c89ba7c8b3637 Mon Sep 17 00:00:00 2001 From: David <33458145+davidmcpowell@users.noreply.github.com> Date: Thu, 22 Feb 2024 11:03:27 +0000 Subject: [PATCH] Merge pull request #16873 from overleaf/dp-mongo-command-monitoring Use mongo command monitoring to add timing metrics GitOrigin-RevId: e7e5dd5cca1ba3802c02198ccf81058d4da3f1e7 --- libraries/metrics/mongodb.js | 31 ++++++++++++++++++- services/chat/app/js/mongodb.js | 5 ++- services/chat/config/settings.defaults.cjs | 3 ++ services/contacts/app/js/mongodb.js | 5 ++- .../contacts/config/settings.defaults.cjs | 3 ++ services/docstore/app/js/mongodb.js | 2 +- services/docstore/config/settings.defaults.js | 6 +++- services/document-updater/app/js/mongodb.js | 2 +- .../config/settings.defaults.js | 3 ++ services/notifications/app/js/mongodb.js | 2 +- .../notifications/config/settings.defaults.js | 3 ++ services/project-history/app/js/mongodb.js | 5 ++- .../config/settings.defaults.cjs | 3 ++ services/web/config/settings.defaults.js | 1 + 14 files changed, 66 insertions(+), 8 deletions(-) diff --git a/libraries/metrics/mongodb.js b/libraries/metrics/mongodb.js index 0894ddf785..055675437a 100644 --- a/libraries/metrics/mongodb.js +++ b/libraries/metrics/mongodb.js @@ -1,4 +1,4 @@ -const { Gauge } = require('prom-client') +const { Gauge, Summary } = require('prom-client') function monitor(mongoClient) { const labelNames = ['mongo_server'] @@ -25,6 +25,35 @@ function monitor(mongoClient) { labelNames, }) + const mongoCommandTimer = new Summary({ + name: 'mongo_command_time', + help: 'time taken to complete a mongo command', + percentiles: [], + labelNames: ['status', 'method'], + }) + + if (mongoClient.on) { + mongoClient.on('commandSucceeded', event => { + mongoCommandTimer.observe( + { + status: 'success', + method: event.commandName === 'find' ? 'read' : 'write', + }, + event.duration + ) + }) + + mongoClient.on('commandFailed', event => { + mongoCommandTimer.observe( + { + status: 'failed', + method: event.commandName === 'find' ? 'read' : 'write', + }, + event.duration + ) + }) + } + function collect() { // Reset all gauges in case they contain values for servers that // disappeared diff --git a/services/chat/app/js/mongodb.js b/services/chat/app/js/mongodb.js index 2472fa3cf4..2ed6e01b37 100644 --- a/services/chat/app/js/mongodb.js +++ b/services/chat/app/js/mongodb.js @@ -4,7 +4,10 @@ import { MongoClient } from 'mongodb' export { ObjectId } from 'mongodb' -export const mongoClient = new MongoClient(Settings.mongo.url) +export const mongoClient = new MongoClient( + Settings.mongo.url, + Settings.mongo.options +) const mongoDb = mongoClient.db() export const db = { diff --git a/services/chat/config/settings.defaults.cjs b/services/chat/config/settings.defaults.cjs index 0d43e551ba..ec688fc128 100644 --- a/services/chat/config/settings.defaults.cjs +++ b/services/chat/config/settings.defaults.cjs @@ -20,5 +20,8 @@ module.exports = { url: process.env.MONGO_CONNECTION_STRING || `mongodb://${process.env.MONGO_HOST || 'localhost'}/sharelatex`, + options: { + monitorCommands: true, + }, }, } diff --git a/services/contacts/app/js/mongodb.js b/services/contacts/app/js/mongodb.js index eade7160c9..d3d161a12f 100644 --- a/services/contacts/app/js/mongodb.js +++ b/services/contacts/app/js/mongodb.js @@ -4,7 +4,10 @@ import { MongoClient } from 'mongodb' export { ObjectId } from 'mongodb' -export const mongoClient = new MongoClient(Settings.mongo.url) +export const mongoClient = new MongoClient( + Settings.mongo.url, + Settings.mongo.options +) const mongoDb = mongoClient.db() export const db = { diff --git a/services/contacts/config/settings.defaults.cjs b/services/contacts/config/settings.defaults.cjs index 81833d4f84..df120388b1 100644 --- a/services/contacts/config/settings.defaults.cjs +++ b/services/contacts/config/settings.defaults.cjs @@ -13,5 +13,8 @@ module.exports = { url: process.env.MONGO_CONNECTION_STRING || `mongodb://${process.env.MONGO_HOST || 'localhost'}/sharelatex`, + options: { + monitorCommands: true, + }, }, } diff --git a/services/docstore/app/js/mongodb.js b/services/docstore/app/js/mongodb.js index feea369d2e..796cd6c78a 100644 --- a/services/docstore/app/js/mongodb.js +++ b/services/docstore/app/js/mongodb.js @@ -2,7 +2,7 @@ const Metrics = require('@overleaf/metrics') const Settings = require('@overleaf/settings') const { MongoClient, ObjectId } = require('mongodb-legacy') -const mongoClient = new MongoClient(Settings.mongo.url) +const mongoClient = new MongoClient(Settings.mongo.url, Settings.mongo.options) const mongoDb = mongoClient.db() const db = { diff --git a/services/docstore/config/settings.defaults.js b/services/docstore/config/settings.defaults.js index 3d1b0c150f..4f65240a19 100644 --- a/services/docstore/config/settings.defaults.js +++ b/services/docstore/config/settings.defaults.js @@ -9,7 +9,11 @@ const Settings = { }, }, - mongo: {}, + mongo: { + options: { + monitorCommands: true, + }, + }, docstore: { archiveOnSoftDelete: process.env.ARCHIVE_ON_SOFT_DELETE === 'true', diff --git a/services/document-updater/app/js/mongodb.js b/services/document-updater/app/js/mongodb.js index 8d5258e1d9..6c4415adcc 100644 --- a/services/document-updater/app/js/mongodb.js +++ b/services/document-updater/app/js/mongodb.js @@ -2,7 +2,7 @@ const Metrics = require('@overleaf/metrics') const Settings = require('@overleaf/settings') const { MongoClient, ObjectId } = require('mongodb-legacy') -const mongoClient = new MongoClient(Settings.mongo.url) +const mongoClient = new MongoClient(Settings.mongo.url, Settings.mongo.options) const mongoDb = mongoClient.db() const db = { diff --git a/services/document-updater/config/settings.defaults.js b/services/document-updater/config/settings.defaults.js index 3d6282eb34..ca74768580 100755 --- a/services/document-updater/config/settings.defaults.js +++ b/services/document-updater/config/settings.defaults.js @@ -159,6 +159,9 @@ module.exports = { url: process.env.MONGO_CONNECTION_STRING || `mongodb://${process.env.MONGO_HOST || '127.0.0.1'}/sharelatex`, + options: { + monitorCommands: true, + }, }, sentry: { diff --git a/services/notifications/app/js/mongodb.js b/services/notifications/app/js/mongodb.js index 22c6a5a58b..764998fb74 100644 --- a/services/notifications/app/js/mongodb.js +++ b/services/notifications/app/js/mongodb.js @@ -2,7 +2,7 @@ const Metrics = require('@overleaf/metrics') const Settings = require('@overleaf/settings') const { MongoClient, ObjectId } = require('mongodb-legacy') -const mongoClient = new MongoClient(Settings.mongo.url) +const mongoClient = new MongoClient(Settings.mongo.url, Settings.mongo.options) const mongoDb = mongoClient.db() const db = { diff --git a/services/notifications/config/settings.defaults.js b/services/notifications/config/settings.defaults.js index d0123128f0..d70ad6ac64 100644 --- a/services/notifications/config/settings.defaults.js +++ b/services/notifications/config/settings.defaults.js @@ -10,5 +10,8 @@ module.exports = { url: process.env.MONGO_CONNECTION_STRING || `mongodb://${process.env.MONGO_HOST || 'localhost'}/sharelatex`, + options: { + monitorCommands: true, + }, }, } diff --git a/services/project-history/app/js/mongodb.js b/services/project-history/app/js/mongodb.js index 73dfada3a3..98fe2a8ffe 100644 --- a/services/project-history/app/js/mongodb.js +++ b/services/project-history/app/js/mongodb.js @@ -5,7 +5,10 @@ const { MongoClient, ObjectId } = mongodb export { ObjectId } -export const mongoClient = new MongoClient(Settings.mongo.url) +export const mongoClient = new MongoClient( + Settings.mongo.url, + Settings.mongo.options +) const mongoDb = mongoClient.db() Metrics.mongodb.monitor(mongoClient) diff --git a/services/project-history/config/settings.defaults.cjs b/services/project-history/config/settings.defaults.cjs index 559fdf93e0..4aafd85a5c 100644 --- a/services/project-history/config/settings.defaults.cjs +++ b/services/project-history/config/settings.defaults.cjs @@ -3,6 +3,9 @@ module.exports = { url: process.env.MONGO_CONNECTION_STRING || `mongodb://${process.env.MONGO_HOST || 'localhost'}/sharelatex`, + options: { + monitorCommands: true, + }, }, internal: { history: { diff --git a/services/web/config/settings.defaults.js b/services/web/config/settings.defaults.js index 71cd663126..a2cf412461 100644 --- a/services/web/config/settings.defaults.js +++ b/services/web/config/settings.defaults.js @@ -129,6 +129,7 @@ module.exports = { process.env.MONGO_SOCKET_TIMEOUT ?? '60000', 10 ), + monitorCommands: true, }, url: process.env.MONGO_CONNECTION_STRING ||