Class: RequestLogAnalyzer::Request

Inherits:
Object
  • Object
show all
Includes:
Converters
Defined in:
lib/request_log_analyzer/request.rb

Overview

The Request class represents a parsed request from the log file. Instances are created by the LogParser and are passed to the different aggregators, so they can do their aggregating work.

This class provides several methods to access the data that was parsed from the log files. Request#first(field_name) returns the first (only) value corresponding to the given field Request#every(field_name) returns all values corresponding to the given field name as array.

Defined Under Namespace

Modules: Converters

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Converters

#convert_decimal, #convert_duration, #convert_eval, #convert_float, #convert_int, #convert_integer, #convert_string, #convert_sym, #convert_symbol, #convert_timestamp, #convert_traffic, #convert_value

Constructor Details

#initialize(file_format, attributes = {}) ⇒ Request

Initializes a new Request object. It will apply the the provided FileFormat module to this instance.



78
79
80
81
82
# File 'lib/request_log_analyzer/request.rb', line 78

def initialize(file_format, attributes = {})
  @lines       = []
  @attributes  = attributes
  @file_format = file_format
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



74
75
76
# File 'lib/request_log_analyzer/request.rb', line 74

def attributes
  @attributes
end

#file_formatObject (readonly)

Returns the value of attribute file_format.



74
75
76
# File 'lib/request_log_analyzer/request.rb', line 74

def file_format
  @file_format
end

#linesObject (readonly)

Returns the value of attribute lines.



74
75
76
# File 'lib/request_log_analyzer/request.rb', line 74

def lines
  @lines
end

Class Method Details

.create(file_format, *hashes) ⇒ Object

Creates a new request that was parsed from the log with the given FileFormat. The hashes that are passed to this function are added as lines to this request.



86
87
88
89
90
# File 'lib/request_log_analyzer/request.rb', line 86

def self.create(file_format, *hashes)
  request = self.new(file_format)
  hashes.flatten.each { |hash| request << hash }
  return request
end

Instance Method Details

#<<(hash) ⇒ Object

Adds another line to the request. This method switches automatically between the add_line_hash and add_parsed_line based on the keys of the provided hash.



114
115
116
# File 'lib/request_log_analyzer/request.rb', line 114

def <<(hash)
  hash[:line_definition] ? add_parsed_line(hash) : add_line_hash(hash)
end

#add_line_hash(value_hash) ⇒ Object

Adds another line to the request using a plain hash.

The line should be provides as a hash of the fields parsed from the line.



107
108
109
110
# File 'lib/request_log_analyzer/request.rb', line 107

def add_line_hash(value_hash)
  @lines << value_hash
  @attributes = value_hash.merge(@attributes)
end

#add_parsed_line(parsed_line) ⇒ Object

Adds another line to the request when it is parsed in the LogParser.

The line should be provided as a hash with the attributes line_definition, :captures, :lineno and :source set. This function is called from LogParser.



96
97
98
99
100
101
102
# File 'lib/request_log_analyzer/request.rb', line 96

def add_parsed_line (parsed_line)
  value_hash = parsed_line[:line_definition].convert_captured_values(parsed_line[:captures], self)
  value_hash[:line_type] = parsed_line[:line_definition].name
  value_hash[:lineno] = parsed_line[:lineno]
  value_hash[:source] = parsed_line[:source]
  add_line_hash(value_hash)
end

#completed?Boolean

Checks whether this request is completed. A completed request contains both a parsed header line and a parsed footer line. Not that calling this function in single line mode will always return false.

Returns:

  • (Boolean)


149
150
151
152
153
154
155
156
157
# File 'lib/request_log_analyzer/request.rb', line 149

def completed?
  header_found, footer_found = false, false
  @lines.each do |line| 
    line_def = file_format.line_definitions[line[:line_type]]
    header_found = true if line_def.header
    footer_found = true if line_def.footer        
  end
  header_found && footer_found      
end

#empty?Boolean

Returns true if this request does not yet contain any parsed lines. This should only occur during parsing. An empty request should never be sent to the aggregators

Returns:

  • (Boolean)


142
143
144
# File 'lib/request_log_analyzer/request.rb', line 142

def empty?
  @lines.length == 0
end

#every(field) ⇒ Object

Returns an array of all the “field” values that were captured for this request



136
137
138
# File 'lib/request_log_analyzer/request.rb', line 136

def every(field)
  @lines.inject([]) { |result, fields| result << fields[field] if fields.has_key?(field); result }
end

#first(field) ⇒ Object Also known as: []

Returns the value that was captured for the “field” of this request. This function will return the first value that was captured if the field was captured in multiple lines



129
130
131
# File 'lib/request_log_analyzer/request.rb', line 129

def first(field)
  @attributes[field]
end

#first_linenoObject



168
169
170
# File 'lib/request_log_analyzer/request.rb', line 168

def first_lineno
  @lines.map { |line| line[:lineno] }.reject { |v| v.nil? }.min
end

#has_line_type?(line_type) ⇒ Boolean Also known as: =~

Checks whether the given line type was parsed from the log file for this request

Returns:

  • (Boolean)


119
120
121
122
# File 'lib/request_log_analyzer/request.rb', line 119

def has_line_type?(line_type)
  return true if @lines.length == 1 && @lines[0][:line_type] == line_type.to_sym
  @lines.detect { |l| l[:line_type] == line_type.to_sym }
end

#last_linenoObject



172
173
174
# File 'lib/request_log_analyzer/request.rb', line 172

def last_lineno
  @lines.map { |line| line[:lineno] }.reject { |v| v.nil? }.max
end

#timestampObject

Returns the first timestamp encountered in a request.



164
165
166
# File 'lib/request_log_analyzer/request.rb', line 164

def timestamp
  first(:timestamp)
end

#validateObject

This function is called before a Requests is yielded.



160
161
# File 'lib/request_log_analyzer/request.rb', line 160

def validate
end