Skip to content
This repository was archived by the owner on Dec 5, 2023. It is now read-only.

Commit 4aaf9d1

Browse files
Merge pull request #76 from microservices-demo/prometheus-metrics
Prometheus metrics in the front-end
2 parents ab557ca + 42dc10e commit 4aaf9d1

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

api/metrics/index.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
(function (){
2+
'use strict';
3+
4+
var express = require("express")
5+
, client = require('prom-client')
6+
, app = express()
7+
8+
const metric = {
9+
http: {
10+
requests: {
11+
duration: new client.Summary('request_duration_seconds', 'request duration in seconds', ['method', 'path', 'status']),
12+
}
13+
}
14+
}
15+
16+
function s(start) {
17+
var diff = process.hrtime(start);
18+
return (diff[0] * 1e9 + diff[1]) / 1000000000;
19+
}
20+
21+
function parse(path) {
22+
var clean_path = path;
23+
24+
if (path[path.length - 1] != '/') {
25+
if (!path.includes('.')) {
26+
clean_path = path.substr(0, path.lastIndexOf('/') + 1);
27+
}
28+
};
29+
30+
return clean_path;
31+
}
32+
33+
function observe(method, path, statusCode, start) {
34+
var path = path.toLowerCase();
35+
if (path !== '/metrics' && path !== '/metrics/') {
36+
var duration = s(start);
37+
var method = method.toLowerCase();
38+
var clean_path = parse(path);
39+
metric.http.requests.duration.labels(method, clean_path, statusCode).observe(duration);
40+
}
41+
};
42+
43+
function middleware(request, response, done) {
44+
var start = process.hrtime();
45+
46+
response.on('finish', function() {
47+
observe(request.method, request.path, response.statusCode, start);
48+
});
49+
50+
return done();
51+
};
52+
53+
54+
app.use(middleware);
55+
app.get("/metrics", function(req, res) {
56+
res.header("content-type", "text/plain");
57+
return res.end(client.register.metrics())
58+
});
59+
60+
module.exports = app;
61+
}());

helpers/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* var app = express();
1212
* app.use(helpers.errorHandler);
1313
* */
14+
1415
helpers.errorHandler = function(err, req, res, next) {
1516
var ret = {
1617
message: err.message,

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@
2626
"finalhandler": "^0.4.1",
2727
"request": "^2.72.0",
2828
"serve-static": "^1.10.2",
29-
"epimetheus": "^1.0.46",
30-
"prom-client": "^6.1.0",
29+
"prom-client": "^6.3.0",
3130
"morgan": "^1.7.0",
3231
"connect-redis": "^3.2.0"
3332
},

server.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@ var request = require("request")
66
, async = require("async")
77
, cookieParser = require("cookie-parser")
88
, session = require("express-session")
9-
, epimetheus = require("epimetheus")
109
, config = require("./config")
1110
, helpers = require("./helpers")
1211
, cart = require("./api/cart")
1312
, catalogue = require("./api/catalogue")
1413
, orders = require("./api/orders")
1514
, user = require("./api/user")
15+
, metrics = require("./api/metrics")
1616
, app = express()
1717

18-
epimetheus.instrument(app);
19-
2018
app.use(express.static("public"));
19+
app.use(metrics);
2120
if(process.env.SESSION_REDIS) {
2221
console.log('Using the redis based session manager');
2322
app.use(session(config.session_redis));
@@ -29,7 +28,6 @@ else {
2928

3029
app.use(bodyParser.json());
3130
app.use(cookieParser());
32-
app.use(helpers.errorHandler);
3331
app.use(helpers.sessionMiddleware);
3432
app.use(morgan("dev", {}));
3533

@@ -50,6 +48,8 @@ app.use(catalogue);
5048
app.use(orders);
5149
app.use(user);
5250

51+
app.use(helpers.errorHandler);
52+
5353
var server = app.listen(process.env.PORT || 8079, function () {
5454
var port = server.address().port;
5555
console.log("App now running in %s mode on port %d", app.get("env"), port);

0 commit comments

Comments
 (0)