timeAsyncMethod.coffee 1.1 KB

123456789101112131415161718192021222324252627282930313233343536
  1. module.exports = (obj, methodName, prefix, 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 = "#{prefix}.#{methodName}"
  7. obj[methodName] = (originalArgs...) ->
  8. [firstArgs..., callback] = originalArgs
  9. if !callback? || typeof callback != 'function'
  10. if logger?
  11. logger.log "[Metrics] expected wrapped method '#{methodName}' to be invoked with a callback"
  12. return realMethod.apply this, originalArgs
  13. timer = new metrics.Timer(key)
  14. realMethod.call this, firstArgs..., (callbackArgs...) ->
  15. elapsedTime = timer.done()
  16. possibleError = callbackArgs[0]
  17. if possibleError?
  18. metrics.inc "#{key}.failure"
  19. else
  20. metrics.inc "#{key}.success"
  21. if logger?
  22. loggableArgs = {}
  23. try
  24. for arg, idx in firstArgs
  25. if arg.toString().match(/^[0-9a-f]{24}$/)
  26. loggableArgs["#{idx}"] = arg
  27. logger.log {key, args: loggableArgs, elapsedTime}, "[Metrics] timed async method call"
  28. callback.apply this, callbackArgs