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