summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Mehren2021-04-18 13:20:43 +0200
committerDavid Mehren2021-04-25 20:06:56 +0200
commit5c70cc021fb1b372e7a54b222e0524e3c6626e02 (patch)
tree9ac9b478294cc873be5f7c1df003e5bca7290e15
parent8914df60a93c93f48fc7306b5b4edf347474894a (diff)
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 <git@herrmehren.de>
-rw-r--r--app.js2
-rw-r--r--lib/prometheus.js49
2 files changed, 51 insertions, 0 deletions
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)
+ })
+ }
+ })
+}