log_parser_notifier 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- 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
|