timeAsyncMethod.coffee 1.4 KB

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