rack-mini-profiler 1.0.2 → 3.1.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 +4 -4
- data/CHANGELOG.md +145 -21
- data/README.md +201 -94
- data/lib/enable_rails_patches.rb +5 -0
- data/lib/generators/rack_mini_profiler/USAGE +9 -0
- data/lib/generators/rack_mini_profiler/install_generator.rb +13 -0
- data/lib/generators/{rack_profiler/templates/rack_profiler.rb → rack_mini_profiler/templates/rack_mini_profiler.rb} +1 -1
- data/lib/generators/rack_profiler/install_generator.rb +6 -3
- data/lib/html/dot.1.1.2.min.js +2 -0
- data/lib/html/includes.css +144 -45
- data/lib/html/includes.js +1420 -1009
- data/lib/html/includes.scss +538 -441
- data/lib/html/includes.tmpl +231 -148
- data/lib/html/pretty-print.js +810 -0
- data/lib/html/profile_handler.js +1 -1
- data/lib/html/rack-mini-profiler.css +3 -0
- data/lib/html/rack-mini-profiler.js +2 -0
- data/lib/html/share.html +0 -1
- data/lib/html/speedscope/LICENSE +21 -0
- data/lib/html/speedscope/README.md +3 -0
- data/lib/html/speedscope/demangle-cpp.1768f4cc.js +4 -0
- data/lib/html/speedscope/favicon-16x16.f74b3187.png +0 -0
- data/lib/html/speedscope/favicon-32x32.bc503437.png +0 -0
- data/lib/html/speedscope/file-format-schema.json +324 -0
- data/lib/html/speedscope/fonts/source-code-pro-regular.css +8 -0
- data/lib/html/speedscope/fonts/source-code-pro-v13-regular.woff +0 -0
- data/lib/html/speedscope/fonts/source-code-pro-v13-regular.woff2 +0 -0
- data/lib/html/speedscope/import.cf0fa83f.js +115 -0
- data/lib/html/speedscope/index.html +2 -0
- data/lib/html/speedscope/release.txt +3 -0
- data/lib/html/speedscope/reset.8c46b7a1.css +2 -0
- data/lib/html/speedscope/source-map.438fa06b.js +24 -0
- data/lib/html/speedscope/speedscope.44364064.js +200 -0
- data/lib/html/vendor.js +848 -0
- data/lib/mini_profiler/asset_version.rb +3 -2
- data/lib/mini_profiler/client_settings.rb +15 -7
- data/lib/mini_profiler/config.rb +51 -5
- data/lib/mini_profiler/gc_profiler.rb +1 -1
- data/lib/mini_profiler/profiling_methods.rb +13 -8
- data/lib/mini_profiler/snapshots_transporter.rb +109 -0
- data/lib/mini_profiler/storage/abstract_store.rb +52 -1
- data/lib/mini_profiler/storage/file_store.rb +7 -3
- data/lib/mini_profiler/storage/memcache_store.rb +13 -7
- data/lib/mini_profiler/storage/memory_store.rb +100 -7
- data/lib/mini_profiler/storage/redis_store.rb +226 -3
- data/lib/mini_profiler/storage.rb +7 -0
- data/lib/mini_profiler/timer_struct/base.rb +2 -0
- data/lib/mini_profiler/timer_struct/custom.rb +1 -0
- data/lib/mini_profiler/timer_struct/page.rb +60 -4
- data/lib/mini_profiler/timer_struct/request.rb +53 -11
- data/lib/mini_profiler/timer_struct/sql.rb +6 -2
- data/lib/mini_profiler/timer_struct.rb +8 -0
- data/lib/mini_profiler/version.rb +2 -1
- data/lib/{mini_profiler/profiler.rb → mini_profiler.rb} +400 -83
- data/lib/mini_profiler_rails/railtie.rb +89 -7
- data/lib/mini_profiler_rails/railtie_methods.rb +61 -0
- data/lib/patches/db/activerecord.rb +1 -12
- data/lib/patches/db/mongo.rb +1 -1
- data/lib/patches/db/moped.rb +1 -1
- data/lib/patches/db/mysql2/alias_method.rb +30 -0
- data/lib/patches/db/mysql2/prepend.rb +34 -0
- data/lib/patches/db/mysql2.rb +4 -27
- data/lib/patches/db/plucky.rb +4 -4
- data/lib/patches/db/riak.rb +1 -1
- data/lib/patches/net_patches.rb +21 -10
- data/lib/patches/sql_patches.rb +13 -5
- data/lib/prepend_mysql2_patch.rb +5 -0
- data/lib/prepend_net_http_patch.rb +5 -0
- data/lib/rack-mini-profiler.rb +1 -24
- data/rack-mini-profiler.gemspec +17 -8
- metadata +156 -32
- data/lib/html/jquery.1.7.1.js +0 -4
- data/lib/html/jquery.tmpl.js +0 -486
- data/lib/html/list.css +0 -9
- data/lib/html/list.js +0 -38
- data/lib/html/list.tmpl +0 -34
@@ -1,8 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'fileutils'
|
4
|
+
require_relative './railtie_methods'
|
4
5
|
|
5
6
|
module Rack::MiniProfilerRails
|
7
|
+
extend Rack::MiniProfilerRailsMethods
|
6
8
|
|
7
9
|
# call direct if needed to do a defer init
|
8
10
|
def self.initialize!(app)
|
@@ -28,10 +30,12 @@ module Rack::MiniProfilerRails
|
|
28
30
|
|
29
31
|
if serves_static_assets?(app)
|
30
32
|
c.skip_paths << app.config.assets.prefix
|
33
|
+
wp_assets_path = get_webpacker_assets_path()
|
34
|
+
c.skip_paths << wp_assets_path if wp_assets_path
|
31
35
|
end
|
32
36
|
|
33
37
|
unless Rails.env.development? || Rails.env.test?
|
34
|
-
c.authorization_mode = :
|
38
|
+
c.authorization_mode = :allow_authorized
|
35
39
|
end
|
36
40
|
|
37
41
|
if Rails.logger
|
@@ -55,16 +59,93 @@ module Rack::MiniProfilerRails
|
|
55
59
|
|
56
60
|
# Install the Middleware
|
57
61
|
app.middleware.insert(0, Rack::MiniProfiler)
|
62
|
+
c.enable_advanced_debugging_tools = Rails.env.development?
|
58
63
|
|
59
|
-
|
60
|
-
|
61
|
-
|
64
|
+
if ::Rack::MiniProfiler.patch_rails?
|
65
|
+
# Attach to various Rails methods
|
66
|
+
ActiveSupport.on_load(:action_controller) do
|
67
|
+
::Rack::MiniProfiler.profile_method(ActionController::Base, :process) { |action| "Executing action: #{action}" }
|
68
|
+
end
|
69
|
+
|
70
|
+
ActiveSupport.on_load(:action_view) do
|
71
|
+
::Rack::MiniProfiler.profile_method(ActionView::Template, :render) { |x, y| "Rendering: #{@virtual_path}" }
|
72
|
+
end
|
73
|
+
else
|
74
|
+
subscribe("start_processing.action_controller") do |name, start, finish, id, payload|
|
75
|
+
next if !should_measure?
|
76
|
+
|
77
|
+
current = Rack::MiniProfiler.current
|
78
|
+
controller_name = payload[:controller].sub(/Controller\z/, '').downcase
|
79
|
+
description = "Executing: #{controller_name}##{payload[:action]}"
|
80
|
+
Thread.current[get_key(payload)] = current.current_timer
|
81
|
+
Rack::MiniProfiler.current.current_timer = current.current_timer.add_child(description)
|
82
|
+
end
|
83
|
+
|
84
|
+
subscribe("process_action.action_controller") do |name, start, finish, id, payload|
|
85
|
+
next if !should_measure?
|
86
|
+
|
87
|
+
key = get_key(payload)
|
88
|
+
parent_timer = Thread.current[key]
|
89
|
+
next if !parent_timer
|
90
|
+
|
91
|
+
Thread.current[key] = nil
|
92
|
+
Rack::MiniProfiler.current.current_timer.record_time
|
93
|
+
Rack::MiniProfiler.current.current_timer = parent_timer
|
94
|
+
end
|
95
|
+
|
96
|
+
subscribe("render_partial.action_view") do |name, start, finish, id, payload|
|
97
|
+
render_notification_handler(shorten_identifier(payload[:identifier]), finish, start)
|
98
|
+
end
|
99
|
+
|
100
|
+
subscribe("render_template.action_view") do |name, start, finish, id, payload|
|
101
|
+
render_notification_handler(shorten_identifier(payload[:identifier]), finish, start)
|
102
|
+
end
|
103
|
+
|
104
|
+
if Rack::MiniProfiler.subscribe_sql_active_record
|
105
|
+
# we don't want to subscribe if we've already patched a DB driver
|
106
|
+
# otherwise we would end up with 2 records for every query
|
107
|
+
subscribe("sql.active_record") do |name, start, finish, id, payload|
|
108
|
+
next if !should_measure?
|
109
|
+
next if payload[:name] =~ /SCHEMA/ && Rack::MiniProfiler.config.skip_schema_queries
|
110
|
+
|
111
|
+
Rack::MiniProfiler.record_sql(
|
112
|
+
payload[:sql],
|
113
|
+
(finish - start) * 1000,
|
114
|
+
Rack::MiniProfiler.binds_to_params(payload[:binds])
|
115
|
+
)
|
116
|
+
end
|
117
|
+
end
|
62
118
|
end
|
63
|
-
|
64
|
-
|
119
|
+
@already_initialized = true
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.create_engine
|
123
|
+
return if defined?(Rack::MiniProfilerRails::Engine)
|
124
|
+
klass = Class.new(::Rails::Engine) do
|
125
|
+
engine_name 'rack-mini-profiler'
|
126
|
+
config.assets.paths << File.expand_path('../../html', __FILE__)
|
127
|
+
config.assets.precompile << 'rack-mini-profiler.js'
|
128
|
+
config.assets.precompile << 'rack-mini-profiler.css'
|
65
129
|
end
|
130
|
+
Rack::MiniProfilerRails.const_set("Engine", klass)
|
131
|
+
end
|
66
132
|
|
67
|
-
|
133
|
+
def self.subscribe(event, &blk)
|
134
|
+
if ActiveSupport::Notifications.respond_to?(:monotonic_subscribe)
|
135
|
+
ActiveSupport::Notifications.monotonic_subscribe(event) { |*args| blk.call(*args) }
|
136
|
+
else
|
137
|
+
ActiveSupport::Notifications.subscribe(event) do |name, start, finish, id, payload|
|
138
|
+
blk.call(name, start.to_f, finish.to_f, id, payload)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def self.get_key(payload)
|
144
|
+
"mini_profiler_parent_timer_#{payload[:controller]}_#{payload[:action]}".to_sym
|
145
|
+
end
|
146
|
+
|
147
|
+
def self.shorten_identifier(identifier)
|
148
|
+
identifier.split('/').last(2).join('/')
|
68
149
|
end
|
69
150
|
|
70
151
|
def self.serves_static_assets?(app)
|
@@ -95,6 +176,7 @@ module Rack::MiniProfilerRails
|
|
95
176
|
middlewares = app.middleware.middlewares
|
96
177
|
if Rack::MiniProfiler.config.suppress_encoding.nil? &&
|
97
178
|
middlewares.include?(Rack::Deflater) &&
|
179
|
+
middlewares.include?(Rack::MiniProfiler) &&
|
98
180
|
middlewares.index(Rack::Deflater) > middlewares.index(Rack::MiniProfiler)
|
99
181
|
Rack::MiniProfiler.config.suppress_encoding = true
|
100
182
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Rack::MiniProfilerRailsMethods
|
4
|
+
def render_notification_handler(name, finish, start, name_as_description: false)
|
5
|
+
return if !should_measure?
|
6
|
+
|
7
|
+
description = name_as_description ? name : "Rendering: #{name}"
|
8
|
+
current = Rack::MiniProfiler.current.current_timer
|
9
|
+
node = current.add_child(description)
|
10
|
+
duration = finish - start
|
11
|
+
duration_ms = duration * 1000
|
12
|
+
node.start -= duration
|
13
|
+
node[:start_milliseconds] -= duration_ms
|
14
|
+
node.record_time(duration_ms)
|
15
|
+
|
16
|
+
children_duration = 0
|
17
|
+
to_be_moved = { requests: [], sql: [], custom: {} }
|
18
|
+
current.children.each do |child|
|
19
|
+
next if child == node
|
20
|
+
if should_move?(child, node)
|
21
|
+
to_be_moved[:requests] << child
|
22
|
+
children_duration += child[:duration_milliseconds]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
node[:duration_without_children_milliseconds] = duration_ms - children_duration
|
26
|
+
to_be_moved[:requests].each { |req| current.move_child(req, node) }
|
27
|
+
|
28
|
+
current.sql_timings.each do |sql|
|
29
|
+
to_be_moved[:sql] << sql if should_move?(sql, node)
|
30
|
+
end
|
31
|
+
to_be_moved[:sql].each { |sql| current.move_sql(sql, node) }
|
32
|
+
|
33
|
+
current.custom_timings.each do |type, timings|
|
34
|
+
to_be_moved[:custom] = []
|
35
|
+
timings.each do |custom|
|
36
|
+
to_be_moved[:custom] << custom if should_move?(custom, node)
|
37
|
+
end
|
38
|
+
to_be_moved[:custom].each { |custom| current.move_custom(type, custom, node) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def should_measure?
|
43
|
+
current = Rack::MiniProfiler.current
|
44
|
+
current && current.measure
|
45
|
+
end
|
46
|
+
|
47
|
+
def should_move?(child, node)
|
48
|
+
start = :start_milliseconds
|
49
|
+
duration = :duration_milliseconds
|
50
|
+
child[start] >= node[start] &&
|
51
|
+
child[start] + child[duration] <= node[start] + node[duration]
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_webpacker_assets_path
|
55
|
+
if defined?(Webpacker) && Webpacker.config.config_path.exist?
|
56
|
+
Webpacker.config.public_output_path.to_s.gsub(Webpacker.config.public_path.to_s, "")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
extend self
|
61
|
+
end
|
@@ -15,17 +15,6 @@ module Rack
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def binds_to_params(binds)
|
19
|
-
return if binds.nil? || Rack::MiniProfiler.config.max_sql_param_length == 0
|
20
|
-
# map ActiveRecord::Relation::QueryAttribute to [name, value]
|
21
|
-
params = binds.map { |c| c.kind_of?(Array) ? [c.first, c.last] : [c.name, c.value] }
|
22
|
-
if (skip = Rack::MiniProfiler.config.skip_sql_param_names)
|
23
|
-
params.map { |(n, v)| n =~ skip ? [n, nil] : [n, v] }
|
24
|
-
else
|
25
|
-
params
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
18
|
def log_with_miniprofiler(*args, &block)
|
30
19
|
return log_without_miniprofiler(*args, &block) unless SqlPatches.should_measure?
|
31
20
|
|
@@ -37,7 +26,7 @@ module Rack
|
|
37
26
|
return rval if Rack::MiniProfiler.config.skip_schema_queries && name =~ (/SCHEMA/)
|
38
27
|
|
39
28
|
elapsed_time = SqlPatches.elapsed_time(start)
|
40
|
-
Rack::MiniProfiler.record_sql(sql, elapsed_time, binds_to_params(binds))
|
29
|
+
Rack::MiniProfiler.record_sql(sql, elapsed_time, Rack::MiniProfiler.binds_to_params(binds))
|
41
30
|
rval
|
42
31
|
end
|
43
32
|
end
|
data/lib/patches/db/mongo.rb
CHANGED
@@ -8,7 +8,7 @@ class Mongo::Server::Connection
|
|
8
8
|
result, _record = SqlPatches.record_sql(args[0][0].payload.inspect) do
|
9
9
|
dispatch_without_timing(*args, &blk)
|
10
10
|
end
|
11
|
-
|
11
|
+
result
|
12
12
|
end
|
13
13
|
|
14
14
|
# TODO: change to Module#prepend as soon as Ruby 1.9.3 support is dropped
|
data/lib/patches/db/moped.rb
CHANGED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# The best kind of instrumentation is in the actual db provider, however we don't want to double instrument
|
4
|
+
|
5
|
+
class Mysql2::Result
|
6
|
+
alias_method :each_without_profiling, :each
|
7
|
+
def each(*args, &blk)
|
8
|
+
return each_without_profiling(*args, &blk) unless defined?(@miniprofiler_sql_id)
|
9
|
+
|
10
|
+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
11
|
+
result = each_without_profiling(*args, &blk)
|
12
|
+
elapsed_time = SqlPatches.elapsed_time(start)
|
13
|
+
|
14
|
+
@miniprofiler_sql_id.report_reader_duration(elapsed_time)
|
15
|
+
result
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class Mysql2::Client
|
20
|
+
alias_method :query_without_profiling, :query
|
21
|
+
def query(*args, &blk)
|
22
|
+
return query_without_profiling(*args, &blk) unless SqlPatches.should_measure?
|
23
|
+
|
24
|
+
result, record = SqlPatches.record_sql(args[0]) do
|
25
|
+
query_without_profiling(*args, &blk)
|
26
|
+
end
|
27
|
+
result.instance_variable_set("@miniprofiler_sql_id", record) if result
|
28
|
+
result
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Mysql2::Result
|
4
|
+
module MiniProfiler
|
5
|
+
def each(*args, &blk)
|
6
|
+
return super unless defined?(@miniprofiler_sql_id)
|
7
|
+
|
8
|
+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
9
|
+
result = super
|
10
|
+
elapsed_time = SqlPatches.elapsed_time(start)
|
11
|
+
|
12
|
+
@miniprofiler_sql_id.report_reader_duration(elapsed_time)
|
13
|
+
result
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
prepend MiniProfiler
|
18
|
+
end
|
19
|
+
|
20
|
+
class Mysql2::Client
|
21
|
+
module MiniProfiler
|
22
|
+
def query(*args, &blk)
|
23
|
+
return super unless SqlPatches.should_measure?
|
24
|
+
|
25
|
+
result, record = SqlPatches.record_sql(args[0]) do
|
26
|
+
super
|
27
|
+
end
|
28
|
+
result.instance_variable_set("@miniprofiler_sql_id", record) if result
|
29
|
+
result
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
prepend MiniProfiler
|
34
|
+
end
|
data/lib/patches/db/mysql2.rb
CHANGED
@@ -1,30 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
alias_method
|
7
|
-
def each(*args, &blk)
|
8
|
-
return each_without_profiling(*args, &blk) unless defined?(@miniprofiler_sql_id)
|
9
|
-
|
10
|
-
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
11
|
-
result = each_without_profiling(*args, &blk)
|
12
|
-
elapsed_time = SqlPatches.elapsed_time(start)
|
13
|
-
|
14
|
-
@miniprofiler_sql_id.report_reader_duration(elapsed_time)
|
15
|
-
result
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
class Mysql2::Client
|
20
|
-
alias_method :query_without_profiling, :query
|
21
|
-
def query(*args, &blk)
|
22
|
-
return query_without_profiling(*args, &blk) unless SqlPatches.should_measure?
|
23
|
-
|
24
|
-
result, record = SqlPatches.record_sql(args[0]) do
|
25
|
-
query_without_profiling(*args, &blk)
|
26
|
-
end
|
27
|
-
result.instance_variable_set("@miniprofiler_sql_id", record) if result
|
28
|
-
result
|
29
|
-
end
|
3
|
+
if defined?(Rack::MINI_PROFILER_PREPEND_MYSQL2_PATCH)
|
4
|
+
require "patches/db/mysql2/prepend"
|
5
|
+
else
|
6
|
+
require "patches/db/mysql2/alias_method"
|
30
7
|
end
|
data/lib/patches/db/plucky.rb
CHANGED
@@ -9,19 +9,19 @@ class Plucky::Query
|
|
9
9
|
alias_method :remove_without_profiling, :remove
|
10
10
|
|
11
11
|
def find_each(*args, &blk)
|
12
|
-
|
12
|
+
profile_database_operation(__callee__, filtered_inspect(), *args, &blk)
|
13
13
|
end
|
14
14
|
|
15
15
|
def find_one(*args, &blk)
|
16
|
-
|
16
|
+
profile_database_operation(__callee__, filtered_inspect(args[0]), *args, &blk)
|
17
17
|
end
|
18
18
|
|
19
19
|
def count(*args, &blk)
|
20
|
-
|
20
|
+
profile_database_operation(__callee__, filtered_inspect(), *args, &blk)
|
21
21
|
end
|
22
22
|
|
23
23
|
def remove(*args, &blk)
|
24
|
-
|
24
|
+
profile_database_operation(__callee__, filtered_inspect(), *args, &blk)
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
data/lib/patches/db/riak.rb
CHANGED
data/lib/patches/net_patches.rb
CHANGED
@@ -1,16 +1,27 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
if
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
if ENV['RACK_MINI_PROFILER_PATCH_NET_HTTP'] != 'false'
|
4
|
+
if (defined?(Net) && defined?(Net::HTTP))
|
5
|
+
if defined?(Rack::MINI_PROFILER_PREPEND_NET_HTTP_PATCH)
|
6
|
+
module NetHTTPWithMiniProfiler
|
7
|
+
def request(request, *args, &block)
|
8
|
+
Rack::MiniProfiler.step("Net::HTTP #{request.method} #{request.path}") do
|
9
|
+
super
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
Net::HTTP.prepend(NetHTTPWithMiniProfiler)
|
14
|
+
else
|
15
|
+
Net::HTTP.class_eval do
|
16
|
+
def request_with_mini_profiler(*args, &block)
|
17
|
+
request = args[0]
|
18
|
+
Rack::MiniProfiler.step("Net::HTTP #{request.method} #{request.path}") do
|
19
|
+
request_without_mini_profiler(*args, &block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
alias request_without_mini_profiler request
|
23
|
+
alias request request_with_mini_profiler
|
10
24
|
end
|
11
25
|
end
|
12
|
-
alias request_without_mini_profiler request
|
13
|
-
alias request request_with_mini_profiler
|
14
26
|
end
|
15
|
-
|
16
27
|
end
|
data/lib/patches/sql_patches.rb
CHANGED
@@ -11,7 +11,7 @@ class SqlPatches
|
|
11
11
|
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
12
12
|
result = yield
|
13
13
|
record = ::Rack::MiniProfiler.record_sql(statement, elapsed_time(start), parameters)
|
14
|
-
|
14
|
+
[result, record]
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.should_measure?
|
@@ -23,18 +23,26 @@ class SqlPatches
|
|
23
23
|
((Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time).to_f * 1000).round(1)
|
24
24
|
end
|
25
25
|
|
26
|
+
def self.patch_rails?
|
27
|
+
::Rack::MiniProfiler.patch_rails?
|
28
|
+
end
|
29
|
+
|
26
30
|
def self.sql_patches
|
27
31
|
patches = []
|
28
32
|
|
29
33
|
patches << 'mysql2' if defined?(Mysql2::Client) && Mysql2::Client.class == Class
|
30
34
|
patches << 'pg' if defined?(PG::Result) && PG::Result.class == Class
|
31
35
|
patches << 'oracle_enhanced' if defined?(ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter) && ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.class == Class &&
|
32
|
-
SqlPatches.correct_version?('~> 1.5.0', ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter)
|
36
|
+
SqlPatches.correct_version?('~> 1.5.0', ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter) &&
|
37
|
+
patch_rails?
|
33
38
|
# if the adapters were directly patched, don't patch again
|
34
|
-
|
39
|
+
if !patches.empty?
|
40
|
+
Rack::MiniProfiler.subscribe_sql_active_record = false
|
41
|
+
return patches
|
42
|
+
end
|
35
43
|
patches << 'sequel' if defined?(Sequel::Database) && Sequel::Database.class == Class
|
36
|
-
patches << 'activerecord' if defined?(ActiveRecord) && ActiveRecord.class == Module
|
37
|
-
|
44
|
+
patches << 'activerecord' if defined?(ActiveRecord) && ActiveRecord.class == Module && patch_rails?
|
45
|
+
Rack::MiniProfiler.subscribe_sql_active_record = patches.empty? && !patch_rails?
|
38
46
|
patches
|
39
47
|
end
|
40
48
|
|
data/lib/rack-mini-profiler.rb
CHANGED
@@ -1,32 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'json'
|
4
|
-
require 'timeout'
|
5
|
-
require 'thread'
|
6
|
-
require 'securerandom'
|
7
|
-
|
8
3
|
require 'mini_profiler/version'
|
9
4
|
require 'mini_profiler/asset_version'
|
10
5
|
|
11
|
-
require 'mini_profiler
|
12
|
-
require 'mini_profiler/timer_struct/page'
|
13
|
-
require 'mini_profiler/timer_struct/sql'
|
14
|
-
require 'mini_profiler/timer_struct/custom'
|
15
|
-
require 'mini_profiler/timer_struct/client'
|
16
|
-
require 'mini_profiler/timer_struct/request'
|
17
|
-
|
18
|
-
require 'mini_profiler/storage/abstract_store'
|
19
|
-
require 'mini_profiler/storage/memcache_store'
|
20
|
-
require 'mini_profiler/storage/memory_store'
|
21
|
-
require 'mini_profiler/storage/redis_store'
|
22
|
-
require 'mini_profiler/storage/file_store'
|
23
|
-
|
24
|
-
require 'mini_profiler/config'
|
25
|
-
require 'mini_profiler/profiling_methods'
|
26
|
-
require 'mini_profiler/context'
|
27
|
-
require 'mini_profiler/client_settings'
|
28
|
-
require 'mini_profiler/gc_profiler'
|
29
|
-
require 'mini_profiler/profiler'
|
6
|
+
require 'mini_profiler'
|
30
7
|
|
31
8
|
require 'patches/sql_patches'
|
32
9
|
require 'patches/net_patches'
|
data/rack-mini-profiler.gemspec
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
lib = File.expand_path('../lib', __FILE__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
5
|
require 'mini_profiler/version'
|
@@ -9,7 +11,7 @@ Gem::Specification.new do |s|
|
|
9
11
|
s.authors = ["Sam Saffron", "Robin Ward", "Aleks Totic"]
|
10
12
|
s.description = "Profiling toolkit for Rack applications with Rails integration. Client Side profiling, DB profiling and Server profiling."
|
11
13
|
s.email = "sam.saffron@gmail.com"
|
12
|
-
s.homepage = "
|
14
|
+
s.homepage = "https://miniprofiler.com"
|
13
15
|
s.license = "MIT"
|
14
16
|
s.files = [
|
15
17
|
'rack-mini-profiler.gemspec',
|
@@ -19,22 +21,29 @@ Gem::Specification.new do |s|
|
|
19
21
|
"CHANGELOG.md"
|
20
22
|
]
|
21
23
|
s.add_runtime_dependency 'rack', '>= 1.2.0'
|
22
|
-
s.required_ruby_version = '>= 2.
|
24
|
+
s.required_ruby_version = '>= 2.6.0'
|
23
25
|
|
24
26
|
s.metadata = {
|
25
|
-
'source_code_uri' =>
|
27
|
+
'source_code_uri' => Rack::MiniProfiler::SOURCE_CODE_URI,
|
26
28
|
'changelog_uri' => 'https://github.com/MiniProfiler/rack-mini-profiler/blob/master/CHANGELOG.md'
|
27
29
|
}
|
28
30
|
|
29
|
-
s.add_development_dependency 'rake'
|
31
|
+
s.add_development_dependency 'rake'
|
30
32
|
s.add_development_dependency 'rack-test'
|
31
|
-
s.add_development_dependency 'activerecord', '~> 3.0'
|
32
33
|
s.add_development_dependency 'dalli'
|
33
|
-
s.add_development_dependency 'rspec', '~> 3.
|
34
|
+
s.add_development_dependency 'rspec', '~> 3.12.0'
|
34
35
|
s.add_development_dependency 'redis'
|
35
|
-
s.add_development_dependency '
|
36
|
-
s.add_development_dependency '
|
36
|
+
s.add_development_dependency 'sassc'
|
37
|
+
s.add_development_dependency 'stackprof'
|
37
38
|
s.add_development_dependency 'rubocop'
|
39
|
+
s.add_development_dependency 'mini_racer'
|
40
|
+
s.add_development_dependency 'nokogiri'
|
41
|
+
s.add_development_dependency 'rubocop-discourse'
|
42
|
+
s.add_development_dependency 'listen'
|
43
|
+
s.add_development_dependency 'webpacker'
|
44
|
+
s.add_development_dependency 'rails', '~> 6.0'
|
45
|
+
s.add_development_dependency 'webmock', '3.9.1'
|
46
|
+
s.add_development_dependency 'rubyzip'
|
38
47
|
|
39
48
|
s.require_paths = ["lib"]
|
40
49
|
end
|