timeAsyncMethod.coffee 1.6 KB

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