From 5c70cc021fb1b372e7a54b222e0524e3c6626e02 Mon Sep 17 00:00:00 2001 From: David Mehren Date: Sun, 18 Apr 2021 13:20:43 +0200 Subject: Add custom prometheus metrics This reuses the `realtime.getStatus` method to get the state of the application state on every prometheus scrape cycle. Signed-off-by: David Mehren --- app.js | 2 ++ lib/prometheus.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 lib/prometheus.js diff --git a/app.js b/app.js index 28b675db..31d671f9 100644 --- a/app.js +++ b/app.js @@ -26,6 +26,7 @@ const logger = require('./lib/logger') const errors = require('./lib/errors') const models = require('./lib/models') const csp = require('./lib/csp') +const metrics = require('./lib/prometheus') // server setup const app = express() @@ -66,6 +67,7 @@ app.use(morgan('combined', { // Register prometheus metrics endpoint app.use(apiMetrics()) +metrics.setupCustomPrometheusMetrics() // socket io const io = require('socket.io')(server, { cookie: false }) diff --git a/lib/prometheus.js b/lib/prometheus.js new file mode 100644 index 00000000..1ffb9ad7 --- /dev/null +++ b/lib/prometheus.js @@ -0,0 +1,49 @@ +const promClient = require('prom-client') +const realtime = require('./realtime') + +exports.setupCustomPrometheusMetrics = function () { + const onlineNotes = new promClient.Gauge({ + name: 'hedgedoc_online_notes', + help: 'Notes currently being edited' + }) + const onlineSessions = new promClient.Gauge({ + name: 'hedgedoc_online_sessions', + help: 'Sessions currently editing notes', + labelNames: ['type'] + }) + const onlineUsers = new promClient.Gauge({ + name: 'hedgedoc_online_users', + help: 'Distinct users currently editing notes', + labelNames: ['type'] + }) + const notesCount = new promClient.Gauge({ + name: 'hedgedoc_notes', + help: 'Notes in the instance' + }) + const registeredUsers = new promClient.Gauge({ + name: 'hedgedoc_registered_users', + help: 'Users that registered in the instance' + }) + const isConnectionBusy = new promClient.Gauge({ + name: 'hedgedoc_connection_busy', + help: 'Indicates that realtime currently connecting' + }) + const connectionSocketQueueLength = new promClient.Gauge({ + name: 'hedgedoc_connection_socket_queue_length', + help: 'Length of connection socket queue', + // The last gauge provides the collect callback for all metrics + collect () { + realtime.getStatus(function (data) { + onlineNotes.set(data.onlineNotes) + onlineSessions.set({ type: 'all' }, data.onlineUsers) + onlineSessions.set({ type: 'signed-in' }, data.onlineRegisteredUsers) + onlineUsers.set({ type: 'all' }, data.distinctOnlineUsers) + onlineUsers.set({ type: 'signed-in' }, data.distinctOnlineRegisteredUsers) + notesCount.set(data.notesCount) + registeredUsers.set(data.registeredUsers) + isConnectionBusy.set(data.isConnectionBusy ? 1 : 0) + connectionSocketQueueLength.set(data.connectionSocketQueueLength) + }) + } + }) +} -- cgit v1.2.3