Class: RequestLogAnalyzer::Tracker::HourlySpread

Inherits:
Base
  • Object
show all
Defined in:
lib/request_log_analyzer/tracker/hourly_spread.rb

Overview

Determines the average hourly spread of the parsed requests. This spread is shown in a graph form.

Accepts the following options:

  • :if Proc that has to return !nil for a request to be passed to the tracker.

  • :line_type The line type that contains the duration field (determined by the category proc).

  • :output Direct output here (defaults to STDOUT)

  • :unless Proc that has to return nil for a request to be passed to the tracker.

Expects the following items in the update request hash

  • :timestamp in YYYYMMDDHHMMSS format.

Example output:

Requests graph - average per day per hour
--------------------------------------------------
  7:00 - 330 hits        : =======
  8:00 - 704 hits        : =================
  9:00 - 830 hits        : ====================
 10:00 - 822 hits        : ===================
 11:00 - 823 hits        : ===================
 12:00 - 729 hits        : =================
 13:00 - 614 hits        : ==============
 14:00 - 690 hits        : ================
 15:00 - 492 hits        : ===========
 16:00 - 355 hits        : ========
 17:00 - 213 hits        : =====
 18:00 - 107 hits        : ==
 ................

Instance Attribute Summary collapse

Attributes inherited from Base

#options

Instance Method Summary collapse

Methods inherited from Base

#create_lambda, #finalize, #initialize, #setup_should_update_checks!, #should_update?

Constructor Details

This class inherits a constructor from RequestLogAnalyzer::Tracker::Base

Instance Attribute Details

#firstObject (readonly)

Returns the value of attribute first.



33
34
35
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 33

def first
  @first
end

#hour_frequenciesObject (readonly)

Returns the value of attribute hour_frequencies.



33
34
35
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 33

def hour_frequencies
  @hour_frequencies
end

#lastObject (readonly)

Returns the value of attribute last.



33
34
35
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 33

def last
  @last
end

Instance Method Details

#first_timestampObject

First timestamp encountered



58
59
60
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 58

def first_timestamp
  DateTime.parse(@first.to_s, '%Y%m%d%H%M%S') rescue nil
end

#last_timestampObject

Last timestamp encountered



63
64
65
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 63

def last_timestamp
  DateTime.parse(@last.to_s, '%Y%m%d%H%M%S') rescue nil
end

#prepareObject

Check if timestamp field is set in the options and prepare the result time graph.



36
37
38
39
40
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 36

def prepare
  options[:field] ||= :timestamp
  @hour_frequencies = (0...24).map { 0 }
  @first, @last = 99999999999999, 0
end

#report(output) ⇒ Object

Generate an hourly spread report to the given output object. Any options for the report should have been set during initialize. output The output object



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 75

def report(output)
  output.title(title)

  if total_requests == 0
    output << "None found.\n"
    return
  end

  days = [1, timespan].max
  output.table({}, {:align => :right}, {:type => :ratio, :width => :rest, :treshold => 0.15}) do |rows|
    @hour_frequencies.each_with_index do |requests, index|
      ratio            = requests.to_f / total_requests.to_f
      requests_per_day = (requests / days).ceil
      rows << ["#{index.to_s.rjust(3)}:00", "%d hits/day" % requests_per_day, ratio]
    end
  end
end

#timespanObject

Difference between last and first timestamp.



68
69
70
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 68

def timespan
  last_timestamp - first_timestamp
end

#titleObject

Returns the title of this tracker for reports



94
95
96
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 94

def title
  options[:title] || "Request distribution per hour"
end

#to_yaml_objectObject

Returns the found frequencies per hour as a hash for YAML exporting



99
100
101
102
103
104
105
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 99

def to_yaml_object
  yaml_object = {}
  @hour_frequencies.each_with_index do |freq, hour|
    yaml_object["#{hour}:00 - #{hour+1}:00"] = freq
  end
  yaml_object
end

#total_requestsObject

Total amount of requests tracked



52
53
54
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 52

def total_requests
  @hour_frequencies.inject(0) { |sum, value| sum + value }
end

#update(request) ⇒ Object

Check if the timestamp in the request and store it. request The request.



44
45
46
47
48
49
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 44

def update(request)
  timestamp = request.first(options[:field])
  @hour_frequencies[timestamp.to_s[8..9].to_i] +=1
  @first = timestamp if timestamp < @first
  @last  = timestamp if timestamp > @last
end