spee.ch/server/middleware/logMetricsMiddleware.js

58 lines
1.6 KiB
JavaScript
Raw Normal View History

const logger = require('winston');
2018-10-24 10:43:30 +02:00
const db = require('../models');
const httpContext = require('express-http-context');
2018-11-11 01:11:12 +01:00
function logMetricsMiddleware (req, res, next) {
2018-10-24 10:43:30 +02:00
res.on('finish', () => {
const userAgent = req.get('user-agent');
const routePath = httpContext.get('routePath');
let referrer = req.get('referrer');
2018-11-11 01:11:12 +01:00
if (referrer && referrer.length > 255) {
try {
// Attempt to "safely" clamp long URLs
referrer = /(.*?)#.*/.exec(referrer)[1];
2018-11-11 01:11:12 +01:00
} catch (e) {
// Cheap forced string conversion & clamp
2018-11-11 01:32:43 +01:00
referrer = String(referrer);
referrer = referrer.substr(0, 255);
}
2018-11-11 01:11:12 +01:00
if (referrer.length > 255) {
logger.warn('Request refferer exceeds 255 characters:', referrer);
referrer = referrer.substring(0, 255);
}
}
2018-10-24 10:43:30 +02:00
db.Metrics.create({
2018-11-11 01:11:12 +01:00
time : Date.now(),
2018-11-11 01:32:43 +01:00
isInternal: /node-fetch/.test(userAgent),
2018-11-11 01:11:12 +01:00
isChannel : res.isChannel,
claimId : res.claimId,
routePath : httpContext.get('routePath'),
params : JSON.stringify(req.params),
ip : req.headers['x-forwarded-for'] || req.connection.remoteAddress,
request : req.url,
routeData : JSON.stringify(httpContext.get('routeData')),
referrer,
2018-10-24 10:43:30 +02:00
userAgent,
});
});
next();
}
2018-11-11 01:11:12 +01:00
function setRouteDataInContextMiddleware (routePath, routeData) {
2018-10-24 10:43:30 +02:00
return function (req, res, next) {
httpContext.set('routePath', routePath);
httpContext.set('routeData', routeData);
next();
};
}
module.exports = {
logMetricsMiddleware,
setRouteDataInContextMiddleware,
};