overleaf/libraries/metrics/timeAsyncMethod.coffee

45 lines
1.4 KiB
CoffeeScript
Raw Normal View History

2017-03-15 11:06:54 -04:00
2017-03-17 07:47:38 -04:00
module.exports = (obj, methodName, prefix, logger) ->
2017-03-15 11:06:54 -04:00
metrics = require('./metrics')
if typeof obj[methodName] != 'function'
2017-03-16 06:02:19 -04:00
throw new Error("[Metrics] expected object property '#{methodName}' to be a function")
2017-03-15 11:06:54 -04:00
2018-11-27 05:46:54 -05:00
key = "#{prefix}.#{methodName}"
2018-11-27 05:46:54 -05:00
realMethod = obj[methodName]
2018-11-27 07:04:50 -05:00
splitPrefix = prefix.split(".")
startPrefix = splitPrefix[0]
if splitPrefix[1]?
modifedMethodName = "#{splitPrefix[1]}_#{methodName}"
else
modifedMethodName = methodName
2017-03-15 11:06:54 -04:00
obj[methodName] = (originalArgs...) ->
[firstArgs..., callback] = originalArgs
2017-03-15 11:06:54 -04:00
if !callback? || typeof callback != 'function'
if logger?
logger.log "[Metrics] expected wrapped method '#{methodName}' to be invoked with a callback"
return realMethod.apply this, originalArgs
2017-03-15 11:06:54 -04:00
2018-11-27 06:33:45 -05:00
timer = new metrics.Timer(startPrefix, null, {method: modifedMethodName})
2017-03-15 11:06:54 -04:00
2017-03-15 12:07:36 -04:00
realMethod.call this, firstArgs..., (callbackArgs...) ->
2017-03-16 11:07:25 -04:00
elapsedTime = timer.done()
possibleError = callbackArgs[0]
if possibleError?
2018-11-27 07:04:50 -05:00
metrics.inc "#{startPrefix}_result", null, {status:"failed", method: modifedMethodName}
else
2018-11-27 07:04:50 -05:00
metrics.inc "#{startPrefix}_result", null, {status:"success", method: modifedMethodName}
2017-03-15 11:06:54 -04:00
if logger?
loggableArgs = {}
try
for arg, idx in firstArgs
if arg.toString().match(/^[0-9a-f]{24}$/)
loggableArgs["#{idx}"] = arg
logger.log {key, args: loggableArgs, elapsedTime}, "[Metrics] timed async method call"
2017-03-15 11:06:54 -04:00
callback.apply this, callbackArgs