2017-11-20 21:00:34 +00:00

71 lines
2.0 KiB
JavaScript

var express = require('express'),
bodyParser = require('body-parser'),
methodOverride = require('method-override'),
errorHandler = require('errorhandler'),
morgan = require('morgan'),
prometheus = require('prom-client'),
routes = require('./backend'),
api = require('./backend/api');
var app = module.exports = express();
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.use(morgan('dev'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(methodOverride());
app.use(express.static(__dirname + '/'));
app.use('/build', express.static('public'));
var env = process.env.NODE_ENV;
if ('development' == env) {
app.use(errorHandler({
dumpExceptions: true,
showStack: true
}));
}
if ('production' == app.get('env')) {
app.use(errorHandler());
}
// counter for Prometheus:
const httpRequestDurationMicroseconds = new prometheus.Histogram({
name: 'http_request_duration_ms',
help: 'Duration of HTTP requests in ms',
labelNames: ['method', 'route', 'code'],
buckets: [0.10, 5, 15, 50, 100, 200, 300, 400, 500] // buckets for response time from 0.1ms to 500ms
})
// record timestamp before request handler:
app.use((req, res, next) => {
res.locals.startEpoch = Date.now()
next()
})
app.get('/', routes.index);
app.get('/api/events', api.events);
app.post('/api/events', api.event);
app.delete('/api/events/:eventId', api.event);
app.get('/metrics', (req, res) => {
res.set('Content-Type', prometheus.register.contentType)
res.end(prometheus.register.metrics())
})
// set response duration after handler:
app.use((req, res, next) => {
const responseTimeInMs = Date.now() - res.locals.startEpoch
httpRequestDurationMicroseconds
.labels(req.method, req.path, res.statusCode)
.observe(responseTimeInMs)
next()
})
prometheus.collectDefaultMetrics();
app.listen(8080);
console.log('Magic happens on port 8080...');