overleaf/libraries/metrics/mongodb.js

55 lines
1.6 KiB
JavaScript
Raw Normal View History

const { Gauge } = require('prom-client')
function monitor(mongoClient) {
const labelNames = ['mongo_server']
const poolSize = new Gauge({
name: 'mongo_connection_pool_size',
help: 'number of connections in the connection pool',
labelNames,
// Use this one metric's collect() to set all metrics' values.
collect,
})
const availableConnections = new Gauge({
name: 'mongo_connection_pool_available',
help: 'number of connections that are not busy',
labelNames,
})
const waitQueueSize = new Gauge({
name: 'mongo_connection_pool_waiting',
help: 'number of operations waiting for an available connection',
labelNames,
})
const maxPoolSize = new Gauge({
name: 'mongo_connection_pool_max',
help: 'max size for the connection pool',
labelNames,
})
function collect() {
// Reset all gauges in case they contain values for servers that
// disappeared
poolSize.reset()
availableConnections.reset()
waitQueueSize.reset()
maxPoolSize.reset()
const servers = mongoClient.topology?.s?.servers
if (servers != null) {
for (const [address, server] of servers) {
const pool = server.s?.pool
if (pool == null) {
continue
}
const labels = { mongo_server: address }
poolSize.set(labels, pool.totalConnectionCount)
availableConnections.set(labels, pool.availableConnectionCount)
waitQueueSize.set(labels, pool.waitQueueSize)
maxPoolSize.set(labels, pool.options.maxPoolSize)
}
}
}
}
module.exports = { monitor }