log-analyzer 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/log-analyzer/1 +12 -0
- data/lib/log-analyzer/analyze.rb +4 -6
- data/lib/log-analyzer/config.rb +1 -1
- data/lib/log-analyzer/pattern.rb +8 -2
- data/lib/log-analyzer/rails/inspector.rb +64 -0
- data/lib/log-analyzer/rails/tasks.rake +3 -2
- data/lib/log-analyzer/router.rb +23 -1
- data/lib/log-analyzer/routes.rb +12 -3
- data/lib/log-analyzer/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd574288f31cafa46f022f902045c6d82f100822
|
4
|
+
data.tar.gz: 675f2bcbbd6f6443e4ac27ccb8ed2a397c9b1cc4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8981741bedf7ac47c1861b8648d2e647e09cd24219439c3d7913922f5d0bc2c0152c771e6b9e041e2573b0aebd0081a7376e7649ea2273e2c6739bdd1274e94
|
7
|
+
data.tar.gz: 28e60e495707d4f39eb33c1e726cefda2dcd0e725a0daad2c529f6251d3e6509a1b134d2a3791c1f87f45aa3cd85256e11739cf53abb504927332b8e6cffcd4b
|
data/lib/log-analyzer/1
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
module Log::Analyzer
|
2
|
+
class Config
|
3
|
+
attr_accessor :log_regexp, :route_regexp, :log_separator
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@route_regexp = /(GET|POST|DELETE|PATCH|PUT)\s*([^\s]*)\s*([^\s]*)\s*(\{.*\})?\s*(\[.*\])/i
|
7
|
+
#@route_regexp = /(GET|POST|DELETE|PATCH|PUT)\s+([^\s]*)\s/i
|
8
|
+
@log_regexp = /Started (?<request_method>GET|POST|DELETE|PATCH|PUT) "(?<path_info>[^"]+)".*in (?<response_time>[0-9]+)ms/im
|
9
|
+
@log_separator = "\n\n\n"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
data/lib/log-analyzer/analyze.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Log::Analyzer
|
2
2
|
class Analyze
|
3
3
|
def initialize(files, routes_text)
|
4
|
-
@files =
|
4
|
+
@files = Dir.glob(files).select { |f| File.file?(f) }
|
5
5
|
@routes = Routes.new(routes_text)
|
6
6
|
create_endpoints
|
7
7
|
end
|
@@ -23,14 +23,12 @@ module Log::Analyzer
|
|
23
23
|
@files.each do |file|
|
24
24
|
log = Log.new(file)
|
25
25
|
log.each_line do |req|
|
26
|
-
|
27
|
-
next
|
26
|
+
route = router.serve(req)
|
27
|
+
next if route.nil?
|
28
28
|
|
29
|
-
req.env.delete_if { |key, val| ["REQUEST_METHOD", "PATH_INFO"].include?(key) }
|
30
|
-
_, _, route = matche.first
|
29
|
+
req.env.delete_if { |key, val| ["REQUEST_METHOD", "PATH_INFO", "SCRIPT_NAME", "action_dispatch.request.path_parameters"].include?(key) }
|
31
30
|
endpoint = Endpoint.find_by(method: route.path.request_method, uri_pattern: route.path.uri_pattern)
|
32
31
|
endpoint.count += 1
|
33
|
-
|
34
32
|
req.env.each do |key, val|
|
35
33
|
endpoint[key.downcase] << val.to_i
|
36
34
|
end
|
data/lib/log-analyzer/config.rb
CHANGED
@@ -3,7 +3,7 @@ module Log::Analyzer
|
|
3
3
|
attr_accessor :log_regexp, :route_regexp, :log_separator
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
@route_regexp = /(GET|POST|DELETE|PATCH|PUT)\s
|
6
|
+
@route_regexp = /(GET|POST|DELETE|PATCH|PUT)\s*([^\s]*)\s*[^\s]*\s*(\{.*\})?\s*(\[.*\])?/i
|
7
7
|
@log_regexp = /Started (?<request_method>GET|POST|DELETE|PATCH|PUT) "(?<path_info>[^"]+)".*in (?<response_time>[0-9]+)ms/im
|
8
8
|
@log_separator = "\n\n\n"
|
9
9
|
end
|
data/lib/log-analyzer/pattern.rb
CHANGED
@@ -2,8 +2,14 @@ module Log::Analyzer
|
|
2
2
|
class Pattern < ActionDispatch::Journey::Path::Pattern
|
3
3
|
attr_accessor :request_method, :uri_pattern
|
4
4
|
|
5
|
-
def self.from_string(request_method, uri_pattern)
|
6
|
-
|
5
|
+
def self.from_string(request_method, uri_pattern, requirements)
|
6
|
+
requirements = if requirements.nil? || requirements.empty?
|
7
|
+
{}
|
8
|
+
else
|
9
|
+
eval(requirements)
|
10
|
+
end
|
11
|
+
requirements ||= {}
|
12
|
+
new(ActionDispatch::Journey::Router::Strexp.build(uri_pattern, requirements, ["/.?"], true), request_method, uri_pattern)
|
7
13
|
end
|
8
14
|
|
9
15
|
def initialize(strexp, request_method, uri_pattern)
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Log::Analyzer::Rails
|
2
|
+
class RoutesInspector < ::ActionDispatch::Routing::RoutesInspector
|
3
|
+
private
|
4
|
+
def collect_routes(routes)
|
5
|
+
routes.collect do |route|
|
6
|
+
::ActionDispatch::Routing::RouteWrapper.new(route)
|
7
|
+
end.reject do |route|
|
8
|
+
route.internal?
|
9
|
+
end.collect do |route|
|
10
|
+
collect_engine_routes(route)
|
11
|
+
constraints = collect_constraints(route)
|
12
|
+
|
13
|
+
{ name: route.name,
|
14
|
+
verb: route.verb,
|
15
|
+
path: route.path,
|
16
|
+
reqs: route.reqs,
|
17
|
+
regexp: route.json_regexp,
|
18
|
+
constraints: constraints }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def collect_constraints(route)
|
23
|
+
return [] unless route.app.respond_to?(:constraints)
|
24
|
+
|
25
|
+
route.app.constraints.collect do |constraint|
|
26
|
+
case
|
27
|
+
when constraint.respond_to?(:matches?)
|
28
|
+
constraint.class
|
29
|
+
when constraint.respond_to?(:call)
|
30
|
+
constraint.source.match(/constraints: (.*)/) do |md|
|
31
|
+
md[1]
|
32
|
+
end
|
33
|
+
else
|
34
|
+
nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class ConsoleFormatter < ::ActionDispatch::Routing::ConsoleFormatter
|
41
|
+
private
|
42
|
+
def draw_section(routes)
|
43
|
+
header_lengths = ['Prefix', 'Verb', 'URI Pattern', 'Controller#Action'].map(&:length)
|
44
|
+
name_width, verb_width, path_width, reqs_width = widths(routes).zip(header_lengths).map(&:max)
|
45
|
+
|
46
|
+
routes.map do |r|
|
47
|
+
"#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs].ljust(reqs_width)} #{r[:constraints]}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def draw_header(routes)
|
52
|
+
name_width, verb_width, path_width, reqs_width = widths(routes)
|
53
|
+
|
54
|
+
"#{"Prefix".rjust(name_width)} #{"Verb".ljust(verb_width)} #{"URI Pattern".ljust(path_width)} #{"Controller#Action".ljust(reqs_width)} Constraints"
|
55
|
+
end
|
56
|
+
|
57
|
+
def widths(routes)
|
58
|
+
[routes.map { |r| r[:name].length }.max || 0,
|
59
|
+
routes.map { |r| r[:verb].length }.max || 0,
|
60
|
+
routes.map { |r| r[:path].length }.max || 0,
|
61
|
+
routes.map { |r| r[:reqs].length }.max || 0]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
namespace :log_analyzer do
|
2
2
|
desc 'Analyze the endpoint from the log'
|
3
3
|
task analyze: :environment do
|
4
|
+
require 'log-analyzer/rails/inspector'
|
4
5
|
require 'log-analyzer/cli'
|
5
6
|
|
6
7
|
all_routes = Rails.application.routes.routes
|
7
|
-
inspector =
|
8
|
-
routing_text = inspector.format(
|
8
|
+
inspector = Log::Analyzer::Rails::RoutesInspector.new(all_routes)
|
9
|
+
routing_text = inspector.format(Log::Analyzer::Rails::ConsoleFormatter.new, ENV['CONTROLLER'])
|
9
10
|
analyze = Log::Analyzer::Analyze.new(Rails.root.join("log/#{Rails.env}.log"), routing_text)
|
10
11
|
Log::Analyzer::CLI::Report.new(analyze.sort).run
|
11
12
|
end
|
data/lib/log-analyzer/router.rb
CHANGED
@@ -1,7 +1,29 @@
|
|
1
1
|
module Log::Analyzer
|
2
2
|
class Router < ActionDispatch::Journey::Router
|
3
3
|
def serve(req)
|
4
|
-
find_routes(req)
|
4
|
+
find_routes(req).each do |match, parameters, route|
|
5
|
+
set_params = req.path_parameters
|
6
|
+
path_info = req.path_info
|
7
|
+
script_name = req.script_name
|
8
|
+
|
9
|
+
unless route.path.anchored
|
10
|
+
req.script_name = (script_name.to_s + match.to_s).chomp('/')
|
11
|
+
req.path_info = match.post_match
|
12
|
+
req.path_info = "/" + req.path_info unless req.path_info.start_with? "/"
|
13
|
+
end
|
14
|
+
|
15
|
+
req.path_parameters = set_params.merge parameters
|
16
|
+
unless route.app.matches?(req)
|
17
|
+
req.script_name = script_name
|
18
|
+
req.path_info = path_info
|
19
|
+
req.path_parameters = set_params
|
20
|
+
next
|
21
|
+
end
|
22
|
+
|
23
|
+
return route
|
24
|
+
end
|
25
|
+
|
26
|
+
nil
|
5
27
|
end
|
6
28
|
end
|
7
29
|
end
|
data/lib/log-analyzer/routes.rb
CHANGED
@@ -5,9 +5,18 @@ module Log::Analyzer
|
|
5
5
|
class Routes < ActionDispatch::Journey::Routes
|
6
6
|
def initialize(routes_text)
|
7
7
|
super()
|
8
|
-
routes_text.scan(regexp) do |request_method, request_path|
|
9
|
-
|
10
|
-
|
8
|
+
routes_text.scan(regexp) do |request_method, request_path, requirements, constraints|
|
9
|
+
constraints = if constraints.nil? || constraints.empty?
|
10
|
+
[]
|
11
|
+
else
|
12
|
+
eval(constraints)
|
13
|
+
end.map do |constraint|
|
14
|
+
constraint.is_a?(String) ? eval(constraint) : constraint
|
15
|
+
end
|
16
|
+
app = ActionDispatch::Routing::Mapper::Constraints.new(nil, constraints, true)
|
17
|
+
|
18
|
+
path_pattern = Pattern.from_string(request_method, request_path, requirements)
|
19
|
+
add_route(app, path_pattern, {request_method: /^#{request_method}$/}, {}, {})
|
11
20
|
end
|
12
21
|
end
|
13
22
|
|
data/lib/log-analyzer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: log-analyzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- shiro16
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|
@@ -142,6 +142,7 @@ files:
|
|
142
142
|
- bin/setup
|
143
143
|
- exe/log-analyzer
|
144
144
|
- lib/log-analyzer.rb
|
145
|
+
- lib/log-analyzer/1
|
145
146
|
- lib/log-analyzer/analyze.rb
|
146
147
|
- lib/log-analyzer/cli.rb
|
147
148
|
- lib/log-analyzer/command/log-analyzer.rb
|
@@ -149,6 +150,7 @@ files:
|
|
149
150
|
- lib/log-analyzer/endpoint.rb
|
150
151
|
- lib/log-analyzer/log.rb
|
151
152
|
- lib/log-analyzer/pattern.rb
|
153
|
+
- lib/log-analyzer/rails/inspector.rb
|
152
154
|
- lib/log-analyzer/rails/railtie.rb
|
153
155
|
- lib/log-analyzer/rails/tasks.rake
|
154
156
|
- lib/log-analyzer/router.rb
|
@@ -175,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
177
|
version: '0'
|
176
178
|
requirements: []
|
177
179
|
rubyforge_project:
|
178
|
-
rubygems_version: 2.4.5
|
180
|
+
rubygems_version: 2.4.5
|
179
181
|
signing_key:
|
180
182
|
specification_version: 4
|
181
183
|
summary: Analyze the performance of each endpoint from the routing file
|