From 3cb0ab2784f6f8c00d01f1af3d160e679c901b0a Mon Sep 17 00:00:00 2001 From: Shane Kilkelly Date: Wed, 15 Mar 2017 15:06:54 +0000 Subject: [PATCH] Add a 'timeAsyncMethod' helper --- libraries/metrics/metrics.coffee | 4 +++- libraries/metrics/timeAsyncMethod.coffee | 30 ++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 libraries/metrics/timeAsyncMethod.coffee diff --git a/libraries/metrics/metrics.coffee b/libraries/metrics/metrics.coffee index 554fa3d51d..0349ca6d11 100644 --- a/libraries/metrics/metrics.coffee +++ b/libraries/metrics/metrics.coffee @@ -10,7 +10,7 @@ destructors = [] require "./uv_threadpool_size" -module.exports = +module.exports = Metrics = initialize: (_name) -> name = _name @@ -48,6 +48,8 @@ module.exports = event_loop: require "./event_loop" memory: require "./memory" + timeAsyncMethod: require('./timeAsyncMethod') + close: () -> for func in destructors func() diff --git a/libraries/metrics/timeAsyncMethod.coffee b/libraries/metrics/timeAsyncMethod.coffee new file mode 100644 index 0000000000..59fb12ea7a --- /dev/null +++ b/libraries/metrics/timeAsyncMethod.coffee @@ -0,0 +1,30 @@ + +module.exports = (obj, methodName, key, logger) -> + metrics = require('./metrics') + + if typeof obj[methodName] != 'function' + throw new Error("[Metrics] expected object property #{methodName} to be a function") + + realMethod = obj[methodName] + key = "methods.#{key}" + + obj[methodName] = (originalArgs...) -> + + [firstArgs..., callback] = originalArgs + if !callback? || typeof callback != 'function' + throw new Error( + "[Metrics] expected wrapped method '#{methodName}' to be invoked with a callback" + ) + + timer = new Metrics.Timer(key) + start = new Date() + + realMethod.call this, firstArgs, (callbackArgs...) -> + timer.done() + elapsedTime = new Date() - start + if logger? + logger.log + key: key + time: elapsedTime + "[Metrics] timed async method call" + callback.apply this, callbackArgs