lib/request_log_analyzer/aggregator/summarizer.rb in request-log-analyzer-1.3.7 vs lib/request_log_analyzer/aggregator/summarizer.rb in request-log-analyzer-1.4.0

- old
+ new

@@ -1,11 +1,11 @@ module RequestLogAnalyzer::Aggregator class Summarizer < Base - + class Definer - + attr_reader :trackers # Initialize tracker array def initialize @trackers = [] @@ -14,103 +14,103 @@ # 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) 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)) + track(:duration, duration_field.merge(options)) end - 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 @@ -119,51 +119,51 @@ output.puts 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.with_style(:cell_separator => false) do output.table({:width => 20}, {:font => :bold}) do |rows| rows << ['Parsed lines:', source.parsed_lines] rows << ['Skipped lines:', source.skipped_lines] rows << ['Parsed requests:', source.parsed_requests] rows << ['Skipped requests:', source.skipped_requests] rows << ["Warnings:", @warnings_encountered.map { |(key, value)| "#{key}: #{value}" }.join(', ')] if has_warnings? 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" output.puts "could be that logging is not setup correctly for your application." output.puts "Visit this website for logging configuration tips:" 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 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)