ngmoco-request-log-analyzer 1.4.2
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 +10 -0
- data/DESIGN.rdoc +41 -0
- data/LICENSE +20 -0
- data/README.rdoc +39 -0
- data/Rakefile +8 -0
- data/bin/request-log-analyzer +114 -0
- data/lib/cli/command_line_arguments.rb +301 -0
- data/lib/cli/database_console.rb +26 -0
- data/lib/cli/database_console_init.rb +43 -0
- data/lib/cli/progressbar.rb +213 -0
- data/lib/cli/tools.rb +46 -0
- data/lib/request_log_analyzer.rb +44 -0
- data/lib/request_log_analyzer/aggregator.rb +49 -0
- data/lib/request_log_analyzer/aggregator/database_inserter.rb +83 -0
- data/lib/request_log_analyzer/aggregator/echo.rb +29 -0
- data/lib/request_log_analyzer/aggregator/summarizer.rb +175 -0
- data/lib/request_log_analyzer/controller.rb +332 -0
- data/lib/request_log_analyzer/database.rb +102 -0
- data/lib/request_log_analyzer/database/base.rb +115 -0
- data/lib/request_log_analyzer/database/connection.rb +38 -0
- data/lib/request_log_analyzer/database/request.rb +22 -0
- data/lib/request_log_analyzer/database/source.rb +13 -0
- data/lib/request_log_analyzer/database/warning.rb +14 -0
- data/lib/request_log_analyzer/file_format.rb +160 -0
- data/lib/request_log_analyzer/file_format/amazon_s3.rb +71 -0
- data/lib/request_log_analyzer/file_format/apache.rb +141 -0
- data/lib/request_log_analyzer/file_format/merb.rb +67 -0
- data/lib/request_log_analyzer/file_format/rack.rb +11 -0
- data/lib/request_log_analyzer/file_format/rails.rb +176 -0
- data/lib/request_log_analyzer/file_format/rails_development.rb +12 -0
- data/lib/request_log_analyzer/filter.rb +30 -0
- data/lib/request_log_analyzer/filter/anonymize.rb +39 -0
- data/lib/request_log_analyzer/filter/field.rb +42 -0
- data/lib/request_log_analyzer/filter/timespan.rb +45 -0
- data/lib/request_log_analyzer/line_definition.rb +111 -0
- data/lib/request_log_analyzer/log_processor.rb +99 -0
- data/lib/request_log_analyzer/mailer.rb +62 -0
- data/lib/request_log_analyzer/output.rb +113 -0
- data/lib/request_log_analyzer/output/fixed_width.rb +220 -0
- data/lib/request_log_analyzer/output/html.rb +184 -0
- data/lib/request_log_analyzer/request.rb +175 -0
- data/lib/request_log_analyzer/source.rb +72 -0
- data/lib/request_log_analyzer/source/database_loader.rb +87 -0
- data/lib/request_log_analyzer/source/log_parser.rb +274 -0
- data/lib/request_log_analyzer/tracker.rb +206 -0
- data/lib/request_log_analyzer/tracker/duration.rb +104 -0
- data/lib/request_log_analyzer/tracker/frequency.rb +95 -0
- data/lib/request_log_analyzer/tracker/hourly_spread.rb +107 -0
- data/lib/request_log_analyzer/tracker/timespan.rb +81 -0
- data/lib/request_log_analyzer/tracker/traffic.rb +106 -0
- data/request-log-analyzer.gemspec +40 -0
- data/spec/database.yml +23 -0
- data/spec/fixtures/apache_combined.log +5 -0
- data/spec/fixtures/apache_common.log +10 -0
- data/spec/fixtures/decompression.log +12 -0
- data/spec/fixtures/decompression.log.bz2 +0 -0
- data/spec/fixtures/decompression.log.gz +0 -0
- data/spec/fixtures/decompression.log.zip +0 -0
- data/spec/fixtures/decompression.tar.gz +0 -0
- data/spec/fixtures/decompression.tgz +0 -0
- data/spec/fixtures/header_and_footer.log +6 -0
- data/spec/fixtures/merb.log +84 -0
- data/spec/fixtures/merb_prefixed.log +9 -0
- data/spec/fixtures/multiple_files_1.log +5 -0
- data/spec/fixtures/multiple_files_2.log +2 -0
- data/spec/fixtures/rails.db +0 -0
- data/spec/fixtures/rails_1x.log +59 -0
- data/spec/fixtures/rails_22.log +12 -0
- data/spec/fixtures/rails_22_cached.log +10 -0
- data/spec/fixtures/rails_unordered.log +24 -0
- data/spec/fixtures/syslog_1x.log +5 -0
- data/spec/fixtures/test_file_format.log +13 -0
- data/spec/fixtures/test_language_combined.log +14 -0
- data/spec/fixtures/test_order.log +16 -0
- data/spec/integration/command_line_usage_spec.rb +84 -0
- data/spec/integration/munin_plugins_rails_spec.rb +58 -0
- data/spec/integration/scout_spec.rb +151 -0
- data/spec/lib/helpers.rb +52 -0
- data/spec/lib/macros.rb +18 -0
- data/spec/lib/matchers.rb +77 -0
- data/spec/lib/mocks.rb +76 -0
- data/spec/lib/testing_format.rb +46 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/unit/aggregator/database_inserter_spec.rb +93 -0
- data/spec/unit/aggregator/summarizer_spec.rb +26 -0
- data/spec/unit/controller/controller_spec.rb +41 -0
- data/spec/unit/controller/log_processor_spec.rb +18 -0
- data/spec/unit/database/base_class_spec.rb +183 -0
- data/spec/unit/database/connection_spec.rb +34 -0
- data/spec/unit/database/database_spec.rb +133 -0
- data/spec/unit/file_format/amazon_s3_format_spec.rb +49 -0
- data/spec/unit/file_format/apache_format_spec.rb +203 -0
- data/spec/unit/file_format/file_format_api_spec.rb +69 -0
- data/spec/unit/file_format/line_definition_spec.rb +75 -0
- data/spec/unit/file_format/merb_format_spec.rb +52 -0
- data/spec/unit/file_format/rails_format_spec.rb +164 -0
- data/spec/unit/filter/anonymize_filter_spec.rb +21 -0
- data/spec/unit/filter/field_filter_spec.rb +66 -0
- data/spec/unit/filter/filter_spec.rb +17 -0
- data/spec/unit/filter/timespan_filter_spec.rb +58 -0
- data/spec/unit/mailer_spec.rb +30 -0
- data/spec/unit/request_spec.rb +111 -0
- data/spec/unit/source/log_parser_spec.rb +119 -0
- data/spec/unit/tracker/duration_tracker_spec.rb +130 -0
- data/spec/unit/tracker/frequency_tracker_spec.rb +88 -0
- data/spec/unit/tracker/hourly_spread_spec.rb +79 -0
- data/spec/unit/tracker/timespan_tracker_spec.rb +73 -0
- data/spec/unit/tracker/tracker_api_spec.rb +124 -0
- data/spec/unit/tracker/traffic_tracker_spec.rb +107 -0
- data/tasks/github-gem.rake +323 -0
- data/tasks/request_log_analyzer.rake +26 -0
- metadata +220 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Processing PageController#demo (for 127.0.0.1 at 2008-12-10 16:28:09) [GET]
|
|
2
|
+
Parameters: {"action"=>"demo", "controller"=>"page"}
|
|
3
|
+
Logging in from session data...
|
|
4
|
+
Logged in as test@example.com
|
|
5
|
+
Using locale: en-US, http-accept: ["en-US"], session: , det browser: en-US, det domain:
|
|
6
|
+
Rendering template within layouts/demo
|
|
7
|
+
Rendering page/demo
|
|
8
|
+
Rendered shared/_analytics (0.2ms)
|
|
9
|
+
Rendered layouts/_actions (0.6ms)
|
|
10
|
+
Rendered layouts/_menu (2.2ms)
|
|
11
|
+
Rendered layouts/_tabbar (0.5ms)
|
|
12
|
+
Completed in 614ms (View: 120, DB: 31) | 200 OK [http://www.example.com/demo]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Processing CachedController#cached (for 1.1.1.1 at 2008-12-24 07:36:53) [GET]
|
|
2
|
+
Parameters: {"action"=>"cached", "controller"=>"cached"}
|
|
3
|
+
Logging in from session data...
|
|
4
|
+
Logging in using cookie...
|
|
5
|
+
Using locale: zh-Hans, http-accept: ["zh-CN", "zh-HK", "zh-TW", "en-US"], session: , det browser: zh-Hans, det domain: , user pref locale:
|
|
6
|
+
Referer: http://www.example.com/referer
|
|
7
|
+
Cached fragment hit: views/zh-Hans-www-cached-cached-all-CN--- (0.0ms)
|
|
8
|
+
Filter chain halted as [#<ActionController::Caching::Actions::ActionCacheFilter:0x2a999ad620 @check=nil, @options={:store_options=>{}, :layout=>nil, :cache_path=>#<Proc:0x0000002a999b8890@/app/controllers/cached_controller.rb:8>}>] rendered_or_redirected.
|
|
9
|
+
Filter chain halted as [#<ActionController::Filters::AroundFilter:0x2a999ad120 @identifier=nil, @kind=:filter, @options={:only=>#<Set: {"cached"}>, :if=>:not_logged_in?, :unless=>nil}, @method=#<ActionController::Caching::Actions::ActionCacheFilter:0x2a999ad620 @check=nil, @options={:store_options=>{}, :layout=>nil, :cache_path=>#<Proc:0x0000002a999b8890@/app/controllers/cached_controller.rb:8>}>>] did_not_yield.
|
|
10
|
+
Completed in 3ms (View: 0, DB: 0) | 200 OK [http://www.example.com/cached/cached/]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Processing AccountController#dashboard (for 1.1.1.1 at 2008-12-24 07:36:49) [GET]
|
|
2
|
+
Parameters: {"action"=>"dashboard", "controller"=>"account", "first_use"=>"true"}
|
|
3
|
+
Logging in from session data...
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Processing ProjectsController#new (for 1.1.1.1 at 2008-12-24 07:36:49) [GET]
|
|
7
|
+
Parameters: {"action"=>"new", "controller"=>"projects"}
|
|
8
|
+
Rendering template within layouts/default
|
|
9
|
+
Rendering account/dashboard
|
|
10
|
+
Logging in from session data...
|
|
11
|
+
Logging in using cookie...
|
|
12
|
+
Using locale: en-US, http-accept: [], session: , det browser: , det domain: , user pref locale:
|
|
13
|
+
Rendered shared/_maintenance (0.6ms)
|
|
14
|
+
Rendering template within layouts/templates/general_default/index.html.erb
|
|
15
|
+
Rendered projects/_recent_designs (4.3ms)
|
|
16
|
+
Rendered projects/_project (13.6ms)
|
|
17
|
+
Rendered projects/_projects (18.7ms)
|
|
18
|
+
Rendered layouts/_menu (1.4ms)
|
|
19
|
+
Completed in 36ms (View: 30, DB: 3) | 200 OK [http://www.example.com/projects/new]
|
|
20
|
+
Rendered layouts/_actions (0.3ms)
|
|
21
|
+
Rendered layouts/_menu (1.6ms)
|
|
22
|
+
Rendered layouts/_tabbar (1.9ms)
|
|
23
|
+
Rendered layouts/_footer (3.2ms)
|
|
24
|
+
Completed in 50ms (View: 41, DB: 4) | 200 OK [http://www.example.com/dashboard?first_use=true]
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
Jul 13 06:25:58 10.1.1.32 app_p [1957]: Processing EmployeeController#index (for 10.1.1.33 at 2008-07-13 06:25:58) [GET]
|
|
2
|
+
Jul 13 06:25:58 10.1.1.32 app_p [1957]: Session ID: bd1810833653be11c38ad1e5675635bd
|
|
3
|
+
Jul 13 06:25:58 10.1.1.32 app_p [1957]: Parameters: {"format"=>"xml", "action"=>"index}
|
|
4
|
+
Jul 13 06:25:58 10.1.1.32 app_p [1957]: Rendering employees
|
|
5
|
+
Jul 13 06:25:58 10.1.1.32 app_p [1957]: Completed in 0.21665 (4 reqs/sec) | Rendering: 0.00926 (4%) | DB: 0.00000 (0%) | 200 OK [http://example.com/employee.xml]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe RequestLogAnalyzer, 'running from command line' do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
cleanup_temp_files!
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
after(:each) do
|
|
10
|
+
cleanup_temp_files!
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should find 4 requests in default mode" do
|
|
14
|
+
output = run("#{log_fixture(:rails_1x)}")
|
|
15
|
+
output.any? { |line| /^Parsed requests\:\s*4\s/ =~ line }.should be_true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should find 2 requests when parsing a compressed file" do
|
|
19
|
+
output = run("#{log_fixture(:decompression, :tgz)}")
|
|
20
|
+
output.any? { |line| /^Parsed requests\:\s*2\s/ =~ line }.should be_true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
it "should skip 1 requests with a --select option" do
|
|
25
|
+
output = run("#{log_fixture(:rails_1x)} --select controller PeopleController")
|
|
26
|
+
output.any? { |line| /^Skipped requests\:\s*1\s/ =~ line }.should be_true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should skip 3 requests with a --reject option" do
|
|
30
|
+
output = run("#{log_fixture(:rails_1x)} --reject controller PeopleController")
|
|
31
|
+
output.any? { |line| /^Skipped requests\:\s*3\s/ =~ line }.should be_true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should write output to a file with the --file option" do
|
|
35
|
+
run("#{log_fixture(:rails_1x)} --file #{temp_output_file(:report)}")
|
|
36
|
+
File.exist?(temp_output_file(:report)).should be_true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should write only ASCII characters to a file with the --file option" do
|
|
40
|
+
run("#{log_fixture(:rails_1x)} --file #{temp_output_file(:report)}")
|
|
41
|
+
/^[\x00-\x7F]*$/.match(File.read(temp_output_file(:report))).should_not be_nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should write HTML if --output HTML is provided" do
|
|
45
|
+
output = run("#{log_fixture(:rails_1x)} --output HTML")
|
|
46
|
+
output.any? { |line| /<html[^>]*>/ =~ line}.should be_true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should run with the --database option" do
|
|
50
|
+
run("#{log_fixture(:rails_1x)} --database #{temp_output_file(:database)}")
|
|
51
|
+
File.exist?(temp_output_file(:database)).should be_true
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should use no colors in the report with the --boring option" do
|
|
55
|
+
output = run("#{log_fixture(:rails_1x)} --boring")
|
|
56
|
+
output.any? { |line| /\e/ =~ line }.should be_false
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should use only ASCII characters in the report with the --boring option" do
|
|
60
|
+
output = run("#{log_fixture(:rails_1x)} --boring")
|
|
61
|
+
output.all? { |line| /^[\x00-\x7F]*$/ =~ line }.should be_true
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should parse a Merb file if --format merb is set" do
|
|
65
|
+
output = run("#{log_fixture(:merb)} --format merb")
|
|
66
|
+
output.any? { |line| /Parsed requests\:\s*11/ =~ line }.should be_true
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should parse a Apache access log file if --apache-format is set" do
|
|
70
|
+
output = run("#{log_fixture(:apache_combined)} --apache-format combined")
|
|
71
|
+
output.any? { |line| /Parsed requests\:\s*5/ =~ line }.should be_true
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should dump the results to a YAML file" do
|
|
75
|
+
run("#{log_fixture(:rails_1x)} --dump #{temp_output_file(:yaml)}")
|
|
76
|
+
File.exist?(temp_output_file(:yaml)).should be_true
|
|
77
|
+
YAML::load(File.read(temp_output_file(:yaml))).should have_at_least(1).item
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should parse 4 requests from the standard input" do
|
|
81
|
+
output = run("- < #{log_fixture(:rails_1x)}")
|
|
82
|
+
output.any? { |line| /^Parsed requests\:\s*4\s/ =~ line }.should be_true
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe RequestLogAnalyzer, 'when harvesting like munin-plugins-rails the YAML output' do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
cleanup_temp_files!
|
|
7
|
+
run("#{log_fixture(:rails_1x)} --dump #{temp_output_file(:yaml)}")
|
|
8
|
+
@rla = YAML::load(File.read(temp_output_file(:yaml)))
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
after(:each) do
|
|
12
|
+
cleanup_temp_files!
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should contain database times" do
|
|
16
|
+
@rla["Database time"].each do |item|
|
|
17
|
+
item[1][:min].should_not be_nil
|
|
18
|
+
item[1][:max].should_not be_nil
|
|
19
|
+
item[1][:hits].should_not be_nil
|
|
20
|
+
item[1][:sum].should_not be_nil
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should contain request times" do
|
|
25
|
+
@rla["Request duration"].each do |item|
|
|
26
|
+
item[1][:min].should_not be_nil
|
|
27
|
+
item[1][:max].should_not be_nil
|
|
28
|
+
item[1][:hits].should_not be_nil
|
|
29
|
+
item[1][:sum].should_not be_nil
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it "should contain failed requests" do
|
|
34
|
+
@rla.keys.should include("Failed requests")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should contain Process blockers" do
|
|
38
|
+
@rla.keys.should include("Process blockers (> 1 sec duration)")
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should contain HTTP Methods" do
|
|
42
|
+
@rla["HTTP methods"]["GET"].should_not be_nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should contain HTTP Methods" do
|
|
46
|
+
@rla["HTTP methods"]["GET"].should_not be_nil
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should contain view rendering times" do
|
|
50
|
+
@rla["View rendering time"].each do |item|
|
|
51
|
+
item[1][:min].should_not be_nil
|
|
52
|
+
item[1][:max].should_not be_nil
|
|
53
|
+
item[1][:hits].should_not be_nil
|
|
54
|
+
item[1][:sum].should_not be_nil
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
def capture_stdout_and_stderr_with_warnings_on
|
|
4
|
+
$stdout, $stderr, warnings, $VERBOSE =
|
|
5
|
+
StringIO.new, StringIO.new, $VERBOSE, true
|
|
6
|
+
yield
|
|
7
|
+
return $stdout.string, $stderr.string
|
|
8
|
+
ensure
|
|
9
|
+
$stdout, $stderr, $VERBOSE = STDOUT, STDERR, warnings
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
describe RequestLogAnalyzer, 'when using the rla API like the scout plugin' do
|
|
13
|
+
|
|
14
|
+
before(:each) do
|
|
15
|
+
# prepare a place to capture the output
|
|
16
|
+
sio = StringIO.new
|
|
17
|
+
|
|
18
|
+
# place an IO object where I want RequestLogAnalyzer to read from
|
|
19
|
+
open(log_fixture(:rails_1x)) do |log|
|
|
20
|
+
completed_count = 0
|
|
21
|
+
log.each do |line|
|
|
22
|
+
completed_count += 1 if line =~ /\ACompleted\b/
|
|
23
|
+
break if completed_count == 2 # skipping first two requests
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# trigger the log parse
|
|
27
|
+
@stdout, @stderr = capture_stdout_and_stderr_with_warnings_on do
|
|
28
|
+
RequestLogAnalyzer::Controller.build(
|
|
29
|
+
:output => EmbeddedHTML,
|
|
30
|
+
:file => sio,
|
|
31
|
+
:after => Time.local(2008, 8, 14, 21, 16, 31), # after 3rd req
|
|
32
|
+
:source_files => log
|
|
33
|
+
).run!
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# read the resulting output
|
|
38
|
+
@analysis = sio.string
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should generate an analysis" do
|
|
42
|
+
@analysis.should_not be_empty
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should generate customized output using the passed Class" do
|
|
46
|
+
credit = %r{<p>Powered by request-log-analyzer v\d+(?:\.\d+)+</p>\z}
|
|
47
|
+
@analysis.should match(credit)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should skip requests before :after Time" do
|
|
51
|
+
@analysis.should_not include("PeopleController#show")
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should include requests after IO#pos and :after Time" do
|
|
55
|
+
@analysis.should include("PeopleController#picture")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should skip requests before IO#pos" do
|
|
59
|
+
@analysis.should_not include("PeopleController#index")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should not print to $stdout" do
|
|
63
|
+
@stdout.should be_empty
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should not print to $stderr (with warnings on)" do
|
|
67
|
+
@stderr.should be_empty
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Helpers
|
|
73
|
+
class EmbeddedHTML < RequestLogAnalyzer::Output::Base
|
|
74
|
+
def print(str)
|
|
75
|
+
@io << str
|
|
76
|
+
end
|
|
77
|
+
alias_method :<<, :print
|
|
78
|
+
|
|
79
|
+
def puts(str = "")
|
|
80
|
+
@io << "#{str}<br/>\n"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def title(title)
|
|
84
|
+
@io.puts(tag(:h2, title))
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def line(*font)
|
|
88
|
+
@io.puts(tag(:hr))
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def link(text, url = nil)
|
|
92
|
+
url = text if url.nil?
|
|
93
|
+
tag(:a, text, :href => url)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def table(*columns, &block)
|
|
97
|
+
rows = Array.new
|
|
98
|
+
yield(rows)
|
|
99
|
+
|
|
100
|
+
@io << tag(:table, :cellspacing => 0) do |content|
|
|
101
|
+
if table_has_header?(columns)
|
|
102
|
+
content << tag(:tr) do
|
|
103
|
+
columns.map { |col| tag(:th, col[:title]) }.join("\n")
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
odd = false
|
|
108
|
+
rows.each do |row|
|
|
109
|
+
odd = !odd
|
|
110
|
+
content << tag(:tr) do
|
|
111
|
+
if odd
|
|
112
|
+
row.map { |cell| tag(:td, cell, :class => "alt") }.join("\n")
|
|
113
|
+
else
|
|
114
|
+
row.map { |cell| tag(:td, cell) }.join("\n")
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def header
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def footer
|
|
125
|
+
@io << tag(:hr) << tag(:p, "Powered by request-log-analyzer v#{RequestLogAnalyzer::VERSION}")
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
private
|
|
129
|
+
|
|
130
|
+
def tag(tag, content = nil, attributes = nil)
|
|
131
|
+
if block_given?
|
|
132
|
+
attributes = content.nil? ? "" : " " + content.map { |(key, value)| "#{key}=\"#{value}\"" }.join(" ")
|
|
133
|
+
content_string = ""
|
|
134
|
+
content = yield(content_string)
|
|
135
|
+
content = content_string unless content_string.empty?
|
|
136
|
+
"<#{tag}#{attributes}>#{content}</#{tag}>"
|
|
137
|
+
else
|
|
138
|
+
attributes = attributes.nil? ? "" : " " + attributes.map { |(key, value)| "#{key}=\"#{value}\"" }.join(" ")
|
|
139
|
+
if content.nil?
|
|
140
|
+
"<#{tag}#{attributes} />"
|
|
141
|
+
else
|
|
142
|
+
if content.class == Float
|
|
143
|
+
"<#{tag}#{attributes}><div class='color_bar' style=\"width:#{(content*200).floor}px;\"/></#{tag}>"
|
|
144
|
+
else
|
|
145
|
+
"<#{tag}#{attributes}>#{content}</#{tag}>"
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
data/spec/lib/helpers.rb
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
module RequestLogAnalyzer::Spec::Helpers
|
|
2
|
+
|
|
3
|
+
# Create or return a new TestingFormat
|
|
4
|
+
def testing_format
|
|
5
|
+
@testing_format ||= TestingFormat.create
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Load a log file from the fixture folder
|
|
9
|
+
def log_fixture(name, extention = "log")
|
|
10
|
+
File.dirname(__FILE__) + "/../fixtures/#{name}.#{extention}"
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Creates a log file given some lines
|
|
14
|
+
def log_stream(*lines)
|
|
15
|
+
StringIO.new(lines.join("\n") + "\n")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Request loopback
|
|
19
|
+
def request(fields, format = testing_format)
|
|
20
|
+
if fields.kind_of?(Array)
|
|
21
|
+
format.request(*fields)
|
|
22
|
+
else
|
|
23
|
+
format.request(fields)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Run a specific command
|
|
28
|
+
# Used to call request-log-analyzer through binary
|
|
29
|
+
def run(arguments)
|
|
30
|
+
binary = "#{File.dirname(__FILE__)}/../../bin/request-log-analyzer"
|
|
31
|
+
arguments = arguments.join(' ') if arguments.kind_of?(Array)
|
|
32
|
+
|
|
33
|
+
output = []
|
|
34
|
+
IO.popen("#{binary} #{arguments}") do |pipe|
|
|
35
|
+
output = pipe.readlines
|
|
36
|
+
end
|
|
37
|
+
$?.exitstatus.should == 0
|
|
38
|
+
output
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Cleanup all temporary files generated by specs
|
|
42
|
+
def cleanup_temp_files!
|
|
43
|
+
Dir["#{File.dirname(__FILE__)}/../../tmp/spec.*tmp"].each do |file|
|
|
44
|
+
File.unlink(file)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Return a filename that can be used as temporary file in specs
|
|
49
|
+
def temp_output_file(file_type)
|
|
50
|
+
"#{File.dirname(__FILE__)}/../../tmp/spec.#{file_type}.tmp"
|
|
51
|
+
end
|
|
52
|
+
end
|