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 --- lib/prometheus.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 lib/prometheus.js (limited to 'lib') 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