Bladeren bron

Merge pull request #16873 from overleaf/dp-mongo-command-monitoring

Use mongo command monitoring to add timing metrics

GitOrigin-RevId: e7e5dd5cca1ba3802c02198ccf81058d4da3f1e7
David 2 jaren geleden
bovenliggende
commit
b59326e96f

+ 30 - 1
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

+ 4 - 1
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 = {

+ 3 - 0
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,
+    },
   },
 }

+ 4 - 1
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 = {

+ 3 - 0
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,
+    },
   },
 }

+ 1 - 1
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 = {

+ 5 - 1
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',

+ 1 - 1
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 = {

+ 3 - 0
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: {

+ 1 - 1
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 = {

+ 3 - 0
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,
+    },
   },
 }

+ 4 - 1
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)

+ 3 - 0
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: {

+ 1 - 0
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 ||