53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| module Gitlab
 | |
|   module Metrics
 | |
|     # Class for tracking timing information about method calls
 | |
|     class MethodCall
 | |
|       attr_reader :real_time, :cpu_time, :call_count
 | |
| 
 | |
|       # name - The full name of the method (including namespace) such as
 | |
|       #        `User#sign_in`.
 | |
|       #
 | |
|       # series - The series to use for storing the data.
 | |
|       def initialize(name, series)
 | |
|         @name = name
 | |
|         @series = series
 | |
|         @real_time = 0.0
 | |
|         @cpu_time = 0.0
 | |
|         @call_count = 0
 | |
|       end
 | |
| 
 | |
|       # Measures the real and CPU execution time of the supplied block.
 | |
|       def measure
 | |
|         start_real = Time.now
 | |
|         start_cpu = System.cpu_time
 | |
|         retval = yield
 | |
| 
 | |
|         @real_time += (Time.now - start_real) * 1000.0
 | |
|         @cpu_time += System.cpu_time.to_f - start_cpu
 | |
|         @call_count += 1
 | |
| 
 | |
|         retval
 | |
|       end
 | |
| 
 | |
|       # Returns a Metric instance of the current method call.
 | |
|       def to_metric
 | |
|         Metric.new(
 | |
|           @series,
 | |
|           {
 | |
|             duration:     real_time,
 | |
|             cpu_duration: cpu_time,
 | |
|             call_count:   call_count
 | |
|           },
 | |
|           method: @name
 | |
|         )
 | |
|       end
 | |
| 
 | |
|       # Returns true if the total runtime of this method exceeds the method call
 | |
|       # threshold.
 | |
|       def above_threshold?
 | |
|         real_time >= Metrics.method_call_threshold
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| end
 |