Skip to content

Commit 09eb855

Browse files
committed
Exporting metrics for node.js, express, router, and codimd realtime status.
1. **/metrics/router** : exporting node.js/express Prometheus metrics by [prometheus-api-metrics](https://www.npmjs.com/package/prometheus-api-metrics) 2. **/metrics/codimd** : exporting codimd realtime status (/status) as Prometheus metrics Signed-off-by: tarlety <[email protected]>
1 parent 4fd6293 commit 09eb855

File tree

6 files changed

+161
-0
lines changed

6 files changed

+161
-0
lines changed

app.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var passportSocketIo = require('passport.socketio')
1717
var helmet = require('helmet')
1818
var i18n = require('i18n')
1919
var flash = require('connect-flash')
20+
var apiMetrics = require('prometheus-api-metrics')
2021

2122
// core
2223
var config = require('./lib/config')
@@ -56,6 +57,12 @@ function createHttpServer () {
5657
var app = express()
5758
var server = createHttpServer()
5859

60+
// API and process monitoring with Prometheus for Node.js micro-service
61+
app.use(apiMetrics({
62+
metricsPath: "/metrics/router",
63+
excludeRoutes: ["/metrics/codimd"]
64+
}))
65+
5966
// logger
6067
app.use(morgan('combined', {
6168
stream: logger.stream

lib/routes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ appRouter.get('/404', errorPageController.errorNotFound)
2828
appRouter.get('/500', errorPageController.errorInternalError)
2929

3030
appRouter.get('/status', wrap(statusController.getStatus))
31+
appRouter.get('/metrics/codimd', wrap(statusController.getMetrics))
3132
appRouter.get('/config', statusController.getConfig)
3233

3334
// register auth module

lib/status/index.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@ exports.getStatus = async (req, res) => {
1414
res.send(data)
1515
}
1616

17+
exports.getMetrics = async (req, res) => {
18+
const data = await realtime.getStatus()
19+
20+
res.set({
21+
'Cache-Control': 'private', // only cache by client
22+
'X-Robots-Tag': 'noindex, nofollow', // prevent crawling
23+
'Content-Type': 'text/plain; charset=utf-8'
24+
})
25+
res.render('../js/lib/common/metrics.ejs', data)
26+
}
27+
1728
exports.getConfig = (req, res) => {
1829
const data = {
1930
domain: config.domain,

package-lock.json

Lines changed: 129 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@
8686
"passport.socketio": "~3.7.0",
8787
"pg": "~6.1.2",
8888
"pg-hstore": "~2.3.2",
89+
"prom-client": "^12.0.0",
90+
"prometheus-api-metrics": "^2.2.5",
8991
"randomcolor": "~0.5.4",
9092
"readline-sync": "~1.4.7",
9193
"request": "~2.88.0",

public/js/lib/common/metrics.ejs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
online_notes <%- onlineNotes %>
2+
online_users <%- onlineUsers %>
3+
distinct_online_users <%- distinctOnlineUsers %>
4+
notes_count <%- notesCount %>
5+
registered_users <%- registeredUsers %>
6+
online_registered_users <%- onlineRegisteredUsers %>
7+
distinct_online_registered_users <%- distinctOnlineRegisteredUsers %>
8+
is_connection_busy <%- isConnectionBusy ? 1 : 0 %>
9+
connection_socket_queue_length <%- connectionSocketQueueLength %>
10+
is_disconnect_busy <%- isDisconnectBusy ? 1: 0 %>
11+
disconnect_socket_queue_length <%- disconnectSocketQueueLength %>

0 commit comments

Comments
 (0)