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.



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

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

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



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

def attributes
  @attributes
end

#file_formatObject (readonly)

Returns the value of attribute file_format.



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

def file_format
  @file_format
end

#linesObject (readonly)

Returns the value of attribute lines.



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

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.



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

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.



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

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.



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

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.



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

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)


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

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)


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

def empty?
  @lines.length == 0
end

#every(field) ⇒ Object

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



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

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



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

def first(field)
  @attributes[field]
end

#first_linenoObject



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

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)


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

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



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

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

#timestampObject

Returns the first timestamp encountered in a request.



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

def timestamp
  first(:timestamp)
end

#validateObject

This function is called before a Requests is yielded.



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

def validate
end