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
.around ⇒ Object
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
|
.callbacks ⇒ Object
9
10
11
|
# File 'lib/query_counter.rb', line 9
def self.callbacks
@@callbacks
end
|
.collect ⇒ Object
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_collector ⇒ Object
17
18
19
|
# File 'lib/query_counter.rb', line 17
def self.current_collector
Thread.current[:query_counter_collector] ||= ::QueryCounter::Collector.new
end
|
.global_collector ⇒ Object
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
|
.reset ⇒ Object
35
36
37
|
# File 'lib/query_counter.rb', line 35
def self.reset
current_collector.reset
end
|
.temporary_collector ⇒ Object
21
22
23
|
# File 'lib/query_counter.rb', line 21
def self.temporary_collector
Thread.current[:temporary_query_counter_collector]
end
|