Merge pull request #11680 from overleaf/em-mongo-pool-monitoring

Mongo connection pool monitoring

GitOrigin-RevId: 050e50e7e67061ccbf39a710ca4532eafd423365
This commit is contained in:
Eric Mc Sween
2023-02-09 14:34:35 +00:00
committed by Copybot
parent 5683cebf71
commit 74eeec2ba3
11 changed files with 167 additions and 34 deletions
+1 -33
View File
@@ -1,9 +1,6 @@
const Metrics = require('@overleaf/metrics')
const { ObjectId } = require('mongodb')
const OError = require('@overleaf/o-error')
const {
addOptionalCleanupHandlerAfterDrainingConnections,
} = require('./GracefulShutdown')
const { getNativeDb } = require('./Mongoose')
if (
@@ -26,7 +23,7 @@ async function waitForDb() {
const db = {}
async function setupDb() {
const internalDb = await getNativeDb()
collectStatsForDb(internalDb, 'shared')
Metrics.mongodb.monitor(internalDb)
db.contacts = internalDb.collection('contacts')
db.deletedFiles = internalDb.collection('deletedFiles')
@@ -110,34 +107,6 @@ async function getCollectionInternal(name) {
return internalDb.collection(name)
}
function collectStatsForDb(internalDb, label) {
const collectOnce = () => {
for (const [name, server] of internalDb.s.topology.s.servers.entries()) {
const { availableConnectionCount, waitQueueSize } = server.s.pool
const { maxPoolSize } = server.s.pool.options
const opts = { status: `${label}:${name}` }
Metrics.gauge('mongo_connection_pool_max', maxPoolSize, 1, opts)
Metrics.gauge(
'mongo_connection_pool_available',
availableConnectionCount,
1,
opts
)
Metrics.gauge('mongo_connection_pool_waiting', waitQueueSize, 1, opts)
}
}
collectOnce() // init metrics
const intervalHandle = setInterval(collectOnce, 60_000)
addOptionalCleanupHandlerAfterDrainingConnections(
`collect mongo connection pool metrics (${label})`,
() => {
clearInterval(intervalHandle)
// collect one more time.
collectOnce()
}
)
}
module.exports = {
db,
ObjectId,
@@ -145,5 +114,4 @@ module.exports = {
getCollectionInternal,
dropTestDatabase,
waitForDb,
collectStatsForDb,
}