Class: Card::Log::Performance
Defined Under Namespace
Modules: BigBrother Classes: Entry
Constant Summary collapse
- DEFAULT_CLASS =
To enable logging add a performance_logger hash to your configuration and change the log_level to :wagn config options
Example: config.performance_logger =
:min_time => 100, # show only method calls that are slower than 100ms :max_depth => 3, # show nested method calls only up to depth 3 :details=> true, # show method arguments and sql :methods => [:event, :search, :fetch, :view], # choose methods to logIf you give :methods a hash you can log arbitrary methods. The syntax is as follows:
class => method type => method name => log optionsExample:
Card => { :instance => [ :fetch, :search ], :singleton => { :fetch => { :title => 'Card.fetch' } }, :all => { :fetch => { :message => 2 # use second argument passed to fetch :details => :to_s # use return value of to_s in method context :title => proc { |method_context| method_context.name } }, }, },class, method type and log options are optional. Default values are ‘Card’, ‘:all’ and { :title => method name, :message => first argument, :details=> remaining arguments }. For example [:fetch] is equivalent to Card => { :all => { :fetch => { :message=>1, :details=>1..-1 } }
Card- DEFAULT_METHOD_TYPE =
:all- DEFAULT_METHOD_OPTIONS =
{ :title => :method_name, :message => 1, :details => 1..-1, :context => nil }
- SPECIAL_METHODS =
[:search, :view, :event]
- TAB_SIZE =
3- @@log =
[]
- @@context_entries =
[]
- @@active_entries =
[]
- @@current_level =
0
Class Method Summary collapse
- .enable_method(method_name) ⇒ Object
- .enabled_method?(method_name) ⇒ Boolean
- .load_config(args) ⇒ Object
- .params_to_config(args) ⇒ Object
- .start(args = {}) ⇒ Object
- .stop ⇒ Object
- .with_timer(method, args, &block) ⇒ Object
Class Method Details
.enable_method(method_name) ⇒ Object
174 175 176 177 |
# File 'lib/card/log.rb', line 174 def enable_method method_name @enabled_methods ||= ::Set.new @enabled_methods << method_name end |
.enabled_method?(method_name) ⇒ Boolean
179 180 181 |
# File 'lib/card/log.rb', line 179 def enabled_method? method_name @enabled_methods && @enabled_methods.include?(method_name) end |
.load_config(args) ⇒ Object
109 110 111 112 113 114 115 116 117 |
# File 'lib/card/log.rb', line 109 def load_config args args = params_to_config args @details = args[:details] || false @max_depth = args[:max_depth] || false @min_time = args[:min_time] || false @output = args[:output] || :text @enabled_methods = ::Set.new prepare_methods_for_logging args[:methods] if args[:methods] end |
.params_to_config(args) ⇒ Object
94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'lib/card/log.rb', line 94 def params_to_config args args[:details] = args[:details] == 'true' ? true : false args[:max_depth] &&= args[:max_depth].to_i args[:min_time] &&= args[:min_time].to_i args[:output] &&= args[:output].to_sym if args[:methods] if args[:methods].kind_of?(String) && args[:methods].match(/^\[.+\]$/) args[:methods] = JSON.parse(args[:methods]).map(&:to_sym) elsif args[:methods].kind_of?(Array) args[:methods].map!(&:to_sym) end end args end |
.start(args = {}) ⇒ Object
119 120 121 122 123 124 125 |
# File 'lib/card/log.rb', line 119 def start args={} @@current_level = 0 @@log = [] @@context_entries = [] @@active_entries = [] @@first_entry = new_entry(args) end |
.stop ⇒ Object
127 128 129 130 131 132 133 134 135 136 |
# File 'lib/card/log.rb', line 127 def stop while (entry = @@context_entries.pop) do finish_entry entry end if @@first_entry @@first_entry.save_duration finish_entry @@first_entry end print_log end |
.with_timer(method, args, &block) ⇒ Object
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
# File 'lib/card/log.rb', line 139 def with_timer method, args, &block if args[:context] # if the previous context was created by an entry on the same level # then finish the current context if it's a different context if @@context_entries.last && @@current_level == @@context_entries.last.level+1 && args[:context] != @@context_entries.last.context finish_entry @@context_entries.pop end # start new context if it's different from the parent context if @@context_entries.empty? || args[:context] != @@context_entries.last.context @@context_entries << new_entry( :title=>'process', :message=>args[:context], :context=>args[:context] ) end end timer = new_entry args.merge(:method=>method ) begin result = block.call ensure timer.save_duration finish_entry timer # finish all deeper nested contexts while @@context_entries.last && @@context_entries.last.level >= @@current_level finish_entry @@context_entries.pop end # we don't know whether the next entry will belong to the same context or will start a new one # so we save the time @@context_entries.last.save_duration if @@context_entries.last end result end |