timeAsyncMethod.coffee 803 B

123456789101112131415161718192021222324252627
  1. module.exports = (obj, methodName, key, logger) ->
  2. metrics = require('./metrics')
  3. if typeof obj[methodName] != 'function'
  4. throw new Error("[Metrics] expected object property '#{methodName}' to be a function")
  5. realMethod = obj[methodName]
  6. key = "methods.#{key}"
  7. obj[methodName] = (originalArgs...) ->
  8. [firstArgs..., callback] = originalArgs
  9. if !callback? || typeof callback != 'function'
  10. throw new Error(
  11. "[Metrics] expected wrapped method '#{methodName}' to be invoked with a callback"
  12. )
  13. timer = new metrics.Timer(key)
  14. start = new Date()
  15. realMethod.call this, firstArgs..., (callbackArgs...) ->
  16. timer.done()
  17. elapsedTime = new Date() - start
  18. if logger?
  19. logger.log {key, elapsedTime}, "[Metrics] timed async method call"
  20. callback.apply this, callbackArgs