request-log-analyzer 1.9.10 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore CHANGED
@@ -8,4 +8,6 @@ requests.db
8
8
  /tmp
9
9
  /classes
10
10
  /files
11
- /coverage
11
+ /coverage
12
+ Gemfile.lock
13
+ /.bundle/
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
@@ -13,7 +13,7 @@ module RequestLogAnalyzer
13
13
 
14
14
  # The current version of request-log-analyzer.
15
15
  # Do not change the value by hand; it will be updated automatically by the gem release script.
16
- VERSION = "1.9.10"
16
+ VERSION = "1.10.0"
17
17
 
18
18
 
19
19
  autoload :Controller, 'request_log_analyzer/controller'
@@ -13,6 +13,8 @@ module RequestLogAnalyzer::FileFormat
13
13
  autoload :DelayedJob21, 'request_log_analyzer/file_format/delayed_job21'
14
14
  autoload :Apache, 'request_log_analyzer/file_format/apache'
15
15
  autoload :AmazonS3, 'request_log_analyzer/file_format/amazon_s3'
16
+ autoload :W3c, 'request_log_analyzer/file_format/w3c'
17
+ autoload :Haproxy, 'request_log_analyzer/file_format/haproxy'
16
18
 
17
19
  # Loads a FileFormat::Base subclass instance.
18
20
  # You can provide:
@@ -293,4 +295,4 @@ module RequestLogAnalyzer::FileFormat
293
295
  return nil
294
296
  end
295
297
  end
296
- end
298
+ end
@@ -30,20 +30,23 @@ module RequestLogAnalyzer::FileFormat
30
30
 
31
31
  # A hash that defines how the log format directives should be parsed.
32
32
  LOG_DIRECTIVES = {
33
- '%' => { :regexp => '%', :captures => [] },
34
- 'h' => { :regexp => '([A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+)', :captures => [{:name => :remote_host, :type => :string}] },
35
- 'a' => { :regexp => "(#{ip_address})", :captures => [{:name => :remote_ip, :type => :string}] },
36
- 'b' => { :regexp => '(\d+|-)', :captures => [{:name => :bytes_sent, :type => :traffic}] },
37
- 'c' => { :regexp => '(\+|\-|\X)', :captures => [{:name => :connection_status, :type => :integer}] },
38
- 'D' => { :regexp => '(\d+|-)', :captures => [{:name => :duration, :type => :duration, :unit => :musec}] },
39
- 'l' => { :regexp => '([\w-]+)', :captures => [{:name => :remote_logname, :type => :nillable_string}] },
40
- 'T' => { :regexp => '((?:\d+(?:\.\d+))|-)', :captures => [{:name => :duration, :type => :duration, :unit => :sec}] },
41
- 't' => { :regexp => "\\[(#{APACHE_TIMESTAMP})?\\]", :captures => [{:name => :timestamp, :type => :timestamp}] },
42
- 's' => { :regexp => '(\d{3})', :captures => [{:name => :http_status, :type => :integer}] },
43
- 'u' => { :regexp => '(\w+|-)', :captures => [{:name => :user, :type => :nillable_string}] },
44
- 'U' => { :regexp => '(\/\S*)', :captures => [{:name => :path, :type => :string}] },
45
- 'r' => { :regexp => '([A-Z]+) (\S+) HTTP\/(\d+(?:\.\d+)*)', :captures => [{:name => :http_method, :type => :string},
46
- {:name => :path, :type => :path}, {:name => :http_version, :type => :string}]},
33
+ '%' => { nil => { :regexp => '%', :captures => [] } },
34
+ 'h' => { nil => { :regexp => '([A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+)', :captures => [{:name => :remote_host, :type => :string}] } },
35
+ 'a' => { nil => { :regexp => "(#{ip_address})", :captures => [{:name => :remote_ip, :type => :string}] } },
36
+ 'b' => { nil => { :regexp => '(\d+|-)', :captures => [{:name => :bytes_sent, :type => :traffic}] } },
37
+ 'c' => { nil => { :regexp => '(\+|\-|\X)', :captures => [{:name => :connection_status, :type => :integer}] } },
38
+ 'D' => { nil => { :regexp => '(\d+|-)', :captures => [ {:name => :duration, :type => :duration, :unit => :musec }] },
39
+ 'micro' => { :regexp => '(\d+|-)', :captures => [ {:name => :duration, :type => :duration, :unit => :musec }] },
40
+ 'milli' => { :regexp => '(\d+|-)', :captures => [ {:name => :duration, :type => :duration, :unit => :msec }] }
41
+ },
42
+ 'l' => { nil => { :regexp => '([\w-]+)', :captures => [{:name => :remote_logname, :type => :nillable_string}] } },
43
+ 'T' => { nil => { :regexp => '((?:\d+(?:\.\d+))|-)', :captures => [{:name => :duration, :type => :duration, :unit => :sec}] } },
44
+ 't' => { nil => { :regexp => "\\[(#{APACHE_TIMESTAMP})?\\]", :captures => [{:name => :timestamp, :type => :timestamp}] } },
45
+ 's' => { nil => { :regexp => '(\d{3})', :captures => [{:name => :http_status, :type => :integer}] } },
46
+ 'u' => { nil => { :regexp => '(\w+|-)', :captures => [{:name => :user, :type => :nillable_string}] } },
47
+ 'U' => { nil => { :regexp => '(\/\S*)', :captures => [{:name => :path, :type => :string}] } },
48
+ 'r' => { nil => { :regexp => '([A-Z]+) (\S+) HTTP\/(\d+(?:\.\d+)*)', :captures => [{:name => :http_method, :type => :string},
49
+ {:name => :path, :type => :path}, {:name => :http_version, :type => :string}]} },
47
50
  'i' => { 'Referer' => { :regexp => '(\S+)', :captures => [{:name => :referer, :type => :nillable_string}] },
48
51
  'User-agent' => { :regexp => '(.*)', :captures => [{:name => :user_agent, :type => :user_agent}] }
49
52
  }
@@ -72,14 +75,13 @@ module RequestLogAnalyzer::FileFormat
72
75
 
73
76
  if variable
74
77
  # Check if we recognize the log directive
75
- directive = LOG_DIRECTIVES[variable]
76
- directive = directive[arg] if directive && arg
78
+ directive = LOG_DIRECTIVES[variable][arg] rescue nil
77
79
 
78
80
  if directive
79
81
  line_regexp << directive[:regexp] # Parse the value of the directive
80
82
  captures += directive[:captures] # Add the directive's information to the captures
81
83
  else
82
- puts "%#{directive} log directiven not yet supported, field is ignored."
84
+ puts "Apache log directive %#{arg}#{variable} is not yet supported by RLA, the field will be ignored."
83
85
  line_regexp << '.*' # Just accept any input for this literal
84
86
  end
85
87
  end
@@ -126,22 +128,11 @@ module RequestLogAnalyzer::FileFormat
126
128
  "#{value[7,4]}#{MONTHS[value[3,3]]}#{value[0,2]}#{value[12,2]}#{value[15,2]}#{value[18,2]}".to_i
127
129
  end
128
130
 
129
- # This function can be overridden to rewrite the path for better categorization in the
130
- # reports.
131
- def convert_path(value, definition)
132
- value
133
- end
134
-
135
131
  # This function can be overridden to simplify the user agent string for better
136
132
  # categorization in the reports
137
133
  def convert_user_agent(value, definition)
138
134
  value # TODO
139
135
  end
140
-
141
- # Make sure that the string '-' is parsed as a nil value.
142
- def convert_nillable_string(value, definition)
143
- value == '-' ? nil : value
144
- end
145
136
  end
146
137
  end
147
138
  end
@@ -0,0 +1,138 @@
1
+ module RequestLogAnalyzer::FileFormat
2
+
3
+ class Haproxy < RequestLogAnalyzer::FileFormat::Base
4
+
5
+ extend CommonRegularExpressions
6
+
7
+ # Define line types
8
+ line_definition :haproxy do |line|
9
+ line.header = true
10
+ line.footer = true
11
+
12
+ line.regexp = %r{
13
+ (#{ip_address}):\d+\s # client_ip ':' client_port
14
+ \[(#{timestamp('%d/%b/%Y:%H:%M:%S')})\.\d{3}\]\s # '[' accept_date ']'
15
+ (\S+)\s # frontend_name
16
+ (\S+)\/(\S+)\s # backend_name '/' server_name
17
+ (\d+|-1)\/(\d+|-1)\/(\d+|-1)\/(\d+|-1)\/\+?(\d+)\s # Tq '/' Tw '/' Tc '/' Tr '/' Tt
18
+ (\d+)\s # status_code
19
+ \+?(\d+)\s # bytes_read
20
+ (\S+)\s # captured_request_cookie
21
+ (\S+)\s # captured_response_cookie
22
+ (\w|-)(\w|-)(\w|-)(\w|-)\s # termination_state
23
+ (\d+)\/(\d+)\/(\d+)\/(\d+)\/\+?(\d+)\s # actconn '/' feconn '/' beconn '/' srv_conn '/' retries
24
+ (\d+)\/(\d+)\s # srv_queue '/' backend_queue
25
+ (\S*)\s? # captured_request_headers
26
+ (\S*)\s? # captured_response_headers
27
+ "([^"]*)" # '"' http_request '"'
28
+ }x
29
+
30
+ line.capture(:client_ip).as(:string)
31
+ line.capture(:accept_date).as(:timestamp)
32
+ line.capture(:frontend_name).as(:string)
33
+ line.capture(:backend_name).as(:string)
34
+ line.capture(:server_name).as(:string)
35
+ line.capture(:tq).as(:nillable_duration, :unit => :msec)
36
+ line.capture(:tw).as(:nillable_duration, :unit => :msec)
37
+ line.capture(:tc).as(:nillable_duration, :unit => :msec)
38
+ line.capture(:tr).as(:nillable_duration, :unit => :msec)
39
+ line.capture(:tt).as(:duration, :unit => :msec)
40
+ line.capture(:status_code).as(:integer)
41
+ line.capture(:bytes_read).as(:traffic, :unit => :byte)
42
+ line.capture(:captured_request_cookie).as(:nillable_string)
43
+ line.capture(:captured_response_cookie).as(:nillable_string)
44
+ line.capture(:termination_event_code).as(:nillable_string)
45
+ line.capture(:terminated_session_state).as(:nillable_string)
46
+ line.capture(:clientside_persistence_cookie).as(:nillable_string)
47
+ line.capture(:serverside_persistence_cookie).as(:nillable_string)
48
+ line.capture(:actconn).as(:integer)
49
+ line.capture(:feconn).as(:integer)
50
+ line.capture(:beconn).as(:integer)
51
+ line.capture(:srv_conn).as(:integer)
52
+ line.capture(:retries).as(:integer)
53
+ line.capture(:srv_queue).as(:integer)
54
+ line.capture(:backend_queue).as(:integer)
55
+ line.capture(:captured_request_headers).as(:nillable_string)
56
+ line.capture(:captured_response_headers).as(:nillable_string)
57
+ line.capture(:http_request).as(:nillable_string)
58
+ end
59
+
60
+ # Define the summary report
61
+ report do |analyze|
62
+ analyze.hourly_spread :field => :accept_date
63
+
64
+ analyze.frequency :client_ip,
65
+ :title => "Hits per IP"
66
+
67
+ analyze.frequency :frontend_name,
68
+ :title => "Hits per frontend service"
69
+
70
+ analyze.frequency :backend_name,
71
+ :title => "Hits per backend service"
72
+
73
+ analyze.frequency :server_name,
74
+ :title => "Hits per backend server"
75
+
76
+ analyze.frequency :status_code,
77
+ :title => "HTTP response code frequency"
78
+
79
+ analyze.frequency :http_request,
80
+ :title => "Most popular requests"
81
+
82
+ analyze.frequency :http_request,
83
+ :title => "Most frequent HTTP 40x errors",
84
+ :category => lambda { |r| "#{r[:http_request]}"},
85
+ :if => lambda { |r| r[:status_code] >= 400 and r[:status_code] <= 417 }
86
+
87
+ analyze.frequency :http_request,
88
+ :title => "Most frequent HTTP 50x errors",
89
+ :category => lambda { |r| "#{r[:http_request]}"},
90
+ :if => lambda { |r| r[:status_code] >= 500 and r[:status_code] <= 505 }
91
+
92
+ analyze.traffic :bytes_read,
93
+ :title => "Traffic per frontend service",
94
+ :category => lambda { |r| "#{r[:frontend_name]}"}
95
+
96
+ analyze.traffic :bytes_read,
97
+ :title => "Traffic per backend service",
98
+ :category => lambda { |r| "#{r[:backend_name]}"}
99
+
100
+ analyze.traffic :bytes_read,
101
+ :title => "Traffic per backend server",
102
+ :category => lambda { |r| "#{r[:server_name]}"}
103
+
104
+ analyze.duration :tr,
105
+ :title => "Time waiting for backend response",
106
+ :category => lambda { |r| "#{r[:http_request]}"}
107
+
108
+ analyze.duration :tt,
109
+ :title => "Total time spent on request",
110
+ :category => lambda { |r| "#{r[:http_request]}"}
111
+ end
112
+
113
+ # Define a custom Request class for the HAProxy file format to speed up
114
+ # timestamp handling. Shamelessly copied from apache.rb
115
+ class Request < RequestLogAnalyzer::Request
116
+
117
+ MONTHS = {'Jan' => '01', 'Feb' => '02', 'Mar' => '03', 'Apr' => '04', 'May' => '05', 'Jun' => '06',
118
+ 'Jul' => '07', 'Aug' => '08', 'Sep' => '09', 'Oct' => '10', 'Nov' => '11', 'Dec' => '12' }
119
+
120
+ # Do not use DateTime.parse, but parse the timestamp ourselves to return
121
+ # a integer to speed up parsing.
122
+ def convert_timestamp(value, definition)
123
+ "#{value[7,4]}#{MONTHS[value[3,3]]}#{value[0,2]}#{value[12,2]}#{value[15,2]}#{value[18,2]}".to_i
124
+ end
125
+
126
+ # Make sure that the strings '-' or '{}' or '' are parsed as a nil value.
127
+ def convert_nillable_string(value, definition)
128
+ value =~ /-|\{\}|^$/ ? nil : value
129
+ end
130
+
131
+ # Make sure that -1 is parsed as a nil value.
132
+ def convert_nillable_duration(value, definition)
133
+ value == '-1' ? nil : convert_duration(value, definition)
134
+ end
135
+
136
+ end
137
+ end
138
+ end
@@ -36,7 +36,7 @@ module RequestLogAnalyzer::FileFormat
36
36
  line_definition :completed do |line|
37
37
  line.footer = true
38
38
  line.teaser = /Completed /
39
- line.regexp = /Completed (\d+)? .*in (\d+(?:\.\d+)?)ms(?:[^\(]*\(Views: (\d+(?:\.\d+)?)ms .* ActiveRecord: (\d+(?:\.\d+)?)ms\))?/
39
+ line.regexp = /Completed (\d+)? .*in (\d+(?:\.\d+)?)ms(?:[^\(]*\(Views: (\d+(?:\.\d+)?)ms .* ActiveRecord: (\d+(?:\.\d+)?)ms.*\))?/
40
40
 
41
41
  line.capture(:status).as(:integer)
42
42
  line.capture(:duration).as(:duration, :unit => :msec)
@@ -0,0 +1,56 @@
1
+ module RequestLogAnalyzer::FileFormat
2
+
3
+ # FileFormat for W3C access logs.
4
+ class W3c < Base
5
+
6
+ extend CommonRegularExpressions
7
+
8
+ line_definition :access do |line|
9
+ line.header = true
10
+ line.footer = true
11
+ line.regexp = /^(#{timestamp('%Y-%m-%d %H:%M:%S')}) (#{ip_address}) (.*) (#{ip_address}) (\d+) (\w+) ([\w|\/|.]+) \- (\d+) (\d+) (\d+) (\d+) (.*) (\S+)/
12
+
13
+ line.capture(:timestamp).as(:timestamp)
14
+ line.capture(:remote_ip)
15
+ line.capture(:username).as(:nillable_string)
16
+ line.capture(:local_ip)
17
+ line.capture(:port).as(:integer)
18
+ line.capture(:method)
19
+ line.capture(:path).as(:path)
20
+ line.capture(:http_status).as(:integer)
21
+ line.capture(:bytes_sent).as(:traffic, :unit => :byte)
22
+ line.capture(:bytes_received).as(:traffic, :unit => :byte)
23
+ line.capture(:duration).as(:duration, :unit => :msec)
24
+ line.capture(:user_agent)
25
+ line.capture(:referer)
26
+ end
27
+
28
+ report do |analyze|
29
+ analyze.timespan
30
+ analyze.hourly_spread
31
+
32
+ analyze.frequency :category => :http_method, :title => "HTTP methods"
33
+ analyze.frequency :category => :http_status, :title => "HTTP statuses"
34
+
35
+ analyze.frequency :category => :path, :title => "Most popular URIs"
36
+
37
+ analyze.frequency :category => :user_agent, :title => "User agents"
38
+ analyze.frequency :category => :referer, :title => "Referers"
39
+
40
+ analyze.duration :duration => :duration, :category => :path, :title => 'Request duration'
41
+ analyze.traffic :traffic => :bytes_sent, :category => :path, :title => 'Traffic out'
42
+ analyze.traffic :traffic => :bytes_received, :category => :path, :title => 'Traffic in'
43
+ end
44
+
45
+ class Request < RequestLogAnalyzer::Request
46
+ # Do not use DateTime.parse, but parse the timestamp ourselves to return a integer
47
+ # to speed up parsing.
48
+ def convert_timestamp(value, definition)
49
+ "#{value[0,4]}#{value[5,2]}#{value[8,2]}#{value[11,2]}#{value[14,2]}#{value[17,2]}".to_i
50
+ end
51
+ end
52
+
53
+
54
+ end
55
+
56
+ end
@@ -27,6 +27,13 @@ module RequestLogAnalyzer
27
27
  def convert_integer(value, capture_definition); value.to_i; end
28
28
  def convert_sym(value, capture_definition); value.to_sym; end
29
29
  def convert_symbol(value, capture_definition); value.to_sym; end
30
+ def convert_nillable_string(value, definition); value == '-' ? nil : value ; end
31
+
32
+ # This function can be overridden to rewrite the path for better categorization in the
33
+ # reports.
34
+ def convert_path(value, definition)
35
+ value
36
+ end
30
37
 
31
38
  # Converts :eval field, which should evaluate to a hash.
32
39
  def convert_eval(value, capture_definition)
@@ -2,8 +2,8 @@ Gem::Specification.new do |s|
2
2
  s.name = "request-log-analyzer"
3
3
 
4
4
  # Do not set the version and date field manually, this is done by the release script
5
- s.version = "1.9.10"
6
- s.date = "2011-01-03"
5
+ s.version = "1.10.0"
6
+ s.date = "2011-02-26"
7
7
 
8
8
  s.rubyforge_project = 'r-l-a'
9
9
 
@@ -39,6 +39,6 @@ Gem::Specification.new do |s|
39
39
 
40
40
  # The files and test_files directives are set automatically by the release script.
41
41
  # Do not change them by hand, but make sure to add the files to the git repository.
42
- s.files = %w(.gitignore DESIGN.rdoc LICENSE README.rdoc Rakefile bin/request-log-analyzer lib/cli/command_line_arguments.rb lib/cli/database_console.rb lib/cli/database_console_init.rb lib/cli/progressbar.rb lib/cli/tools.rb lib/mixins/gets_memory_protection.rb lib/request_log_analyzer.rb lib/request_log_analyzer/aggregator.rb lib/request_log_analyzer/aggregator/database_inserter.rb lib/request_log_analyzer/aggregator/echo.rb lib/request_log_analyzer/aggregator/summarizer.rb lib/request_log_analyzer/controller.rb lib/request_log_analyzer/database.rb lib/request_log_analyzer/database/base.rb lib/request_log_analyzer/database/connection.rb lib/request_log_analyzer/database/request.rb lib/request_log_analyzer/database/source.rb lib/request_log_analyzer/database/warning.rb lib/request_log_analyzer/file_format.rb lib/request_log_analyzer/file_format/amazon_s3.rb lib/request_log_analyzer/file_format/apache.rb lib/request_log_analyzer/file_format/delayed_job.rb lib/request_log_analyzer/file_format/delayed_job2.rb lib/request_log_analyzer/file_format/delayed_job21.rb lib/request_log_analyzer/file_format/merb.rb lib/request_log_analyzer/file_format/mysql.rb lib/request_log_analyzer/file_format/oink.rb lib/request_log_analyzer/file_format/postgresql.rb lib/request_log_analyzer/file_format/rack.rb lib/request_log_analyzer/file_format/rails.rb lib/request_log_analyzer/file_format/rails3.rb lib/request_log_analyzer/file_format/rails_development.rb lib/request_log_analyzer/filter.rb lib/request_log_analyzer/filter/anonymize.rb lib/request_log_analyzer/filter/field.rb lib/request_log_analyzer/filter/timespan.rb lib/request_log_analyzer/line_definition.rb lib/request_log_analyzer/log_processor.rb lib/request_log_analyzer/mailer.rb lib/request_log_analyzer/output.rb lib/request_log_analyzer/output/fancy_html.rb lib/request_log_analyzer/output/fixed_width.rb lib/request_log_analyzer/output/html.rb lib/request_log_analyzer/request.rb lib/request_log_analyzer/source.rb lib/request_log_analyzer/source/database_loader.rb lib/request_log_analyzer/source/log_parser.rb lib/request_log_analyzer/tracker.rb lib/request_log_analyzer/tracker/duration.rb lib/request_log_analyzer/tracker/frequency.rb lib/request_log_analyzer/tracker/hourly_spread.rb lib/request_log_analyzer/tracker/numeric_value.rb lib/request_log_analyzer/tracker/timespan.rb lib/request_log_analyzer/tracker/traffic.rb request-log-analyzer.gemspec spec/database.yml spec/fixtures/apache_combined.log spec/fixtures/apache_common.log spec/fixtures/decompression.log spec/fixtures/decompression.log.bz2 spec/fixtures/decompression.log.gz spec/fixtures/decompression.log.zip spec/fixtures/decompression.tar.gz spec/fixtures/decompression.tgz spec/fixtures/header_and_footer.log spec/fixtures/merb.log spec/fixtures/merb_prefixed.log spec/fixtures/multiple_files_1.log spec/fixtures/multiple_files_2.log spec/fixtures/mysql_slow_query.log spec/fixtures/oink_22.log spec/fixtures/oink_22_failure.log spec/fixtures/postgresql.log spec/fixtures/rails.db spec/fixtures/rails_1x.log spec/fixtures/rails_22.log spec/fixtures/rails_22_cached.log spec/fixtures/rails_unordered.log spec/fixtures/sinatra.log spec/fixtures/syslog_1x.log spec/fixtures/test_file_format.log spec/fixtures/test_language_combined.log spec/fixtures/test_order.log spec/integration/command_line_usage_spec.rb spec/integration/mailer_spec.rb spec/integration/munin_plugins_rails_spec.rb spec/integration/scout_spec.rb spec/lib/helpers.rb spec/lib/macros.rb spec/lib/matchers.rb spec/lib/mocks.rb spec/lib/testing_format.rb spec/spec_helper.rb spec/unit/aggregator/database_inserter_spec.rb spec/unit/aggregator/summarizer_spec.rb spec/unit/controller/controller_spec.rb spec/unit/controller/log_processor_spec.rb spec/unit/database/base_class_spec.rb spec/unit/database/connection_spec.rb spec/unit/database/database_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb spec/unit/file_format/apache_format_spec.rb spec/unit/file_format/common_regular_expressions_spec.rb spec/unit/file_format/delayed_job21_format_spec.rb spec/unit/file_format/delayed_job2_format_spec.rb spec/unit/file_format/delayed_job_format_spec.rb spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/format_autodetection_spec.rb spec/unit/file_format/line_definition_spec.rb spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/mysql_format_spec.rb spec/unit/file_format/oink_format_spec.rb spec/unit/file_format/postgresql_format_spec.rb spec/unit/file_format/rack_format_spec.rb spec/unit/file_format/rails3_format_spec.rb spec/unit/file_format/rails_format_spec.rb spec/unit/filter/anonymize_filter_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/filter/filter_spec.rb spec/unit/filter/timespan_filter_spec.rb spec/unit/mailer_spec.rb spec/unit/request_spec.rb spec/unit/source/log_parser_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/unit/tracker/numeric_value_tracker_spec.rb spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/traffic_tracker_spec.rb tasks/github-gem.rake tasks/request_log_analyzer.rake)
43
- s.test_files = %w(spec/integration/command_line_usage_spec.rb spec/integration/mailer_spec.rb spec/integration/munin_plugins_rails_spec.rb spec/integration/scout_spec.rb spec/unit/aggregator/database_inserter_spec.rb spec/unit/aggregator/summarizer_spec.rb spec/unit/controller/controller_spec.rb spec/unit/controller/log_processor_spec.rb spec/unit/database/base_class_spec.rb spec/unit/database/connection_spec.rb spec/unit/database/database_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb spec/unit/file_format/apache_format_spec.rb spec/unit/file_format/common_regular_expressions_spec.rb spec/unit/file_format/delayed_job21_format_spec.rb spec/unit/file_format/delayed_job2_format_spec.rb spec/unit/file_format/delayed_job_format_spec.rb spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/format_autodetection_spec.rb spec/unit/file_format/line_definition_spec.rb spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/mysql_format_spec.rb spec/unit/file_format/oink_format_spec.rb spec/unit/file_format/postgresql_format_spec.rb spec/unit/file_format/rack_format_spec.rb spec/unit/file_format/rails3_format_spec.rb spec/unit/file_format/rails_format_spec.rb spec/unit/filter/anonymize_filter_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/filter/filter_spec.rb spec/unit/filter/timespan_filter_spec.rb spec/unit/mailer_spec.rb spec/unit/request_spec.rb spec/unit/source/log_parser_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/unit/tracker/numeric_value_tracker_spec.rb spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/traffic_tracker_spec.rb)
42
+ s.files = %w(.gitignore DESIGN.rdoc Gemfile LICENSE README.rdoc Rakefile bin/request-log-analyzer lib/cli/command_line_arguments.rb lib/cli/database_console.rb lib/cli/database_console_init.rb lib/cli/progressbar.rb lib/cli/tools.rb lib/mixins/gets_memory_protection.rb lib/request_log_analyzer.rb lib/request_log_analyzer/aggregator.rb lib/request_log_analyzer/aggregator/database_inserter.rb lib/request_log_analyzer/aggregator/echo.rb lib/request_log_analyzer/aggregator/summarizer.rb lib/request_log_analyzer/controller.rb lib/request_log_analyzer/database.rb lib/request_log_analyzer/database/base.rb lib/request_log_analyzer/database/connection.rb lib/request_log_analyzer/database/request.rb lib/request_log_analyzer/database/source.rb lib/request_log_analyzer/database/warning.rb lib/request_log_analyzer/file_format.rb lib/request_log_analyzer/file_format/amazon_s3.rb lib/request_log_analyzer/file_format/apache.rb lib/request_log_analyzer/file_format/delayed_job.rb lib/request_log_analyzer/file_format/delayed_job2.rb lib/request_log_analyzer/file_format/delayed_job21.rb lib/request_log_analyzer/file_format/haproxy.rb lib/request_log_analyzer/file_format/merb.rb lib/request_log_analyzer/file_format/mysql.rb lib/request_log_analyzer/file_format/oink.rb lib/request_log_analyzer/file_format/postgresql.rb lib/request_log_analyzer/file_format/rack.rb lib/request_log_analyzer/file_format/rails.rb lib/request_log_analyzer/file_format/rails3.rb lib/request_log_analyzer/file_format/rails_development.rb lib/request_log_analyzer/file_format/w3c.rb lib/request_log_analyzer/filter.rb lib/request_log_analyzer/filter/anonymize.rb lib/request_log_analyzer/filter/field.rb lib/request_log_analyzer/filter/timespan.rb lib/request_log_analyzer/line_definition.rb lib/request_log_analyzer/log_processor.rb lib/request_log_analyzer/mailer.rb lib/request_log_analyzer/output.rb lib/request_log_analyzer/output/fancy_html.rb lib/request_log_analyzer/output/fixed_width.rb lib/request_log_analyzer/output/html.rb lib/request_log_analyzer/request.rb lib/request_log_analyzer/source.rb lib/request_log_analyzer/source/database_loader.rb lib/request_log_analyzer/source/log_parser.rb lib/request_log_analyzer/tracker.rb lib/request_log_analyzer/tracker/duration.rb lib/request_log_analyzer/tracker/frequency.rb lib/request_log_analyzer/tracker/hourly_spread.rb lib/request_log_analyzer/tracker/numeric_value.rb lib/request_log_analyzer/tracker/timespan.rb lib/request_log_analyzer/tracker/traffic.rb request-log-analyzer.gemspec spec/database.yml spec/fixtures/apache_combined.log spec/fixtures/apache_common.log spec/fixtures/decompression.log spec/fixtures/decompression.log.bz2 spec/fixtures/decompression.log.gz spec/fixtures/decompression.log.zip spec/fixtures/decompression.tar.gz spec/fixtures/decompression.tgz spec/fixtures/header_and_footer.log spec/fixtures/merb.log spec/fixtures/merb_prefixed.log spec/fixtures/multiple_files_1.log spec/fixtures/multiple_files_2.log spec/fixtures/mysql_slow_query.log spec/fixtures/oink_22.log spec/fixtures/oink_22_failure.log spec/fixtures/postgresql.log spec/fixtures/rails.db spec/fixtures/rails_1x.log spec/fixtures/rails_22.log spec/fixtures/rails_22_cached.log spec/fixtures/rails_unordered.log spec/fixtures/sinatra.log spec/fixtures/syslog_1x.log spec/fixtures/test_file_format.log spec/fixtures/test_language_combined.log spec/fixtures/test_order.log spec/integration/command_line_usage_spec.rb spec/integration/mailer_spec.rb spec/integration/munin_plugins_rails_spec.rb spec/integration/scout_spec.rb spec/lib/helpers.rb spec/lib/macros.rb spec/lib/matchers.rb spec/lib/mocks.rb spec/lib/testing_format.rb spec/spec_helper.rb spec/unit/aggregator/database_inserter_spec.rb spec/unit/aggregator/summarizer_spec.rb spec/unit/controller/controller_spec.rb spec/unit/controller/log_processor_spec.rb spec/unit/database/base_class_spec.rb spec/unit/database/connection_spec.rb spec/unit/database/database_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb spec/unit/file_format/apache_format_spec.rb spec/unit/file_format/common_regular_expressions_spec.rb spec/unit/file_format/delayed_job21_format_spec.rb spec/unit/file_format/delayed_job2_format_spec.rb spec/unit/file_format/delayed_job_format_spec.rb spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/format_autodetection_spec.rb spec/unit/file_format/haproxy_format_spec.rb spec/unit/file_format/line_definition_spec.rb spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/mysql_format_spec.rb spec/unit/file_format/oink_format_spec.rb spec/unit/file_format/postgresql_format_spec.rb spec/unit/file_format/rack_format_spec.rb spec/unit/file_format/rails3_format_spec.rb spec/unit/file_format/rails_format_spec.rb spec/unit/file_format/w3c_format_spec.rb spec/unit/filter/anonymize_filter_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/filter/filter_spec.rb spec/unit/filter/timespan_filter_spec.rb spec/unit/mailer_spec.rb spec/unit/request_spec.rb spec/unit/source/log_parser_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/unit/tracker/numeric_value_tracker_spec.rb spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/traffic_tracker_spec.rb tasks/github-gem.rake tasks/request_log_analyzer.rake)
43
+ s.test_files = %w(spec/integration/command_line_usage_spec.rb spec/integration/mailer_spec.rb spec/integration/munin_plugins_rails_spec.rb spec/integration/scout_spec.rb spec/unit/aggregator/database_inserter_spec.rb spec/unit/aggregator/summarizer_spec.rb spec/unit/controller/controller_spec.rb spec/unit/controller/log_processor_spec.rb spec/unit/database/base_class_spec.rb spec/unit/database/connection_spec.rb spec/unit/database/database_spec.rb spec/unit/file_format/amazon_s3_format_spec.rb spec/unit/file_format/apache_format_spec.rb spec/unit/file_format/common_regular_expressions_spec.rb spec/unit/file_format/delayed_job21_format_spec.rb spec/unit/file_format/delayed_job2_format_spec.rb spec/unit/file_format/delayed_job_format_spec.rb spec/unit/file_format/file_format_api_spec.rb spec/unit/file_format/format_autodetection_spec.rb spec/unit/file_format/haproxy_format_spec.rb spec/unit/file_format/line_definition_spec.rb spec/unit/file_format/merb_format_spec.rb spec/unit/file_format/mysql_format_spec.rb spec/unit/file_format/oink_format_spec.rb spec/unit/file_format/postgresql_format_spec.rb spec/unit/file_format/rack_format_spec.rb spec/unit/file_format/rails3_format_spec.rb spec/unit/file_format/rails_format_spec.rb spec/unit/file_format/w3c_format_spec.rb spec/unit/filter/anonymize_filter_spec.rb spec/unit/filter/field_filter_spec.rb spec/unit/filter/filter_spec.rb spec/unit/filter/timespan_filter_spec.rb spec/unit/mailer_spec.rb spec/unit/request_spec.rb spec/unit/source/log_parser_spec.rb spec/unit/tracker/duration_tracker_spec.rb spec/unit/tracker/frequency_tracker_spec.rb spec/unit/tracker/hourly_spread_spec.rb spec/unit/tracker/numeric_value_tracker_spec.rb spec/unit/tracker/timespan_tracker_spec.rb spec/unit/tracker/tracker_api_spec.rb spec/unit/tracker/traffic_tracker_spec.rb)
44
44
  end
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,9 @@
1
- $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
2
-
3
1
  require 'rubygems'
2
+ require 'bundler/setup'
3
+
4
4
  require 'rspec'
5
5
  require 'request_log_analyzer'
6
+ require 'stringio'
6
7
 
7
8
  module RequestLogAnalyzer::RSpec
8
9
  end
@@ -28,6 +28,23 @@ describe RequestLogAnalyzer::FileFormat::Apache do
28
28
  @line_definition.captures?(:duration).should be_true
29
29
  end
30
30
  end
31
+
32
+ describe '.access_line_definition' do
33
+ it "should parse values in microseconds when no argument is given to %D" do
34
+ format = RequestLogAnalyzer::FileFormat::Apache.create('%D')
35
+ format.should parse_line('12345').and_capture(:duration => 0.012345)
36
+ end
37
+
38
+ it "should parse values in microseconds when micro is given as argument to %D" do
39
+ format = RequestLogAnalyzer::FileFormat::Apache.create('%{micro}D')
40
+ format.should parse_line('12345').and_capture(:duration => 0.012345)
41
+ end
42
+
43
+ it "should parse values in microseconds when micro is given as argument to %D" do
44
+ format = RequestLogAnalyzer::FileFormat::Apache.create('%{milli}D')
45
+ format.should parse_line('12345').and_capture(:duration => 12.345)
46
+ end
47
+ end
31
48
 
32
49
  describe '.create' do
33
50
 
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe RequestLogAnalyzer::FileFormat::Haproxy do
4
+
5
+ before(:each) do
6
+ @file_format = RequestLogAnalyzer::FileFormat.load(:haproxy)
7
+ @log_parser = RequestLogAnalyzer::Source::LogParser.new(@file_format)
8
+ @sample1 = 'Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1"'
9
+ @sample2 = 'haproxy[18113]: 127.0.0.1:34549 [15/Oct/2003:15:19:06.103] px-http px-http/<NOSRV> -1/-1/-1/-1/+50001 408 +2750 - - cR-- 2/2/2/0/+2 0/0 ""'
10
+ end
11
+
12
+ it "should be a valid file format" do
13
+ @file_format.should be_valid
14
+ end
15
+
16
+ it "should parse access lines and capture all of its fields" do
17
+ @file_format.should have_line_definition(:haproxy).capturing(:client_ip, :accept_date, :frontend_name, :backend_name, :server_name, :tq, :tw, :tc, :tr, :tt, :status_code, :bytes_read, :captured_request_cookie, :captured_response_cookie, :termination_event_code, :terminated_session_state, :clientside_persistence_cookie, :serverside_persistence_cookie, :actconn, :feconn, :beconn, :srv_conn, :retries, :srv_queue, :backend_queue, :captured_request_headers, :captured_response_headers, :http_request)
18
+ end
19
+
20
+ it "should match the sample line" do
21
+ @file_format.parse_line(@sample1).should include(:line_definition, :captures)
22
+ end
23
+
24
+ it "should not match a nonsense line" do
25
+ @file_format.parse_line('dsadasdas dsaadsads dsaadsads').should be_nil
26
+ end
27
+
28
+ it "should parse and convert the sample fields correctly" do
29
+ @log_parser.parse_io(StringIO.new(@sample1)) do |request|
30
+ request[:client_ip].should == '10.0.1.2'
31
+ request[:accept_date].should == 20090206121414
32
+ request[:frontend_name].should == 'http-in'
33
+ request[:backend_name].should == 'static'
34
+ request[:server_name].should == 'srv1'
35
+ request[:tq].should == 0.010
36
+ request[:tw].should == 0.000
37
+ request[:tc].should == 0.030
38
+ request[:tr].should == 0.069
39
+ request[:tt].should == 0.109
40
+ request[:status_code].should == 200
41
+ request[:bytes_read].should == 2750
42
+ request[:captured_request_cookie].should == nil
43
+ request[:captured_response_cookie].should == nil
44
+ request[:termination_event_code].should == nil
45
+ request[:terminated_session_state].should == nil
46
+ request[:clientside_persistence_cookie].should == nil
47
+ request[:serverside_persistence_cookie].should == nil
48
+ request[:actconn].should == 1
49
+ request[:feconn].should == 1
50
+ request[:beconn].should == 1
51
+ request[:srv_conn].should == 1
52
+ request[:retries].should == 0
53
+ request[:srv_queue].should == 0
54
+ request[:backend_queue].should == 0
55
+ request[:captured_request_headers].should == '{1wt.eu}'
56
+ request[:captured_response_headers].should == nil
57
+ request[:http_request].should == 'GET /index.html HTTP/1.1'
58
+ end
59
+ end
60
+
61
+ it "should parse and convert edge case sample fields correctly" do
62
+ @log_parser.parse_io(StringIO.new(@sample2)) do |request|
63
+ request[:accept_date].should == 20031015151906
64
+ request[:server_name].should == '<NOSRV>'
65
+ request[:tq].should == nil
66
+ request[:tw].should == nil
67
+ request[:tc].should == nil
68
+ request[:tr].should == nil
69
+ request[:tt].should == 50.001
70
+ request[:bytes_read].should == 2750
71
+ request[:captured_request_cookie].should == nil
72
+ request[:captured_response_cookie].should == nil
73
+ request[:termination_event_code].should == 'c'
74
+ request[:terminated_session_state].should == 'R'
75
+ request[:clientside_persistence_cookie].should == nil
76
+ request[:serverside_persistence_cookie].should == nil
77
+ request[:retries].should == 2
78
+ request[:captured_request_headers].should == nil
79
+ request[:captured_response_headers].should == nil
80
+ request[:http_request].should == nil
81
+ end
82
+ end
83
+
84
+ end
@@ -2,36 +2,29 @@ require 'spec_helper'
2
2
 
3
3
  describe RequestLogAnalyzer::FileFormat::Postgresql do
4
4
 
5
- it "should be a valid file format" do
6
- RequestLogAnalyzer::FileFormat.load(:Postgresql).should be_valid
7
- end
5
+ subject { RequestLogAnalyzer::FileFormat.load(:Postgresql) }
6
+ let(:log_parser) { RequestLogAnalyzer::Source::LogParser.new(subject) }
7
+
8
+ it { should be_valid }
8
9
 
9
10
  describe '#parse_line' do
10
- before(:each) do
11
- @file_format = RequestLogAnalyzer::FileFormat.load(:Postgresql)
12
- end
13
-
14
11
  it "should parse a :query line correctly" do
15
12
  line = '2010-10-10 13:52:07 GMT [38747]: [33-1] LOG: 00000: duration: 0.710 ms statement: SELECT * FROM "delayed_jobs"'
16
- @file_format.should parse_line(line).as(:query).and_capture(:timestamp => 20101010135207, :query_fragment => 'SELECT * FROM "delayed_jobs"')
13
+ subject.should parse_line(line).as(:query).and_capture(:timestamp => 20101010135207, :query_fragment => 'SELECT * FROM "delayed_jobs"')
17
14
  end
18
15
 
19
16
  it "should parse a :query_fragment line correctly" do
20
17
  line = ' ("failed_at", "locked_by", "created_at", "handler", "updated_at", "priority", "run_at", "attempts", "locked_at",'
21
- @file_format.should parse_line(line).as(:query_fragment).and_capture(:query_fragment => '("failed_at", "locked_by", "created_at", "handler", "updated_at", "priority", "run_at", "attempts", "locked_at",')
18
+ subject.should parse_line(line).as(:query_fragment).and_capture(:query_fragment => '("failed_at", "locked_by", "created_at", "handler", "updated_at", "priority", "run_at", "attempts", "locked_at",')
22
19
  end
23
20
 
24
21
  it "should parse a :query line correctly" do
25
22
  line = '2010-10-10 13:52:07 GMT [38747]: [33-1] LOG: 00000: duration: 0.710 ms statement: SELECT * FROM "delayed_jobs"'
26
- @file_format.should parse_line(line).as(:query).and_capture(:query_time => 0.710)
27
- end
23
+ subject.should parse_line(line).as(:query).and_capture(:query_time => 0.710)
24
+ end
28
25
  end
29
26
 
30
27
  describe '#parse_io' do
31
- before(:each) do
32
- @log_parser = RequestLogAnalyzer::Source::LogParser.new(RequestLogAnalyzer::FileFormat.load(:postgresql))
33
- end
34
-
35
28
  it "should parse a multiline query entry correctly" do
36
29
  fixture = <<-EOS
37
30
  2010-10-10 15:00:02 GMT [38747]: [1669-1] LOG: 00000: duration: 0.195 ms statement: INSERT INTO "delayed_jobs" ("failed_at", "locked_by", "created_at", "handler", "updated_at", "priority", "run_at", "attempts", "locked_at", "last_error") VALUES(NULL, NULL, '2010-10-10 15:00:02.159884', E'--- !ruby/object:RuntheChooChootrain {}
@@ -40,13 +33,11 @@ describe RequestLogAnalyzer::FileFormat::Postgresql do
40
33
  EOS
41
34
 
42
35
  request_counter.should_receive(:hit!).exactly(1).times
43
- @log_parser.should_not_receive(:warn)
44
- @log_parser.parse_io(StringIO.new(fixture)) do |request|
36
+ log_parser.should_not_receive(:warn)
37
+ log_parser.parse_io(StringIO.new(fixture)) do |request|
45
38
  request_counter.hit! if request.kind_of?(RequestLogAnalyzer::FileFormat::Postgresql::Request) && request.completed?
46
39
  request[:query].should == 'INSERT INTO delayed_jobs (failed_at, locked_by, created_at, handler, updated_at, priority, run_at, attempts, locked_at, last_error) VALUES(NULL, NULL, :string, E:string, :string, :int, :string, :int, NULL, NULL) RETURNING id'
47
40
  end
48
41
  end
49
-
50
42
  end
51
43
  end
52
-
@@ -44,9 +44,9 @@ describe RequestLogAnalyzer::FileFormat::Rails do
44
44
  end
45
45
 
46
46
  it "should parse :completed lines correctly" do
47
- line = 'Completed 200 OK in 170ms (Views: 78.4ms | ActiveRecord: 48.2ms)'
47
+ line = 'Completed 200 OK in 170ms (Views: 78.0ms | ActiveRecord: 48.2ms)'
48
48
  @file_format.should parse_line(line).as(:completed).and_capture(
49
- :duration => 0.170, :status => 200)
49
+ :duration => 0.170, :view => 0.078, :db => 0.0482, :status => 200)
50
50
  end
51
51
 
52
52
  it "should parse :completed lines correctly when ActiveRecord is not mentioned" do
@@ -54,6 +54,12 @@ describe RequestLogAnalyzer::FileFormat::Rails do
54
54
  @file_format.should parse_line(line).as(:completed).and_capture(:duration => 0.364, :status => 200)
55
55
  end
56
56
 
57
+ it "should parse :completed lines correctly when other durations are specified" do
58
+ line = 'Completed 200 OK in 384ms (Views: 222.0ms | ActiveRecord: 121.0ms | Sphinx: 0.0ms)'
59
+ @file_format.should parse_line(line).as(:completed).and_capture(:duration => 0.384, :view => 0.222,
60
+ :db => 0.121, :status => 200)
61
+ end
62
+
57
63
 
58
64
  it "should pase :failure lines correctly" do
59
65
  line = "ActionView::Template::Error (undefined local variable or method `field' for #<Class>) on line #3 of /Users/willem/Code/warehouse/app/views/queries/execute.csv.erb:"
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe RequestLogAnalyzer::FileFormat::W3c do
4
+
5
+ before(:each) do
6
+ @file_format = RequestLogAnalyzer::FileFormat.load(:w3c)
7
+ @log_parser = RequestLogAnalyzer::Source::LogParser.new(@file_format)
8
+ # date time c-ip cs-username s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status sc-bytes cs-bytes time-taken cs(User-Agent) cs(Referrer)
9
+ @sample = '2002-05-24 20:18:01 172.224.24.114 - 206.73.118.24 80 GET /Default.htm - 200 7930 248 31 Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+2000+Server) http://64.224.24.114/'
10
+ end
11
+
12
+ it "should be a valid file format" do
13
+ @file_format.should be_valid
14
+ end
15
+
16
+ it "should parse access lines and capture all of its fields" do
17
+ @file_format.should have_line_definition(:access).capturing(:timestamp, :remote_ip, :username, :local_ip, :port, :method, :path, :http_status, :bytes_sent, :bytes_received, :duration, :user_agent, :referer)
18
+ end
19
+
20
+ it "should match the sample line" do
21
+ @file_format.parse_line(@sample).should include(:line_definition, :captures)
22
+ end
23
+
24
+ it "should not match a nonsense line" do
25
+ @file_format.parse_line('#Software: Microsoft Internet Information Services 6.0').should be_nil
26
+ end
27
+
28
+ it "should parse and convert the sample fields correctly" do
29
+ @log_parser.parse_io(StringIO.new(@sample)) do |request|
30
+ request[:timestamp].should == 20020524201801
31
+ request[:remote_ip].should == "172.224.24.114"
32
+ request[:username].should == nil
33
+ request[:local_ip].should == "206.73.118.24"
34
+ request[:port].should == 80
35
+ request[:method].should == 'GET'
36
+ request[:path].should == '/Default.htm'
37
+ request[:http_status].should == 200
38
+ request[:bytes_sent].should == 7930
39
+ request[:bytes_received].should == 248
40
+ request[:duration].should == 0.031
41
+ request[:user_agent].should == 'Mozilla/4.0+(compatible;+MSIE+5.01;+Windows+2000+Server)'
42
+ request[:referer].should == 'http://64.224.24.114/'
43
+ end
44
+ end
45
+
46
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 1
7
- - 9
8
7
  - 10
9
- version: 1.9.10
8
+ - 0
9
+ version: 1.10.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Willem van Bergen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-03 00:00:00 +01:00
18
+ date: 2011-02-26 00:00:00 -05:00
19
19
  default_executable: request-log-analyzer
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -84,6 +84,7 @@ extra_rdoc_files:
84
84
  files:
85
85
  - .gitignore
86
86
  - DESIGN.rdoc
87
+ - Gemfile
87
88
  - LICENSE
88
89
  - README.rdoc
89
90
  - Rakefile
@@ -112,6 +113,7 @@ files:
112
113
  - lib/request_log_analyzer/file_format/delayed_job.rb
113
114
  - lib/request_log_analyzer/file_format/delayed_job2.rb
114
115
  - lib/request_log_analyzer/file_format/delayed_job21.rb
116
+ - lib/request_log_analyzer/file_format/haproxy.rb
115
117
  - lib/request_log_analyzer/file_format/merb.rb
116
118
  - lib/request_log_analyzer/file_format/mysql.rb
117
119
  - lib/request_log_analyzer/file_format/oink.rb
@@ -120,6 +122,7 @@ files:
120
122
  - lib/request_log_analyzer/file_format/rails.rb
121
123
  - lib/request_log_analyzer/file_format/rails3.rb
122
124
  - lib/request_log_analyzer/file_format/rails_development.rb
125
+ - lib/request_log_analyzer/file_format/w3c.rb
123
126
  - lib/request_log_analyzer/filter.rb
124
127
  - lib/request_log_analyzer/filter/anonymize.rb
125
128
  - lib/request_log_analyzer/filter/field.rb
@@ -196,6 +199,7 @@ files:
196
199
  - spec/unit/file_format/delayed_job_format_spec.rb
197
200
  - spec/unit/file_format/file_format_api_spec.rb
198
201
  - spec/unit/file_format/format_autodetection_spec.rb
202
+ - spec/unit/file_format/haproxy_format_spec.rb
199
203
  - spec/unit/file_format/line_definition_spec.rb
200
204
  - spec/unit/file_format/merb_format_spec.rb
201
205
  - spec/unit/file_format/mysql_format_spec.rb
@@ -204,6 +208,7 @@ files:
204
208
  - spec/unit/file_format/rack_format_spec.rb
205
209
  - spec/unit/file_format/rails3_format_spec.rb
206
210
  - spec/unit/file_format/rails_format_spec.rb
211
+ - spec/unit/file_format/w3c_format_spec.rb
207
212
  - spec/unit/filter/anonymize_filter_spec.rb
208
213
  - spec/unit/filter/field_filter_spec.rb
209
214
  - spec/unit/filter/filter_spec.rb
@@ -277,6 +282,7 @@ test_files:
277
282
  - spec/unit/file_format/delayed_job_format_spec.rb
278
283
  - spec/unit/file_format/file_format_api_spec.rb
279
284
  - spec/unit/file_format/format_autodetection_spec.rb
285
+ - spec/unit/file_format/haproxy_format_spec.rb
280
286
  - spec/unit/file_format/line_definition_spec.rb
281
287
  - spec/unit/file_format/merb_format_spec.rb
282
288
  - spec/unit/file_format/mysql_format_spec.rb
@@ -285,6 +291,7 @@ test_files:
285
291
  - spec/unit/file_format/rack_format_spec.rb
286
292
  - spec/unit/file_format/rails3_format_spec.rb
287
293
  - spec/unit/file_format/rails_format_spec.rb
294
+ - spec/unit/file_format/w3c_format_spec.rb
288
295
  - spec/unit/filter/anonymize_filter_spec.rb
289
296
  - spec/unit/filter/field_filter_spec.rb
290
297
  - spec/unit/filter/filter_spec.rb