request-log-analyzer 1.2.1 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/request_log_analyzer/aggregator/database.rb +59 -35
- data/lib/request_log_analyzer/controller.rb +12 -7
- data/lib/request_log_analyzer/line_definition.rb +9 -0
- data/lib/request_log_analyzer/source/log_parser.rb +4 -0
- data/spec/fixtures/header_and_footer.log +6 -0
- data/spec/integration/command_line_usage_spec.rb +0 -2
- data/spec/lib/{helper.rb → helpers.rb} +1 -3
- data/spec/lib/macros.rb +2 -0
- data/spec/lib/matchers.rb +63 -0
- data/spec/lib/testing_format.rb +6 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +13 -4
- data/spec/unit/aggregator/database_spec.rb +208 -0
- data/spec/unit/aggregator/summarizer_spec.rb +0 -2
- data/spec/unit/controller/controller_spec.rb +0 -2
- data/spec/unit/controller/log_processor_spec.rb +0 -2
- data/spec/unit/file_format/file_format_api_spec.rb +50 -71
- data/spec/unit/file_format/line_definition_spec.rb +49 -45
- data/spec/unit/file_format/merb_format_spec.rb +0 -1
- data/spec/unit/file_format/rails_format_spec.rb +0 -2
- data/spec/unit/filter/anonymize_filter_spec.rb +0 -1
- data/spec/unit/filter/field_filter_spec.rb +0 -3
- data/spec/unit/filter/filter_spec.rb +17 -0
- data/spec/unit/filter/timespan_filter_spec.rb +0 -3
- data/spec/unit/source/log_parser_spec.rb +5 -4
- data/spec/unit/source/request_spec.rb +17 -4
- data/spec/unit/tracker/duration_tracker_spec.rb +0 -6
- data/spec/unit/tracker/frequency_tracker_spec.rb +0 -6
- data/spec/unit/tracker/hourly_spread_spec.rb +0 -4
- data/spec/unit/tracker/timespan_tracker_spec.rb +0 -4
- data/spec/unit/tracker/tracker_api_spec.rb +0 -2
- data/tasks/rspec.rake +8 -1
- metadata +12 -6
- data/spec/unit/aggregator/database_inserter_spec.rb +0 -106
@@ -1,8 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Aggregator::Summarizer do
|
4
|
-
|
5
|
-
include RequestLogAnalyzer::Spec::Helper
|
6
4
|
|
7
5
|
before(:each) do
|
8
6
|
@summarizer = RequestLogAnalyzer::Aggregator::Summarizer.new(mock_source, :output => mock_output)
|
@@ -4,8 +4,6 @@ require 'request_log_analyzer/log_processor'
|
|
4
4
|
|
5
5
|
describe RequestLogAnalyzer::LogProcessor, 'stripping log files' do
|
6
6
|
|
7
|
-
include RequestLogAnalyzer::Spec::Helper
|
8
|
-
|
9
7
|
before(:each) do
|
10
8
|
@log_stripper = RequestLogAnalyzer::LogProcessor.new(testing_format, :strip, {})
|
11
9
|
end
|
@@ -1,90 +1,69 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
|
-
describe RequestLogAnalyzer::FileFormat
|
3
|
+
describe RequestLogAnalyzer::FileFormat do
|
4
|
+
|
5
|
+
describe ".format_definition" do
|
4
6
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should specify lines with a hash" do
|
11
|
-
|
12
|
-
@first_file_format.new.should have(0).line_definitions
|
13
|
-
|
14
|
-
@first_file_format.format_definition do |line|
|
15
|
-
line.hash_test :regexp => /test/, :captures => []
|
7
|
+
before(:each) do
|
8
|
+
@first_file_format = Class.new(RequestLogAnalyzer::FileFormat::Base)
|
9
|
+
@second_file_format = Class.new(RequestLogAnalyzer::FileFormat::Base)
|
16
10
|
end
|
17
11
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
it "should specift lines directly" do
|
24
|
-
@first_file_format.new.should have(0).line_definitions
|
25
|
-
|
26
|
-
@first_file_format.format_definition.direct_test do |line|
|
27
|
-
line.regexp = /test/
|
28
|
-
end
|
29
|
-
|
30
|
-
@first_file_format.new.line_definitions[:direct_test].should_not be_nil
|
31
|
-
end
|
12
|
+
it "should specify line definitions directly within the file_format" do
|
13
|
+
@first_file_format.format_definition.direct_test :regexp => /test/
|
14
|
+
@first_file_format.should have_line_definition(:direct_test)
|
15
|
+
end
|
32
16
|
|
33
|
-
|
34
|
-
|
35
|
-
|
17
|
+
it "specify lines with a block for the format definition" do
|
18
|
+
@first_file_format.format_definition do |format|
|
19
|
+
format.block_test :regexp => /test (\w+)/, :captures => [:tester]
|
20
|
+
end
|
21
|
+
|
22
|
+
@first_file_format.should have_line_definition(:block_test).capturing(:tester)
|
23
|
+
end
|
36
24
|
|
37
|
-
|
38
|
-
|
25
|
+
it "should specify a line with a block" do
|
26
|
+
@first_file_format.format_definition.hash_test do |line|
|
39
27
|
line.regexp = /test/
|
40
28
|
line.captures = []
|
41
29
|
end
|
42
|
-
end
|
43
|
-
|
44
|
-
@first_file_format.new.line_definitions[:block_test].should_not be_nil
|
45
|
-
end
|
46
|
-
|
47
|
-
it "should define lines only for itself" do
|
48
30
|
|
49
|
-
|
50
|
-
line.first_test :regexp => /test/, :captures => []
|
31
|
+
@first_file_format.should have_line_definition(:hash_test)
|
51
32
|
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
describe RequestLogAnalyzer::FileFormat, :load do
|
65
|
-
|
66
|
-
include RequestLogAnalyzer::Spec::Helper
|
67
|
-
|
68
|
-
it "should return an instance of a FileFormat class" do
|
69
|
-
@file_format = RequestLogAnalyzer::FileFormat.load(TestingFormat)
|
70
|
-
@file_format.should be_kind_of(TestingFormat)
|
33
|
+
|
34
|
+
it "should define lines only for its own language" do
|
35
|
+
@first_file_format.format_definition.first :regexp => /test 123/
|
36
|
+
@second_file_format.format_definition.second :regexp => /test 456/
|
37
|
+
|
38
|
+
@first_file_format.should have_line_definition(:first)
|
39
|
+
@first_file_format.should_not have_line_definition(:second)
|
40
|
+
@second_file_format.should_not have_line_definition(:first)
|
41
|
+
@second_file_format.should have_line_definition(:second)
|
42
|
+
end
|
71
43
|
end
|
72
44
|
|
45
|
+
describe ".load" do
|
73
46
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
47
|
+
it "should return an instance of a FileFormat class" do
|
48
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(TestingFormat)
|
49
|
+
@file_format.should be_kind_of(TestingFormat)
|
50
|
+
end
|
78
51
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
52
|
+
it "should return itself if it already is a FileFormat::Base instance" do
|
53
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(testing_format)
|
54
|
+
@file_format.should be_kind_of(TestingFormat)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should load a predefined file format from the /file_format dir" do
|
58
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(:rails)
|
59
|
+
@file_format.should be_kind_of(RequestLogAnalyzer::FileFormat::Rails)
|
60
|
+
end
|
83
61
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
62
|
+
it "should load a provided format file" do
|
63
|
+
format_filename = File.dirname(__FILE__) + '/../../lib/testing_format.rb'
|
64
|
+
@file_format = RequestLogAnalyzer::FileFormat.load(format_filename)
|
65
|
+
@file_format.should be_kind_of(TestingFormat)
|
66
|
+
end
|
89
67
|
|
68
|
+
end
|
90
69
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
|
-
describe RequestLogAnalyzer::LineDefinition
|
4
|
-
|
3
|
+
describe RequestLogAnalyzer::LineDefinition do
|
4
|
+
|
5
5
|
before(:each) do
|
6
6
|
@line_definition = RequestLogAnalyzer::LineDefinition.new(:test, {
|
7
7
|
:teaser => /Testing /,
|
@@ -10,55 +10,59 @@ describe RequestLogAnalyzer::LineDefinition, :parsing do
|
|
10
10
|
})
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
(@line_definition =~ "nonmatching").should be_false
|
15
|
-
end
|
16
|
-
|
17
|
-
it "should return false when only the teaser matches" do
|
18
|
-
(@line_definition =~ "Testing LineDefinition").should be_false
|
19
|
-
end
|
13
|
+
describe '#matches' do
|
20
14
|
|
21
|
-
|
22
|
-
|
23
|
-
|
15
|
+
it "should return false on an unmatching line" do
|
16
|
+
@line_definition.should_not parse("nonmatching")
|
17
|
+
end
|
24
18
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
hash[:captures][1].should == "123"
|
29
|
-
end
|
19
|
+
it "should return false when only the teaser matches" do
|
20
|
+
@line_definition.should_not parse("Testing LineDefinition")
|
21
|
+
end
|
30
22
|
|
31
|
-
|
32
|
-
|
23
|
+
it "should parse a line and capture the expected values" do
|
24
|
+
@line_definition.should parse("Testing LineDefinition, tries: 123").capturing('LineDefinition', '123')
|
25
|
+
end
|
33
26
|
end
|
34
|
-
end
|
35
27
|
|
36
|
-
describe
|
28
|
+
describe '#convert_captured_values' do
|
37
29
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
30
|
+
before(:each) do
|
31
|
+
@request = mock('request')
|
32
|
+
@request.stub!(:convert_value).and_return('foo')
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should call convert_value for every captured value" do
|
36
|
+
@request.should_receive(:convert_value).twice
|
37
|
+
@line_definition.convert_captured_values(['test', '123'], @request)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should set the converted values" do
|
41
|
+
@line_definition.convert_captured_values(['test', '123'], @request).should == {:what => 'foo', :tries => 'foo'}
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'when using :provides option' do
|
45
|
+
before(:each) do
|
46
|
+
@ld = RequestLogAnalyzer::LineDefinition.new(:test, :regexp => /Hash\: (\{.+\})/,
|
47
|
+
:captures => [{ :name => :hash, :type => :hash, :provides => {:bar => :string}}])
|
48
|
+
|
49
|
+
@request = mock('request')
|
49
50
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
@request.stub!(:convert_value).with("{:bar=>'baz'}", anything).and_return(:bar => 'baz')
|
52
|
+
@request.stub!(:convert_value).with('baz', anything).and_return('foo')
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should call Request#convert_value for the initial hash and the value in the hash" do
|
56
|
+
@request.should_receive(:convert_value).with("{:bar=>'baz'}", anything).and_return(:bar => 'baz')
|
57
|
+
@request.should_receive(:convert_value).with("baz", anything)
|
58
|
+
@ld.convert_captured_values(["{:bar=>'baz'}"], @request)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should set the provides fields" do
|
62
|
+
# The captures field must be set and converted as well
|
63
|
+
@ld.convert_captured_values(["{:bar=>'baz'}"], @request)[:bar].should eql('foo')
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
54
67
|
end
|
55
|
-
|
56
|
-
it "should merge a hash capture into the line hash" do
|
57
|
-
hash = @file_format.line_definitions[:eval].convert_captured_values(["{ 'greating' => 'hello', 'what' => 'world'}"], @request)
|
58
|
-
hash[:evaluated].should == { :greating => "hello", :what => "world"}
|
59
|
-
hash[:greating].should == 'hello'
|
60
|
-
hash[:what].should == 'world'
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
68
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Source::LogParser, :merb do
|
4
|
-
include RequestLogAnalyzer::Spec::Helper
|
5
4
|
|
6
5
|
before(:each) do
|
7
6
|
@log_parser = RequestLogAnalyzer::Source::LogParser.new(RequestLogAnalyzer::FileFormat.load(:merb))
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Source::LogParser, "Rails" do
|
4
|
-
include RequestLogAnalyzer::Spec::Helper
|
5
4
|
|
6
5
|
before(:each) do
|
7
6
|
@log_parser = RequestLogAnalyzer::Source::LogParser.new(
|
@@ -79,7 +78,6 @@ describe RequestLogAnalyzer::Source::LogParser, "Rails" do
|
|
79
78
|
end
|
80
79
|
|
81
80
|
describe RequestLogAnalyzer::FileFormat::RailsDevelopment, "Rails with development details" do
|
82
|
-
include RequestLogAnalyzer::Spec::Helper
|
83
81
|
|
84
82
|
before(:each) do
|
85
83
|
@file_format = RequestLogAnalyzer::FileFormat.load(:rails_development)
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Filter::Field, 'string in accept mode' do
|
4
|
-
include RequestLogAnalyzer::Spec::Helper
|
5
4
|
|
6
5
|
before(:each) do
|
7
6
|
@filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => 'test', :mode => :select)
|
@@ -25,7 +24,6 @@ describe RequestLogAnalyzer::Filter::Field, 'string in accept mode' do
|
|
25
24
|
end
|
26
25
|
|
27
26
|
describe RequestLogAnalyzer::Filter::Field, 'string in reject mode' do
|
28
|
-
include RequestLogAnalyzer::Spec::Helper
|
29
27
|
|
30
28
|
before(:each) do
|
31
29
|
@filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => 'test', :mode => :reject)
|
@@ -49,7 +47,6 @@ describe RequestLogAnalyzer::Filter::Field, 'string in reject mode' do
|
|
49
47
|
end
|
50
48
|
|
51
49
|
describe RequestLogAnalyzer::Filter::Field, 'regexp in accept mode' do
|
52
|
-
include RequestLogAnalyzer::Spec::Helper
|
53
50
|
|
54
51
|
before(:each) do
|
55
52
|
@filter = RequestLogAnalyzer::Filter::Field.new(testing_format, :field => :test, :value => '/test/', :mode => :select)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
describe RequestLogAnalyzer::Filter::Base, 'base filter' do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@filter = RequestLogAnalyzer::Filter::Base.new(testing_format)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return everything" do
|
10
|
+
@filter.filter(request(:ip => '123.123.123.123'))[:ip].should eql('123.123.123.123')
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should return nil on nil request" do
|
14
|
+
@filter.filter(nil).should be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Filter::Timespan, 'both before and after' do
|
4
|
-
include RequestLogAnalyzer::Spec::Helper
|
5
4
|
|
6
5
|
before(:each) do
|
7
6
|
@filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :after => DateTime.parse('2009-01-01'), :before => DateTime.parse('2009-02-02'))
|
@@ -21,7 +20,6 @@ describe RequestLogAnalyzer::Filter::Timespan, 'both before and after' do
|
|
21
20
|
end
|
22
21
|
|
23
22
|
describe RequestLogAnalyzer::Filter::Timespan, 'only before' do
|
24
|
-
include RequestLogAnalyzer::Spec::Helper
|
25
23
|
|
26
24
|
before(:each) do
|
27
25
|
@filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :before => DateTime.parse('2009-02-02'))
|
@@ -41,7 +39,6 @@ describe RequestLogAnalyzer::Filter::Timespan, 'only before' do
|
|
41
39
|
end
|
42
40
|
|
43
41
|
describe RequestLogAnalyzer::Filter::Timespan, 'only after' do
|
44
|
-
include RequestLogAnalyzer::Spec::Helper
|
45
42
|
|
46
43
|
before(:each) do
|
47
44
|
@filter = RequestLogAnalyzer::Filter::Timespan.new(testing_format, :after => DateTime.parse('2009-01-01'))
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Source::LogParser, :requests do
|
4
|
-
include RequestLogAnalyzer::Spec::Helper
|
5
4
|
|
6
5
|
before(:each) do
|
7
6
|
@log_parser = RequestLogAnalyzer::Source::LogParser.new(testing_format)
|
@@ -42,12 +41,15 @@ describe RequestLogAnalyzer::Source::LogParser, :requests do
|
|
42
41
|
request[:test_capture].should_not be_nil
|
43
42
|
end
|
44
43
|
io.close
|
45
|
-
end
|
44
|
+
end
|
46
45
|
|
46
|
+
it "should parse a request that only consists of one line" do
|
47
|
+
@log_parser.parse_file(log_fixture(:header_and_footer))
|
48
|
+
@log_parser.parsed_requests.should == 2
|
49
|
+
end
|
47
50
|
end
|
48
51
|
|
49
52
|
describe RequestLogAnalyzer::Source::LogParser, :warnings do
|
50
|
-
include RequestLogAnalyzer::Spec::Helper
|
51
53
|
|
52
54
|
before(:each) do
|
53
55
|
@log_parser = RequestLogAnalyzer::Source::LogParser.new(testing_format, :parse_strategy => 'cautious')
|
@@ -67,7 +69,6 @@ describe RequestLogAnalyzer::Source::LogParser, :warnings do
|
|
67
69
|
end
|
68
70
|
|
69
71
|
describe RequestLogAnalyzer::Source::LogParser, :decompression do
|
70
|
-
include RequestLogAnalyzer::Spec::Helper
|
71
72
|
|
72
73
|
before(:each) do
|
73
74
|
@log_parser = RequestLogAnalyzer::Source::LogParser.new(RequestLogAnalyzer::FileFormat::Rails.new)
|
@@ -2,8 +2,6 @@ require File.dirname(__FILE__) + '/../../spec_helper'
|
|
2
2
|
|
3
3
|
describe RequestLogAnalyzer::Request, :incomplete_request do
|
4
4
|
|
5
|
-
include RequestLogAnalyzer::Spec::Helper
|
6
|
-
|
7
5
|
before(:each) do
|
8
6
|
@incomplete_request = testing_format.request
|
9
7
|
@incomplete_request << { :line_type => :test, :lineno => 1, :test_capture => 'awesome!' }
|
@@ -34,8 +32,6 @@ end
|
|
34
32
|
|
35
33
|
describe RequestLogAnalyzer::Request, :completed_request do
|
36
34
|
|
37
|
-
include RequestLogAnalyzer::Spec::Helper
|
38
|
-
|
39
35
|
before(:each) do
|
40
36
|
@completed_request = testing_format.request
|
41
37
|
@completed_request << { :line_type => :first, :lineno => 1, :name => 'first line!' }
|
@@ -69,4 +65,21 @@ describe RequestLogAnalyzer::Request, :completed_request do
|
|
69
65
|
@completed_request.every(:test_capture).should == ['testing', "testing some more"]
|
70
66
|
end
|
71
67
|
|
68
|
+
it "should set the first_lineno for a request to the lowest lineno encountered" do
|
69
|
+
@completed_request.first_lineno.should eql(1)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should set the last_lineno for a request to the highest encountered lineno" do
|
73
|
+
@completed_request.last_lineno.should eql(10)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should not have a timestamp if no such field is captured" do
|
77
|
+
@completed_request.timestamp.should be_nil
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should set return a timestamp field if such a field is captured" do
|
81
|
+
@completed_request << { :line_type => :first, :lineno => 1, :name => 'first line!', :timestamp => Time.now}
|
82
|
+
@completed_request.timestamp.should_not be_nil
|
83
|
+
end
|
84
|
+
|
72
85
|
end
|