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

Class Method Summary collapse

Class Method Details

.aroundObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/query_counter.rb', line 34

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) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/query_counter.rb', line 64

def self.auto_instrument!(resource, kls, method_name)
  method_name = method_name.to_s
  if method_name =~ /^(.*?)([!\?])$/
    method_name = $1
    punctuation = $2
  else
    punctuation = ''
  end

  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)
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) ⇒ Object



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

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

.count(resource) ⇒ Object



49
50
51
# File 'lib/query_counter.rb', line 49

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

.current_collectorObject



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

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

.global_collectorObject



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

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

.global_count(resource) ⇒ Object



53
54
55
# File 'lib/query_counter.rb', line 53

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

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



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

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



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

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

.resetObject



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

def self.reset
  current_collector.reset
end

.temporary_collectorObject



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

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