http.js 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const Metrics = require('./index')
  2. module.exports.monitor = logger =>
  3. function(req, res, next) {
  4. const startTime = Date.now()
  5. const { end } = res
  6. res.end = function(...args) {
  7. end.apply(this, args)
  8. const responseTimeMs = Date.now() - startTime
  9. const requestSize = parseInt(req.headers['content-length'], 10)
  10. const routePath = getRoutePath(req)
  11. const reqUrl = req.originalUrl || req.url
  12. if (routePath != null) {
  13. Metrics.timing('http_request', responseTimeMs, null, {
  14. method: req.method,
  15. status_code: res.statusCode,
  16. path: routePath
  17. })
  18. if (requestSize) {
  19. Metrics.summary('http_request_size_bytes', requestSize, {
  20. method: req.method,
  21. status_code: res.statusCode,
  22. path: routePath
  23. })
  24. }
  25. }
  26. logger.info({ req, res, responseTimeMs }, '%s %s', req.method, reqUrl)
  27. }
  28. next()
  29. }
  30. function getRoutePath(req) {
  31. if (req.route && req.route.path != null) {
  32. return req.route.path
  33. .toString()
  34. .replace(/\//g, '_')
  35. .replace(/:/g, '')
  36. .slice(1)
  37. }
  38. if (req.swagger && req.swagger.apiPath != null) {
  39. return req.swagger.apiPath
  40. }
  41. return null
  42. }