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

#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

#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

#request_time_graphObject (readonly)

Returns the value of attribute request_time_graph.



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

def request_time_graph
  @request_time_graph
end

Instance Method Details

#first_timestampObject

First timestamp encountered



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

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

#last_timestampObject

Last timestamp encountered



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

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
# File 'lib/request_log_analyzer/tracker/hourly_spread.rb', line 36

def prepare
  options[:field] ||= :timestamp
  @request_time_graph = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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



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

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|
    @request_time_graph.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" % requests_per_day, ratio]
    end
  end
end

#timespanObject

Difference between last and first timestamp.



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

def timespan
  last_timestamp - first_timestamp
end

#titleObject

Returns the title of this tracker for reports



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

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

#to_yaml_objectObject

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



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

def to_yaml_object
  yaml_object = {}
  @request_time_graph.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
  @request_time_graph.inject(0) { |sum, value| sum + value }
end

#update(request) ⇒ Object

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



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

def update(request)
  timestamp = request.first(options[:field])

  @request_time_graph[timestamp.to_s[8..9].to_i] +=1
  @first = timestamp if @first.nil? || timestamp < @first
  @last  = timestamp if @last.nil?  || timestamp > @last
end