Module: QueryCounter

Defined in:
lib/query_counter/global.rb,
lib/query_counter.rb,
lib/query_counter/stat.rb,
lib/query_counter/collector.rb,
lib/query_counter/middleware.rb,
lib/query_counter/request_helper.rb

Overview

Purpose is to collect stats for the life time of the process

Defined Under Namespace

Modules: RequestHelper Classes: Collector, Global, Middleware, Stat

Constant Summary collapse

@@callbacks =
{}

Class Method Summary collapse

Class Method Details

.aroundObject



45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/query_counter.rb', line 45

def self.around
  new_collector = ::QueryCounter::Collector.new
  old_collector, Thread.current[:temporary_query_counter_collector] = Thread.current[:temporary_query_counter_collector], new_collector

  yield

  if old_collector
    Thread.current[:temporary_query_counter_collector] = old_collector.add(new_collector)
  else
    Thread.current[:temporary_query_counter_collector] = nil
  end

  new_collector
end

.auto_instrument!(resource, kls, method_name, &block) ⇒ Object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/query_counter.rb', line 75

def self.auto_instrument!(resource, kls, method_name, &block)
  callback_name = "#{resource}.#{method_name}"

  method_name = method_name.to_s
  if method_name =~ /^(.*?)([!\?])$/
    method_name = $1
    punctuation = $2
  else
    punctuation = ''
  end

  callbacks[callback_name] = block if block

  original_method_name_with_alias = "#{method_name}_without_instrumentation#{punctuation}"
  new_method_name = "#{method_name}_with_instrumentation#{punctuation}"
  kls.class_eval <<STR
def #{new_method_name}(*args)
::QueryCounter.callbacks[#{callback_name.inspect}].call(args) if ::QueryCounter.callbacks.has_key?(#{callback_name.inspect})
started_at = Time.now
result = #{original_method_name_with_alias}(*args)
::QueryCounter.record(#{resource.inspect}, (Time.now - started_at) * 1_000.0)
result
end
STR
  kls.send(:alias_method, original_method_name_with_alias, method_name + punctuation)
  kls.send(:alias_method, method_name + punctuation, new_method_name)
end

.auto_subscribe!(resource, event_name, &block) ⇒ Object



68
69
70
71
72
73
# File 'lib/query_counter.rb', line 68

def self.auto_subscribe!(resource, event_name, &block)
  require 'active_support/notifications'
  ActiveSupport::Notifications.subscribe(event_name) do |*args|
    ::QueryCounter.record_event(resource, ActiveSupport::Notifications::Event.new(*args))
  end
end

.callbacksObject



9
10
11
# File 'lib/query_counter.rb', line 9

def self.callbacks
  @@callbacks
end

.collectObject



39
40
41
42
43
# File 'lib/query_counter.rb', line 39

def self.collect
  Thread.current[:starting_gc_count] = GC.count
  Thread.current[:starting_count_objects] = ObjectSpace.count_objects
  reset
end

.count(resource) ⇒ Object



60
61
62
# File 'lib/query_counter.rb', line 60

def self.count(resource)
  current_collector.count(resource)
end

.current_collectorObject



17
18
19
# File 'lib/query_counter.rb', line 17

def self.current_collector
  Thread.current[:query_counter_collector] ||= ::QueryCounter::Collector.new
end

.global_collectorObject



13
14
15
# File 'lib/query_counter.rb', line 13

def self.global_collector
  ::QueryCounter::Global.instance
end

.global_count(resource) ⇒ Object



64
65
66
# File 'lib/query_counter.rb', line 64

def self.global_count(resource)
  current_collector.count(resource)
end

.record(resource, duration, by = 1) ⇒ Object



25
26
27
28
# File 'lib/query_counter.rb', line 25

def self.record(resource, duration, by=1)
  global_collector.record(resource, duration, by)
  current_collector.record(resource, duration, by)
end

.record_event(resource, event) ⇒ Object



30
31
32
33
# File 'lib/query_counter.rb', line 30

def self.record_event(resource, event)
  temporary_collector && temporary_collector.record_event(resource, event)
  record(resource, event.duration)
end

.resetObject



35
36
37
# File 'lib/query_counter.rb', line 35

def self.reset
  current_collector.reset
end

.temporary_collectorObject



21
22
23
# File 'lib/query_counter.rb', line 21

def self.temporary_collector
  Thread.current[:temporary_query_counter_collector]
end