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>
This commit is contained in:
David Mehren 2021-04-18 13:20:43 +02:00
parent 8914df60a9
commit 5c70cc021f
No known key found for this signature in database
GPG key ID: 185982BA4C42B7C3
2 changed files with 51 additions and 0 deletions

2
app.js
View file

@ -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 })

49
lib/prometheus.js Normal file
View file

@ -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)
})
}
})
}