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

[View source]

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

[View source]

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.

[View source]

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

[View source]

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.

[View source]

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

[View source]

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

[View source]

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

[View source]

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.

[View source]

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