From 06f67b4c019fa9d0e9a800796fce85198be924f0 Mon Sep 17 00:00:00 2001 From: Phillip Date: Sun, 19 Oct 2025 17:27:21 +0200 Subject: [PATCH] fix prometheus metric and add total users and active pad count (#7179) * fix prometheus metric registration * add totalUsers and activePads metric to prometheus --- src/node/handler/PadMessageHandler.ts | 15 +++++++-- src/node/prometheus.ts | 45 +++++++++++++++++---------- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/src/node/handler/PadMessageHandler.ts b/src/node/handler/PadMessageHandler.ts index 115d69a23..0b411ed67 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 2fad567f4..8b0ac7598 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;