request-log-analyzer 1.13.0 → 1.13.1

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.
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: