Просмотр исходного кода

Add a 'timeAsyncMethod' helper

Shane Kilkelly 9 лет назад
Родитель
Сommit
3cb0ab2784
2 измененных файлов с 33 добавлено и 1 удалено
  1. 3 1
      libraries/metrics/metrics.coffee
  2. 30 0
      libraries/metrics/timeAsyncMethod.coffee

+ 3 - 1
libraries/metrics/metrics.coffee

@@ -10,7 +10,7 @@ destructors = []
 
 
 require "./uv_threadpool_size"
 require "./uv_threadpool_size"
 
 
-module.exports =
+module.exports = Metrics =
 	initialize: (_name) ->
 	initialize: (_name) ->
 		name = _name
 		name = _name
 
 
@@ -48,6 +48,8 @@ module.exports =
 	event_loop: require "./event_loop"
 	event_loop: require "./event_loop"
 	memory: require "./memory"
 	memory: require "./memory"
 
 
+	timeAsyncMethod: require('./timeAsyncMethod')
+
 	close: () ->
 	close: () ->
 		for func in destructors
 		for func in destructors
 			func()
 			func()

+ 30 - 0
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