class MethodProfiler

Public Class Methods

clear() click to toggle source
# File lib/prometheus_exporter/instrumentation/method_profiler.rb, line 45
def self.clear
  Thread.current[:_method_profiler] = nil
end
patch(klass, methods, name) click to toggle source
# File lib/prometheus_exporter/instrumentation/method_profiler.rb, line 7
  def self.patch(klass, methods, name)
    patch_source_line = __LINE__ + 3
    patches = methods.map do |method_name|
      <<~RUBY
      unless defined?(#{method_name}__mp_unpatched)
        alias_method :#{method_name}__mp_unpatched, :#{method_name}
        def #{method_name}(*args, &blk)
          unless prof = Thread.current[:_method_profiler]
            return #{method_name}__mp_unpatched(*args, &blk)
          end
          begin
            start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
            #{method_name}__mp_unpatched(*args, &blk)
          ensure
            data = (prof[:#{name}] ||= {duration: 0.0, calls: 0})
            data[:duration] += Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
            data[:calls] += 1
          end
        end
      end
      RUBY
    end.join("\n")

    klass.class_eval patches, __FILE__, patch_source_line
  end
start(transfer = nil) click to toggle source
# File lib/prometheus_exporter/instrumentation/method_profiler.rb, line 39
def self.start(transfer = nil)
  Thread.current[:_method_profiler] = transfer || {
    __start: Process.clock_gettime(Process::CLOCK_MONOTONIC)
  }
end
stop() click to toggle source
# File lib/prometheus_exporter/instrumentation/method_profiler.rb, line 49
def self.stop
  finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  if data = Thread.current[:_method_profiler]
    Thread.current[:_method_profiler] = nil
    start = data.delete(:__start)
    data[:total_duration] = finish - start
  end
  data
end
transfer() click to toggle source
# File lib/prometheus_exporter/instrumentation/method_profiler.rb, line 33
def self.transfer
  result = Thread.current[:_method_profiler]
  Thread.current[:_method_profiler] = nil
  result
end