overleaf/libraries/metrics/http.js

83 lines
2.5 KiB
JavaScript
Raw Normal View History

2020-09-11 14:18:22 -04:00
const yn = require('yn')
2020-07-17 11:01:58 -04:00
2020-09-11 14:18:22 -04:00
const STACKDRIVER_LOGGING = yn(process.env.STACKDRIVER_LOGGING)
2020-07-17 11:01:58 -04:00
2020-09-11 14:18:22 -04:00
module.exports.monitor = logger =>
function(req, res, next) {
const Metrics = require('./index')
const startTime = process.hrtime()
const { end } = res
2020-07-17 11:01:58 -04:00
res.end = function() {
2020-09-11 14:18:22 -04:00
end.apply(this, arguments)
const responseTime = process.hrtime(startTime)
const responseTimeMs = Math.round(
responseTime[0] * 1000 + responseTime[1] / 1000000
)
const requestSize = parseInt(req.headers['content-length'], 10)
2021-01-08 14:41:50 -05:00
if (req.route && req.route.path != null) {
2020-09-11 14:18:22 -04:00
const routePath = req.route.path
.toString()
.replace(/\//g, '_')
.replace(/:/g, '')
.slice(1)
Metrics.timing('http_request', responseTimeMs, null, {
method: req.method,
status_code: res.statusCode,
path: routePath
})
if (requestSize) {
Metrics.summary('http_request_size_bytes', requestSize, {
method: req.method,
status_code: res.statusCode,
path: routePath
})
2020-07-17 11:01:58 -04:00
}
2020-09-11 14:18:22 -04:00
}
const remoteIp =
req.ip ||
2021-01-08 14:41:50 -05:00
(req.socket && req.socket.socket && req.socket.socket.remoteAddress) ||
(req.socket && req.socket.remoteAddress)
2020-09-11 14:18:22 -04:00
const reqUrl = req.originalUrl || req.url
const referrer = req.headers.referer || req.headers.referrer
2021-01-08 14:41:50 -05:00
let info
2020-09-11 14:18:22 -04:00
if (STACKDRIVER_LOGGING) {
info = {
httpRequest: {
requestMethod: req.method,
requestUrl: reqUrl,
requestSize,
status: res.statusCode,
responseSize: res.getHeader('content-length'),
userAgent: req.headers['user-agent'],
remoteIp,
referer: referrer,
latency: {
seconds: responseTime[0],
nanos: responseTime[1]
},
protocol: req.protocol
}
2020-07-17 11:01:58 -04:00
}
2020-09-11 14:18:22 -04:00
} else {
info = {
req: {
url: reqUrl,
method: req.method,
referrer,
'remote-addr': remoteIp,
'user-agent': req.headers['user-agent'],
'content-length': req.headers['content-length']
},
res: {
'content-length': res.getHeader('content-length'),
statusCode: res.statusCode
},
'response-time': responseTimeMs
}
}
2021-01-08 14:41:50 -05:00
logger.info(info, '%s %s', req.method, reqUrl)
2020-09-11 14:18:22 -04:00
}
2021-01-08 14:41:50 -05:00
next()
2020-09-11 14:18:22 -04:00
}