log_parser_notifier 0.0.5 → 0.0.6
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 +4 -4
- data/bin/log_parser_notifier +2 -3
- data/lib/log_parser_notifier/rails_request_notifier.rb +36 -2
- data/lib/log_parser_notifier/version.rb +1 -1
- data/log_parser_notifier.gemspec +1 -0
- data/spec/rails_request_notifier_spec.rb +57 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/support/rails_log_requests.rb +11 -0
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25e36655772d7de5a40f8243990da5d7c29e12a7
|
4
|
+
data.tar.gz: a5c8fb09ca8fd942526cb5a257ce62362bf34b67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc09fc1488a2bd4b266f5c60df9fa34d7a1412dbbb94e92e7e1e6aa6fff26de29522b90acd385acc601804860c225bfff2e793c03032b315074a64328323bd80
|
7
|
+
data.tar.gz: cf332ab19457b39caea0a5e79d3092fd28531c13e43d18a48d60f629ce4135f9ae2660de76e92783978f1ff16d61f17fa573325b7ff5c29de9cce799c2e593c5
|
data/bin/log_parser_notifier
CHANGED
@@ -9,6 +9,7 @@ end
|
|
9
9
|
opts = Slop.parse! do |o|
|
10
10
|
o.banner = 'usage: lib_parser_notifier [options] file_name'
|
11
11
|
o.on :c, :check_interval=, 'check interval (in minutes)', default: 5, as: Integer
|
12
|
+
o.on :t, :slow_request_threshold=, 'How long does a request need to create an event? (in ms)', default: 500, as: Integer
|
12
13
|
o.on :verbose, 'enable verbose mode'
|
13
14
|
# o.integer '--check_interval', 'check interval (in minutes)', default: 5
|
14
15
|
# o.bool '-v', '--verbose', 'enable verbose mode'
|
@@ -32,9 +33,7 @@ end
|
|
32
33
|
|
33
34
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'log_parser_notifier')
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
request_notifier = LogParserNotifier::RailsRequestNotifier.new(ARGV.first)
|
36
|
+
request_notifier = LogParserNotifier::RailsRequestNotifier.new(ARGV.first, opts[:slow_request_threshold])
|
38
37
|
|
39
38
|
while true
|
40
39
|
LogParserNotifier.logger.debug('waking up and checking log')
|
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'statsd'
|
2
|
+
require 'time'
|
2
3
|
|
3
4
|
module LogParserNotifier
|
4
5
|
class RailsRequestNotifier
|
5
|
-
def initialize(log_file)
|
6
|
+
def initialize(log_file, slow_request_threshold = 500)
|
6
7
|
@log_reader = LogReader.new log_file
|
8
|
+
@slow_request_threshold = slow_request_threshold
|
9
|
+
puts @slow_request_threshold
|
7
10
|
end
|
8
11
|
|
9
12
|
def parser
|
@@ -20,13 +23,44 @@ module LogParserNotifier
|
|
20
23
|
|
21
24
|
LogParserNotifier.logger.debug("processing request for #{request[:controller]}##{request[:action]} with status: #{request[:status]} it is complete: #{request.completed?}")
|
22
25
|
if request.completed? && request[:status] >= 200 && request[:status] < 400
|
23
|
-
|
24
26
|
statsd.increment 'rails.requests', tags: tags
|
25
27
|
statsd.timing 'rails.load_time', request[:duration] * 1000, tags: tags
|
28
|
+
|
29
|
+
if request[:duration] * 1000 >= @slow_request_threshold
|
30
|
+
log = request.lines.collect { |line_hash| RailsRequestNotifier.render_line(line_hash) }.join("\n")
|
31
|
+
statsd.event(
|
32
|
+
"#{request[:controller]}##{request[:action]} #{request[:method]} slow request #{request[:duration]} sec",
|
33
|
+
log,
|
34
|
+
{
|
35
|
+
date_happened: Time.parse(request[:timestamp].to_s).to_i,
|
36
|
+
aggregation_key: 'slow_request_rails',
|
37
|
+
source_type_name: 'rails_log',
|
38
|
+
alert_type: 'warning',
|
39
|
+
tags: tags
|
40
|
+
}
|
41
|
+
)
|
42
|
+
end
|
26
43
|
else
|
27
44
|
statsd.increment 'rails.failed_requests', tags: tags
|
28
45
|
end
|
29
46
|
end
|
30
47
|
end
|
48
|
+
|
49
|
+
def self.render_line(line_hash)
|
50
|
+
case line_hash[:line_type]
|
51
|
+
when :started
|
52
|
+
%Q(Started #{line_hash[:method]} "#{line_hash[:path]}" for #{line_hash[:ip]} at #{Time.parse(line_hash[:timestamp].to_s)})
|
53
|
+
when :processing
|
54
|
+
%Q(Processing by #{line_hash[:controller]}##{line_hash[:action]} as #{line_hash[:format]})
|
55
|
+
when :parameters
|
56
|
+
%Q(Parameters: #{line_hash[:params].inspect})
|
57
|
+
when :rendered
|
58
|
+
" Rendered #{line_hash[:rendered_file]} (#{line_hash[:partial_duration]}ms)"
|
59
|
+
when :completed
|
60
|
+
"Completed #{line_hash[:status]} OK in #{(line_hash[:duration] * 1000).to_i}ms (Views: #{line_hash[:view] * 1000}ms | ActiveRecord: #{line_hash[:db] * 1000}ms)"
|
61
|
+
else
|
62
|
+
line_hash.inspect
|
63
|
+
end
|
64
|
+
end
|
31
65
|
end
|
32
66
|
end
|
data/log_parser_notifier.gemspec
CHANGED
@@ -8,10 +8,9 @@ module LogParserNotifier
|
|
8
8
|
RailsRequestNotifier.new(@logs)
|
9
9
|
end
|
10
10
|
|
11
|
-
after { rails_request_notifier.parse_and_trigger_notifications }
|
12
|
-
|
13
11
|
describe 'successful requests' do
|
14
12
|
before { @logs = RailsLogRequests.normal_request_1 }
|
13
|
+
after { rails_request_notifier.parse_and_trigger_notifications }
|
15
14
|
|
16
15
|
it 'should record the number of successful requests' do
|
17
16
|
expect_any_instance_of(Statsd).to receive(:increment).with('rails.requests', tags: %w(controller:DashboardController action:show con_act:DashboardController#show))
|
@@ -24,10 +23,31 @@ module LogParserNotifier
|
|
24
23
|
it 'should not record the number of failed requests' do
|
25
24
|
expect_any_instance_of(Statsd).to_not receive(:increment).with('rails.failed_requests', anything)
|
26
25
|
end
|
26
|
+
|
27
|
+
it 'should not create an event for short requests' do
|
28
|
+
expect_any_instance_of(Statsd).to_not receive('event')
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'slow requests' do
|
32
|
+
before { @logs = RailsLogRequests.slow_request }
|
33
|
+
|
34
|
+
it 'should create an event for the slow requests' do
|
35
|
+
expect_any_instance_of(Statsd).to receive('event').with(
|
36
|
+
'DocumentsController#new GET slow request 0.8 sec',
|
37
|
+
"Started GET \"/documents/new?template_id=30000&state=AK\" for 123.193.169.96 at 2015-09-17 03:19:58 +0800\nProcessing by DocumentsController#new as HTML\nParameters: {:template_id=>\"30000\", :state=>\"AK\"}\n Rendered documents/_preview.html.erb (0.0ms)\n Rendered shared/_contact_number.erb (0.0ms)\n Rendered shared/_disclaimer.html.erb (0.001ms)\nCompleted 200 OK in 800ms (Views: 34.0ms | ActiveRecord: 4.0ms)",
|
38
|
+
date_happened: 1442431198,
|
39
|
+
aggregation_key: 'slow_request_rails',
|
40
|
+
source_type_name: 'rails_log',
|
41
|
+
alert_type: 'warning',
|
42
|
+
tags: %w(controller:DocumentsController action:new con_act:DocumentsController#new)
|
43
|
+
)
|
44
|
+
end
|
45
|
+
end
|
27
46
|
end
|
28
47
|
|
29
48
|
describe 'failed request' do
|
30
49
|
before { @logs = RailsLogRequests.failed_request }
|
50
|
+
after { rails_request_notifier.parse_and_trigger_notifications }
|
31
51
|
|
32
52
|
it 'should record the number of failed requests' do
|
33
53
|
expect_any_instance_of(Statsd).to receive(:increment).with('rails.failed_requests', tags: %w(controller:DocumentsController action:preview con_act:DocumentsController#preview))
|
@@ -47,6 +67,41 @@ module LogParserNotifier
|
|
47
67
|
@logs = RailsLogRequests.partial_request
|
48
68
|
expect_any_instance_of(Statsd).to_not receive(:increment).with('rails.requests', tags: %w(controller:DashboardController action:index con_act:DashboardController#index))
|
49
69
|
expect_any_instance_of(Statsd).to_not receive(:timing).with('rails.load_time', anything, tags: %w(controller:DashboardController action:index con_act:DashboardController#index))
|
70
|
+
|
71
|
+
rails_request_notifier.parse_and_trigger_notifications
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe '.render_line' do
|
76
|
+
subject do
|
77
|
+
RailsRequestNotifier.render_line @line_hash
|
78
|
+
end
|
79
|
+
it 'should render start line' do
|
80
|
+
@line_hash = { method: 'GET', path: '/documents/new?template_id=30000&state=AK', ip: '123.193.169.96', timestamp: 20_150_917_031_958, line_type: :started, lineno: 1, source: nil, compound: [] }
|
81
|
+
expect(subject).to eq 'Started GET "/documents/new?template_id=30000&state=AK" for 123.193.169.96 at 2015-09-17 03:19:58 +0800'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should render the process line' do
|
85
|
+
@line_hash = { controller: 'DocumentsController', action: 'new', format: 'HTML', line_type: :processing, lineno: 2, source: nil, compound: [] }
|
86
|
+
expect(subject).to eq 'Processing by DocumentsController#new as HTML'
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should render the params line' do
|
90
|
+
@line_hash = { params: { template_id: '30000', state: 'AK' }, line_type: :parameters, lineno: 3, source: nil, compound: [] }
|
91
|
+
|
92
|
+
expect(subject).to eq 'Parameters: {:template_id=>"30000", :state=>"AK"}'
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should render the render line' do
|
96
|
+
@line_hash = { rendered_file: 'documents/_preview.html.erb', partial_duration: 0.0, line_type: :rendered, lineno: 4, source: nil, compound: [:partial_duration] }
|
97
|
+
|
98
|
+
expect(subject).to eq ' Rendered documents/_preview.html.erb (0.0ms)'
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should render the completed line' do
|
102
|
+
@line_hash = { status: 200, duration: 0.8, view: 0.034, db: 0.004, line_type: :completed, lineno: 7, source: nil, compound: [] }
|
103
|
+
|
104
|
+
expect(subject).to eq 'Completed 200 OK in 800ms (Views: 34.0ms | ActiveRecord: 4.0ms)'
|
50
105
|
end
|
51
106
|
end
|
52
107
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -19,6 +19,17 @@ I, [2015-08-24T07:36:43.695000 #19020] INFO -- : Completed 200 OK in 91ms (View
|
|
19
19
|
)
|
20
20
|
end
|
21
21
|
|
22
|
+
def self.slow_request
|
23
|
+
StringIO.new %Q(I, [2015-09-17T03:19:58.989000 #12393] INFO -- : Started GET "/documents/new?template_id=30000&state=AK" for 123.193.169.96 at 2015-09-17 03:19:58 +0000
|
24
|
+
I, [2015-09-17T03:19:58.994000 #12393] INFO -- : Processing by DocumentsController#new as HTML
|
25
|
+
I, [2015-09-17T03:19:58.994000 #12393] INFO -- : Parameters: {"template_id"=>"30000", "state"=>"AK"}
|
26
|
+
I, [2015-08-24T07:36:43.688000 #19020] INFO -- : Rendered documents/_preview.html.erb (0.0ms)
|
27
|
+
I, [2015-08-24T07:36:43.692000 #19020] INFO -- : Rendered shared/_contact_number.erb (0.0ms)
|
28
|
+
I, [2015-08-24T07:36:43.694000 #19020] INFO -- : Rendered shared/_disclaimer.html.erb (1.0ms)
|
29
|
+
I, [2015-08-24T07:36:43.695000 #19020] INFO -- : Completed 200 OK in 800ms (Views: 34.0ms | ActiveRecord: 4.0ms)
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
22
33
|
def self.failed_request
|
23
34
|
StringIO.new %Q(I, [2015-08-24T07:35:11.541000 #19020] INFO -- : Started GET "/documents/9293/preview/?page=0" for 50.31.29.217 at 2015-08-24 07:35:11 +0000
|
24
35
|
I, [2015-08-24T07:35:11.549000 #19020] INFO -- : Processing by DocumentsController#preview as JSON
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: log_parser_notifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Josh Moore
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 3.3.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: pry
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: Write a longer description. Optional.
|
98
112
|
email:
|
99
113
|
- joshsmoore@gmail.com
|