http.coffee 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. os = require("os")
  2. yn = require("yn")
  3. STACKDRIVER_LOGGING = yn(process.env['STACKDRIVER_LOGGING'])
  4. module.exports.monitor = (logger) ->
  5. return (req, res, next) ->
  6. Metrics = require("./metrics")
  7. startTime = process.hrtime()
  8. end = res.end
  9. res.end = () ->
  10. end.apply(this, arguments)
  11. responseTime = process.hrtime(startTime)
  12. responseTimeMs = Math.round(responseTime[0] * 1000 + responseTime[1] / 1000000)
  13. requestSize = parseInt(req.headers["content-length"], 10)
  14. if req.route?.path?
  15. routePath = req.route.path.toString().replace(/\//g, '_').replace(/\:/g, '').slice(1)
  16. Metrics.timing("http_request", responseTimeMs, null, {method:req.method, status_code: res.statusCode, path:routePath})
  17. if requestSize
  18. Metrics.summary("http_request_size_bytes", requestSize, {method:req.method, status_code: res.statusCode, path:routePath})
  19. remoteIp = req.ip || req.socket?.socket?.remoteAddress || req.socket?.remoteAddress
  20. reqUrl = req.originalUrl || req.url
  21. referrer = req.headers['referer'] || req.headers['referrer']
  22. if STACKDRIVER_LOGGING
  23. info =
  24. httpRequest:
  25. requestMethod: req.method
  26. requestUrl: reqUrl
  27. requestSize: requestSize
  28. status: res.statusCode
  29. responseSize: res._headers?["content-length"]
  30. userAgent: req.headers["user-agent"]
  31. remoteIp: remoteIp
  32. referer: referrer
  33. latency:
  34. seconds: responseTime[0]
  35. nanos: responseTime[1]
  36. protocol: req.protocol
  37. else
  38. info =
  39. req:
  40. url: reqUrl
  41. method: req.method
  42. referrer: referrer
  43. "remote-addr": remoteIp
  44. "user-agent": req.headers["user-agent"]
  45. "content-length": req.headers["content-length"]
  46. res:
  47. "content-length": res._headers?["content-length"]
  48. statusCode: res.statusCode
  49. "response-time": responseTimeMs
  50. logger.info(info, "%s %s", req.method, reqUrl)
  51. next()