request-log-analyzer 1.13.0 → 1.13.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d13886d7138b18ba797c914464ef06cf638b14d
4
- data.tar.gz: 1e9b4a62e67715bcf782a8c5f30fa1740ce93578
3
+ metadata.gz: c24635e41e1a2f3e4c11e6f4814cd9381b0d5073
4
+ data.tar.gz: 0b70d1e886d4a1ca41361023aee81d7d63acb1fa
5
5
  SHA512:
6
- metadata.gz: 910de9082b59c474b65fb4a618280e99e143194fbc2e0689fdca1eebdbc4beece89572924a8bf148a8ecf9d6f455a4fc745ad6fa1f8a43447b4a09cb7f78838e
7
- data.tar.gz: bfa3b1e2e4cef2e005348faf503541aafbf0ce1e0e522a5b6ff192c369dfb032553cba3f0ced93808fb69c044b43fa3723d0d6491b41d31527034babf1b70116
6
+ metadata.gz: 605898a6b50c9e528c3807e92a3fa98effdd7ddbcb85391312e15f30e101612e10f0c6710891b1804d94aa25cc5a99cbd37fd90dcad7da0c91d400e89822b3da
7
+ data.tar.gz: e617b1756392fe884a0355e06281302d32c6899832482e4f750b237dae34e75763e702b1bc500d6a297a25591dabfa1a1859569ed417cab48ef008a37dc74776
data/.travis.yml CHANGED
@@ -10,7 +10,7 @@ rvm:
10
10
  - ruby-head
11
11
  - jruby-19mode
12
12
  - jruby-head
13
- - rbx
13
+ - rbx-2
14
14
  gemfile:
15
15
  - Gemfile.activerecord3
16
16
  - Gemfile.activerecord4
@@ -18,7 +18,7 @@ matrix:
18
18
  allow_failures:
19
19
  - rvm: jruby-head
20
20
  - rvm: ruby-head
21
- - rvm: rbx
21
+ - rvm: rbx-2
22
22
  notifications:
23
23
  email:
24
24
  - info@railsdoctors.com
@@ -36,6 +36,8 @@ begin
36
36
  command_line.option(:file, :alias => :e)
37
37
  command_line.option(:mail, :alias => :m)
38
38
  command_line.option(:mailhost, :default => 'localhost')
39
+ command_line.option(:mailfrom)
40
+ command_line.option(:mailfrom_name)
39
41
  command_line.option(:mailsubject)
40
42
  command_line.option(:parse_strategy, :default => 'assume-correct')
41
43
  command_line.option(:yaml)
@@ -88,6 +90,8 @@ rescue CommandLine::Error => e
88
90
  puts " --file <filename> Redirect output to file."
89
91
  puts " --mail <emailaddress> Send report to an email address."
90
92
  puts " --mailhost <server> Use the given server as the SMTP server for sending email."
93
+ puts " --mailfrom <address> Overwrite default email sender address."
94
+ puts " --mailfrom-name <name> Overwrite default email sender name."
91
95
  puts " --mailsubject <text> Overwrite default mailsubject."
92
96
  puts " --no-progress Hide the progress bar."
93
97
  puts " --output <format> Output format. Supports 'html' and 'fixed_width'."
@@ -109,7 +109,7 @@ module RequestLogAnalyzer::Aggregator
109
109
  output.with_style(:cell_separator => false) do
110
110
  output.table({:width => 20}, {:font => :bold}) do |rows|
111
111
  source.processed_files.each do |f|
112
- rows << ['Processsed File:', f]
112
+ rows << ['Processed File:', f]
113
113
  end
114
114
  rows << ['Parsed lines:', source.parsed_lines]
115
115
  rows << ['Skipped lines:', source.skipped_lines]
@@ -43,6 +43,8 @@ module RequestLogAnalyzer
43
43
  options[:report_sort] = arguments[:report_sort]
44
44
  options[:report_amount] = arguments[:report_amount]
45
45
  options[:mailhost] = arguments[:mailhost]
46
+ options[:mailfrom] = arguments[:mailfrom]
47
+ options[:mailfrom_name] = arguments[:mailfrom_name]
46
48
  options[:mailsubject] = arguments[:mailsubject]
47
49
  options[:silent] = arguments[:silent]
48
50
  options[:parse_strategy] = arguments[:parse_strategy]
@@ -106,6 +108,8 @@ module RequestLogAnalyzer
106
108
  # * <tt>:format</tt> :rails, {:apache => 'FORMATSTRING'}, :merb, :amazon_s3, :mysql or RequestLogAnalyzer::FileFormat class. (Defaults to :rails).
107
109
  # * <tt>:mail</tt> Email the results to this email address.
108
110
  # * <tt>:mailhost</tt> Email the results to this mail server.
111
+ # * <tt>:mailfrom</tt> Set the Email sender address.
112
+ # * <tt>:mailfrom_alias</tt> Set the Email sender name.
109
113
  # * <tt>:mailsubject</tt> Email subject.
110
114
  # * <tt>:no_progress</tt> Do not display the progress bar (increases parsing speed).
111
115
  # * <tt>:output</tt> 'FixedWidth', 'HTML' or RequestLogAnalyzer::Output class. Defaults to 'FixedWidth'.
@@ -165,7 +169,7 @@ module RequestLogAnalyzer
165
169
  output_object = %w[File StringIO].include?(options[:file].class.name) ? options[:file] : File.new(options[:file], "w+")
166
170
  output_args = {:width => 80, :color => false, :characters => :ascii, :sort => output_sort, :amount => output_amount }
167
171
  elsif options[:mail]
168
- output_object = RequestLogAnalyzer::Mailer.new(options[:mail], options[:mailhost], :subject => options[:mailsubject])
172
+ output_object = RequestLogAnalyzer::Mailer.new(options[:mail], options[:mailhost], :subject => options[:mailsubject], :from => options[:mailfrom], :from_alias => options[:mailfrom_name])
169
173
  output_args = {:width => 80, :color => false, :characters => :ascii, :sort => output_sort, :amount => output_amount }
170
174
  else
171
175
  output_object = STDOUT
@@ -15,6 +15,7 @@ module RequestLogAnalyzer::FileFormat
15
15
  autoload :DelayedJob2, 'request_log_analyzer/file_format/delayed_job2'
16
16
  autoload :DelayedJob21, 'request_log_analyzer/file_format/delayed_job21'
17
17
  autoload :DelayedJob3, 'request_log_analyzer/file_format/delayed_job3'
18
+ autoload :DelayedJob4, 'request_log_analyzer/file_format/delayed_job4'
18
19
  autoload :Apache, 'request_log_analyzer/file_format/apache'
19
20
  autoload :AmazonS3, 'request_log_analyzer/file_format/amazon_s3'
20
21
  autoload :W3c, 'request_log_analyzer/file_format/w3c'
@@ -0,0 +1,54 @@
1
+ module RequestLogAnalyzer::FileFormat
2
+
3
+ # The DelayedJob4 file format parsed log files that are created by DelayedJob 4.0 or higher.
4
+ # By default, the log file can be found in RAILS_ROOT/log/delayed_job.log
5
+ class DelayedJob4 < Base
6
+
7
+ extend CommonRegularExpressions
8
+
9
+ line_definition :job_completed do |line|
10
+ line.header = true
11
+ line.footer = true
12
+ line.regexp = /(#{timestamp('%Y-%m-%dT%H:%M:%S%z')}): \[Worker\(\S+ host:(#{hostname_or_ip_address}) pid:(\d+)\)\] Job (.+) \(id=\d+\) COMPLETED after (\d+\.\d+)/
13
+ line.capture(:timestamp).as(:timestamp)
14
+ line.capture(:host)
15
+ line.capture(:pid).as(:integer)
16
+ line.capture(:job)
17
+ line.capture(:duration).as(:duration, :unit => :sec)
18
+ end
19
+
20
+ line_definition :job_failed do |line|
21
+ line.header = true
22
+ line.footer = true
23
+ line.regexp = /(#{timestamp('%Y-%m-%dT%H:%M:%S%z')}): \[Worker\(\S+ host:(#{hostname_or_ip_address}) pid:(\d+)\)\] Job (.+) FAILED \((\d+) prior attempts\) with (.+)/
24
+ line.capture(:timestamp).as(:timestamp)
25
+ line.capture(:host)
26
+ line.capture(:pid).as(:integer)
27
+ line.capture(:job)
28
+ line.capture(:attempts).as(:integer)
29
+ line.capture(:error)
30
+ end
31
+
32
+ line_definition :job_deleted do |line|
33
+ line.header = true
34
+ line.footer = true
35
+ line.regexp = /(#{timestamp('%Y-%m-%dT%H:%M:%S%z')}): \[Worker\(\S+ host:(#{hostname_or_ip_address}) pid:(\d+)\)\] Job (.+) REMOVED permanently because of (\d+) consecutive failures/
36
+ line.capture(:timestamp).as(:timestamp)
37
+ line.capture(:host)
38
+ line.capture(:pid).as(:integer)
39
+ line.capture(:job)
40
+ line.capture(:failures).as(:integer)
41
+ end
42
+
43
+
44
+ report do |analyze|
45
+ analyze.timespan
46
+ analyze.hourly_spread
47
+
48
+ analyze.frequency :job, :line_type => :job_completed, :title => "Completed jobs"
49
+ analyze.frequency :job, :category => lambda { |r| "#{r[:job]} #{r[:error]}" }, :line_type => :job_failed, :title => "Failed jobs"
50
+ analyze.frequency :failures, :category => :job, :line_type => :job_deleted, :title => "Deleted jobs"
51
+ analyze.duration :duration, :category => :job, :line_type => :job_completed, :title => "Job duration"
52
+ end
53
+ end
54
+ end
@@ -38,8 +38,7 @@ module RequestLogAnalyzer
38
38
  # Converts :eval field, which should evaluate to a hash.
39
39
  def convert_eval(value, capture_definition)
40
40
  eval(sanitize_parameters(value)).inject({}) { |h, (k, v)| h[k.to_sym] = v; h}
41
- # Wide range of errors possible with wild eval. ATM we choose to crash on this.
42
- rescue SyntaxError
41
+ rescue
43
42
  nil
44
43
  end
45
44
 
@@ -1,3 +1,3 @@
1
1
  module RequestLogAnalyzer
2
- VERSION = "1.13.0"
2
+ VERSION = "1.13.1"
3
3
  end
@@ -52,6 +52,36 @@ describe RequestLogAnalyzer, 'running mailer integration' do
52
52
  find_string_in_file("Subject: TESTSUBJECT", @log_file).should_not be_nil
53
53
  end
54
54
 
55
+ it "should allow a custom mail sender address" do
56
+ RequestLogAnalyzer::Controller.build(
57
+ :mail => 'root@localhost',
58
+ :mailhost => 'localhost:2525',
59
+ :mailfrom => 'customaddr@example.com',
60
+ :source_files => log_fixture(:rails_1x),
61
+ :format => RequestLogAnalyzer::FileFormat::Rails,
62
+ :no_progress => true
63
+ ).run!
64
+
65
+ Process.wait # Wait for mailer to complete
66
+
67
+ find_string_in_file("From: Request-log-analyzer reporter <customaddr@example.com>", @log_file).should_not be_nil
68
+ end
69
+
70
+ it "should allow a custom mail sender name" do
71
+ RequestLogAnalyzer::Controller.build(
72
+ :mail => 'root@localhost',
73
+ :mailhost => 'localhost:2525',
74
+ :mailfrom_name => 'Custom Name',
75
+ :source_files => log_fixture(:rails_1x),
76
+ :format => RequestLogAnalyzer::FileFormat::Rails,
77
+ :no_progress => true
78
+ ).run!
79
+
80
+ Process.wait # Wait for mailer to complete
81
+
82
+ find_string_in_file("From: Custom Name <contact@railsdoctors.com>", @log_file).should_not be_nil
83
+ end
84
+
55
85
  it "should send html mail" do
56
86
  RequestLogAnalyzer::Controller.build(
57
87
  :output => 'HTML',
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe RequestLogAnalyzer::FileFormat::DelayedJob do
4
+
5
+ subject { RequestLogAnalyzer::FileFormat.load(:delayed_job4) }
6
+
7
+ it { should be_well_formed }
8
+ it { should have_line_definition(:job_completed).capturing(:timestamp, :duration, :host, :pid, :job) }
9
+ it { should have_line_definition(:job_failed).capturing(:timestamp, :host, :pid, :job, :attempts, :error) }
10
+ it { should have_line_definition(:job_deleted).capturing(:timestamp, :host, :pid, :job, :failures) }
11
+ it { should have(6).report_trackers }
12
+
13
+
14
+ describe '#parse_line' do
15
+
16
+ let(:job_completed_sample) { '2010-05-17T17:37:35+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob.create (id=534785) COMPLETED after 1.0676' }
17
+ let(:job_failed_sample) { '2010-05-17T17:37:35+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob.create (id=534785) FAILED (0 prior attempts) with SocketError: getaddrinfo: Name or service not known' }
18
+ let(:job_deleted_sample) { '2010-05-17T17:37:35+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob.create (id=534785) REMOVED permanently because of 25 consecutive failures' }
19
+
20
+ it { should parse_line(job_completed_sample).as(:job_completed).and_capture(
21
+ :timestamp => 20100517173735, :duration => 1.0676, :host => 'hostname.co.uk', :pid => 11888, :job => 'S3FileJob.create') }
22
+
23
+ it { should parse_line(job_failed_sample).as(:job_failed).and_capture(
24
+ :timestamp => 20100517173735, :host => 'hostname.co.uk', :pid => 11888, :job => 'S3FileJob.create (id=534785)', :attempts => 0, :error => "SocketError: getaddrinfo: Name or service not known") }
25
+
26
+ it { should parse_line(job_deleted_sample).as(:job_deleted).and_capture(
27
+ :timestamp => 20100517173735, :host => 'hostname.co.uk', :pid => 11888, :job => 'S3FileJob.create (id=534785)', :failures => 25) }
28
+
29
+ it { should_not parse_line('nonsense', 'a nonsense line') }
30
+ end
31
+
32
+
33
+ describe '#parse_io' do
34
+ let(:log_parser) { RequestLogAnalyzer::Source::LogParser.new(subject) }
35
+
36
+ it "should parse a batch of completed jobs without warnings" do
37
+ fragment = log_snippet(<<-EOLOG)
38
+ 2010-05-17T17:36:44+0000: *** Starting job worker delayed_job host:hostname.co.uk pid:11888
39
+ 2010-05-17T17:37:35+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob (id=534785) COMPLETED after 1.0676
40
+ 2010-05-17T17:37:37+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob (id=534788) COMPLETED after 1.4407
41
+ 2010-05-17T17:37:44+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob (id=534789) COMPLETED after 6.9374
42
+ 2010-05-17T17:37:44+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] 3 jobs processed at 0.3163 j/s, 0 failed
43
+ 2010-05-17T17:37:35+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob.create (id=534786) FAILED (25 prior attempts) with SocketError: getaddrinfo: Name or service not known
44
+ 2010-05-17T17:37:35+0000: [Worker(delayed_job host:hostname.co.uk pid:11888)] Job S3FileJob.create (id=534799) REMOVED permanently because of 25 consecutive failures
45
+ 2010-05-19T11:47:26+0000: Exiting...
46
+ EOLOG
47
+
48
+ log_parser.should_receive(:handle_request).exactly(5).times
49
+ log_parser.parse_io(fragment)
50
+ end
51
+ end
52
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: request-log-analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.13.0
4
+ version: 1.13.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Willem van Bergen
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-11 00:00:00.000000000 Z
12
+ date: 2014-10-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -148,6 +148,7 @@ files:
148
148
  - lib/request_log_analyzer/file_format/delayed_job2.rb
149
149
  - lib/request_log_analyzer/file_format/delayed_job21.rb
150
150
  - lib/request_log_analyzer/file_format/delayed_job3.rb
151
+ - lib/request_log_analyzer/file_format/delayed_job4.rb
151
152
  - lib/request_log_analyzer/file_format/haproxy.rb
152
153
  - lib/request_log_analyzer/file_format/merb.rb
153
154
  - lib/request_log_analyzer/file_format/mysql.rb
@@ -235,6 +236,7 @@ files:
235
236
  - spec/unit/file_format/delayed_job21_format_spec.rb
236
237
  - spec/unit/file_format/delayed_job2_format_spec.rb
237
238
  - spec/unit/file_format/delayed_job3_format_spec.rb
239
+ - spec/unit/file_format/delayed_job4_format_spec.rb
238
240
  - spec/unit/file_format/delayed_job_format_spec.rb
239
241
  - spec/unit/file_format/file_format_api_spec.rb
240
242
  - spec/unit/file_format/format_autodetection_spec.rb
@@ -291,7 +293,7 @@ requirements:
291
293
  - To use the database inserter, ActiveRecord and an appropriate database adapter are
292
294
  required.
293
295
  rubyforge_project: r-l-a
294
- rubygems_version: 2.0.3
296
+ rubygems_version: 2.0.14
295
297
  signing_key:
296
298
  specification_version: 4
297
299
  summary: A command line tool to analyze request logs for Apache, Rails, Merb, MySQL
@@ -351,6 +353,7 @@ test_files:
351
353
  - spec/unit/file_format/delayed_job21_format_spec.rb
352
354
  - spec/unit/file_format/delayed_job2_format_spec.rb
353
355
  - spec/unit/file_format/delayed_job3_format_spec.rb
356
+ - spec/unit/file_format/delayed_job4_format_spec.rb
354
357
  - spec/unit/file_format/delayed_job_format_spec.rb
355
358
  - spec/unit/file_format/file_format_api_spec.rb
356
359
  - spec/unit/file_format/format_autodetection_spec.rb
@@ -378,4 +381,3 @@ test_files:
378
381
  - spec/unit/tracker/timespan_tracker_spec.rb
379
382
  - spec/unit/tracker/tracker_api_spec.rb
380
383
  - spec/unit/tracker/traffic_tracker_spec.rb
381
- has_rdoc: