mirror of
https://github.com/yu-i-i/overleaf-cep.git
synced 2026-05-23 17:19:37 +02:00
The v1 history service has its routes set up via swagger-tools, which doesn't write a route property on the request. This prevents us to send request metrics based on the route, but we can still log the request.
54 lines
1.9 KiB
CoffeeScript
54 lines
1.9 KiB
CoffeeScript
os = require("os")
|
|
yn = require("yn")
|
|
|
|
STACKDRIVER_LOGGING = yn(process.env['STACKDRIVER_LOGGING'])
|
|
|
|
module.exports.monitor = (logger) ->
|
|
return (req, res, next) ->
|
|
Metrics = require("./metrics")
|
|
startTime = process.hrtime()
|
|
end = res.end
|
|
res.end = () ->
|
|
end.apply(this, arguments)
|
|
responseTime = process.hrtime(startTime)
|
|
responseTimeMs = Math.round(responseTime[0] * 1000 + responseTime[1] / 1000000)
|
|
requestSize = parseInt(req.headers["content-length"], 10)
|
|
if req.route?.path?
|
|
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})
|
|
remoteIp = req.ip || req.socket?.socket?.remoteAddress || req.socket?.remoteAddress
|
|
reqUrl = req.originalUrl || req.url
|
|
referrer = req.headers['referer'] || req.headers['referrer']
|
|
if STACKDRIVER_LOGGING
|
|
info =
|
|
httpRequest:
|
|
requestMethod: req.method
|
|
requestUrl: reqUrl
|
|
requestSize: requestSize
|
|
status: res.statusCode
|
|
responseSize: res._headers?["content-length"]
|
|
userAgent: req.headers["user-agent"]
|
|
remoteIp: remoteIp
|
|
referer: referrer
|
|
latency:
|
|
seconds: responseTime[0]
|
|
nanos: responseTime[1]
|
|
protocol: req.protocol
|
|
else
|
|
info =
|
|
req:
|
|
url: reqUrl
|
|
method: req.method
|
|
referrer: referrer
|
|
"remote-addr": remoteIp
|
|
"user-agent": req.headers["user-agent"]
|
|
"content-length": req.headers["content-length"]
|
|
res:
|
|
"content-length": res._headers?["content-length"]
|
|
statusCode: res.statusCode
|
|
"response-time": responseTimeMs
|
|
logger.info(info, "%s %s", req.method, reqUrl)
|
|
next()
|