http.coffee 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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] / 1000)
  13. if req.route?.path?
  14. routePath = req.route.path.toString().replace(/\//g, '_').replace(/\:/g, '').slice(1)
  15. key = "http-requests.#{routePath}.#{req.method}.#{res.statusCode}"
  16. Metrics.timing(key, responseTimeMs)
  17. remoteIp = req.ip || req.socket?.socket?.remoteAddress || req.socket?.remoteAddress
  18. reqUrl = req.originalUrl || req.url
  19. referrer = req.headers['referer'] || req.headers['referrer']
  20. if STACKDRIVER_LOGGING
  21. info =
  22. httpRequest:
  23. requestMethod: req.method
  24. requestUrl: reqUrl
  25. requestSize: req.headers["content-length"]
  26. status: res.statusCode
  27. responseSize: res._headers?["content-length"]
  28. userAgent: req.headers["user-agent"]
  29. remoteIp: remoteIp
  30. referer: referrer
  31. latency:
  32. seconds: responseTime[0]
  33. nanos: responseTime[1]
  34. protocol: req.protocol
  35. else
  36. info =
  37. req:
  38. url: reqUrl
  39. method: req.method
  40. referrer: referrer
  41. "remote-addr": remoteIp
  42. "user-agent": req.headers["user-agent"]
  43. "content-length": req.headers["content-length"]
  44. res:
  45. "content-length": res._headers?["content-length"]
  46. statusCode: res.statusCode
  47. "response-time": responseTimeMs
  48. if res.statusCode >= 500
  49. logger.error(info, "%s %s", req.method, reqUrl)
  50. else if res.statusCode >= 400 and res.statusCode < 500
  51. logger.warn(info, "%s %s", req.method, reqUrl)
  52. else
  53. logger.info(info, "%s %s", req.method, reqUrl)
  54. next()