lib/request_log_analyzer/aggregator/summarizer.rb in wvanbergen-request-log-analyzer-1.2.0 vs lib/request_log_analyzer/aggregator/summarizer.rb in wvanbergen-request-log-analyzer-1.2.1
- old
+ new
@@ -3,77 +3,116 @@
class Summarizer < Base
class Definer
attr_reader :trackers
-
+
+ # Initialize tracker array
def initialize
@trackers = []
end
+ # Initialize tracker summarizer by duping the trackers of another summarizer
+ # <tt>other</tt> The other Summarizer
def initialize_copy(other)
@trackers = other.trackers.dup
end
+ # Drop all trackers
def reset!
@trackers = []
end
+ # Include missing trackers through method missing.
def method_missing(tracker_method, *args)
track(tracker_method, args.first)
end
+ # Track the frequency of a specific category
+ # <tt>category_field</tt> Field to track
+ # <tt>options</tt> options are passed to new frequency tracker
def frequency(category_field, options = {})
if category_field.kind_of?(Symbol)
track(:frequency, options.merge(:category => category_field))
elsif category_field.kind_of?(Hash)
track(:frequency, category_field.merge(options))
end
end
+ # Track the duration of a specific category
+ # <tt>duration_field</tt> Field to track
+ # <tt>options</tt> options are passed to new frequency tracker
def duration(duration_field, options = {})
if duration_field.kind_of?(Symbol)
track(:duration, options.merge(:duration => duration_field))
elsif duration_field.kind_of?(Hash)
track(:duration, duration_field.merge(options))
end
end
+ # Helper function to initialize a tracker and add it to the tracker array.
+ # <tt>tracker_class</tt> The class to include
+ # <tt>optiont</tt> The options to pass to the trackers.
def track(tracker_klass, options = {})
tracker_klass = RequestLogAnalyzer::Tracker.const_get(RequestLogAnalyzer::to_camelcase(tracker_klass)) if tracker_klass.kind_of?(Symbol)
@trackers << tracker_klass.new(options)
end
end
attr_reader :trackers
attr_reader :warnings_encountered
+ # Initialize summarizer.
+ # Generate trackers from speciefied source.file_format.report_trackers and set them up
def initialize(source, options = {})
super(source, options)
@warnings_encountered = {}
@trackers = source.file_format.report_trackers
setup
end
def setup
end
+ # Call prepare on all trackers.
def prepare
raise "No trackers set up in Summarizer!" if @trackers.nil? || @trackers.empty?
@trackers.each { |tracker| tracker.prepare }
end
+ # Pass all requests to trackers and let them update if necessary.
+ # <tt>request</tt> The request to pass.
def aggregate(request)
@trackers.each do |tracker|
tracker.update(request) if tracker.should_update?(request)
end
end
+ # Call finalize on all trackers. Saves a YAML dump if this is set in the options.
def finalize
@trackers.each { |tracker| tracker.finalize }
+ save_results_dump(options[:dump]) if options[:dump]
end
+
+ # Saves the results of all the trackers in YAML format to a file.
+ # <tt>filename</tt> The file to store the YAML dump in.
+ def save_results_dump(filename)
+ File.open(filename, 'w') { |file| file.write(to_yaml) }
+ end
+
+ # Exports all the tracker results to YAML. It will call the to_yaml_object method
+ # for every tracker and combines these into a single YAML export.
+ def to_yaml
+ require 'yaml'
+ trackers_export = @trackers.inject({}) do |export, tracker|
+ export[tracker.title] = tracker.to_yaml_object; export
+ end
+ YAML::dump(trackers_export)
+ end
+ # Call report on all trackers.
+ # <tt>output</tt> RequestLogAnalyzer::Output object to output to
def report(output)
report_header(output)
if source.parsed_requests > 0
@trackers.each { |tracker| tracker.report(output) }
else
@@ -81,10 +120,12 @@
output.puts('There were no requests analyzed.')
end
report_footer(output)
end
+ # Generate report header.
+ # <tt>output</tt> RequestLogAnalyzer::Output object to output to
def report_header(output)
output.title("Request summary")
output.with_style(:cell_separator => false) do
output.table({:width => 20}, {:font => :bold}) do |rows|
@@ -96,10 +137,12 @@
end
end
output << "\n"
end
+ # Generate report footer.
+ # <tt>output</tt> RequestLogAnalyzer::Output object to output to
def report_footer(output)
if has_log_ordering_warnings?
output.title("Parse warnings")
output.puts "Parseable lines were ancountered without a header line before it. It"
@@ -108,17 +151,23 @@
output.puts output.link("http://github.com/wvanbergen/request-log-analyzer/wikis/configure-logging")
output.puts
end
end
+ # Returns true if there were any warnings generated by the trackers
def has_warnings?
- @warnings_encountered.inject(0) { |result, (key, value)| result += value } > 0
+ @warnings_encountered.inject(0) { |result, (key, value)| result += value } > 0
end
+ # Returns true if there were any log ordering warnings
def has_log_ordering_warnings?
@warnings_encountered[:no_current_request] && @warnings_encountered[:no_current_request] > 0
end
+ # Store an encountered warning
+ # <tt>type</tt> Type of warning
+ # <tt>message</tt> Warning message
+ # <tt>lineno</tt> The line on which the error was encountered
def warning(type, message, lineno)
@warnings_encountered[type] ||= 0
@warnings_encountered[type] += 1
end
end