diff --git a/src/node/handler/PadMessageHandler.ts b/src/node/handler/PadMessageHandler.ts index 115d69a2322..0b411ed670b 100644 --- a/src/node/handler/PadMessageHandler.ts +++ b/src/node/handler/PadMessageHandler.ts @@ -94,14 +94,25 @@ exports.socketio = () => { const sessioninfos:MapArrayType = {}; exports.sessioninfos = sessioninfos; -stats.gauge('totalUsers', () => socketio ? socketio.engine.clientsCount : 0); -stats.gauge('activePads', () => { +function getTotalActiveUsers() { + return socketio ? socketio.engine.clientsCount : 0; +} + +exports.getTotalActiveUsers = getTotalActiveUsers; + +function getActivePadCountFromSessionInfos() { const padIds = new Set(); for (const {padId} of Object.values(sessioninfos)) { if (!padId) continue; padIds.add(padId); } return padIds.size; +} +exports.getActivePadCountFromSessionInfos = getActivePadCountFromSessionInfos; + +stats.gauge('totalUsers', () => getTotalActiveUsers()); +stats.gauge('activePads', () => { + return getActivePadCountFromSessionInfos(); }); /** diff --git a/src/node/prometheus.ts b/src/node/prometheus.ts index 2fad567f4d9..8b0ac759863 100644 --- a/src/node/prometheus.ts +++ b/src/node/prometheus.ts @@ -1,25 +1,38 @@ -import client from 'prom-client' -const db = require('./db/DB').db +import client from 'prom-client'; -const monitor = function () { - const collectDefaultMetrics = client.collectDefaultMetrics; - const Registry = client.Registry; - const register = new Registry(); - collectDefaultMetrics({register}); - const gaugeDB = new client.Gauge({ - name: "ueberdb_stats", - help: "ueberdb stats", - labelNames: ['type'], - }) +const db = require('./db/DB').db; +const PadMessageHandler = require('./handler/PadMessageHandler'); +const register = new client.Registry(); +const gaugeDB = new client.Gauge({ + name: 'ueberdb_stats', + help: 'ueberdb stats', + labelNames: ['type'], +}); +register.registerMetric(gaugeDB); + +const totalUsersGauge = new client.Gauge({ + name: 'etherpad_total_users', + help: 'Total number of users', +}); +register.registerMetric(totalUsersGauge); + +const activePadsGauge = new client.Gauge({ + name: 'etherpad_active_pads', + help: 'Total number of active pads', +}); +register.registerMetric(activePadsGauge); + +client.collectDefaultMetrics({register}); + +const monitor = async function () { for (const [metric, value] of Object.entries(db.metrics)) { if (typeof value !== 'number') continue; gaugeDB.set({type: metric}, value); } - - - register.registerMetric(gaugeDB); - return register + activePadsGauge.set(PadMessageHandler.getActivePadCountFromSessionInfos()); + totalUsersGauge.set(PadMessageHandler.getTotalActiveUsers()); + return register; }; export default monitor;