rack-mini-profiler 2.2.0 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +25 -11
- data/lib/html/includes.js +213 -182
- data/lib/html/includes.tmpl +4 -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 +2 -2
- data/lib/mini_profiler/asset_version.rb +1 -1
- data/lib/mini_profiler/client_settings.rb +5 -5
- data/lib/mini_profiler/config.rb +19 -1
- data/lib/mini_profiler/profiler.rb +82 -20
- data/lib/mini_profiler/profiling_methods.rb +3 -1
- data/lib/mini_profiler/snapshots_transporter.rb +31 -6
- data/lib/mini_profiler/storage/abstract_store.rb +1 -1
- data/lib/mini_profiler/timer_struct/page.rb +9 -3
- data/lib/mini_profiler/version.rb +1 -1
- data/lib/mini_profiler_rails/railtie.rb +1 -1
- data/lib/patches/db/mysql2.rb +4 -27
- data/lib/patches/db/mysql2/alias_method.rb +30 -0
- data/lib/patches/db/mysql2/prepend.rb +34 -0
- data/lib/prepend_mysql2_patch.rb +5 -0
- data/rack-mini-profiler.gemspec +5 -4
- metadata +46 -14
@@ -115,6 +115,9 @@ module Rack
|
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
118
|
+
if klass.respond_to?(:ruby2_keywords, true)
|
119
|
+
klass.send(:ruby2_keywords, with_profiling)
|
120
|
+
end
|
118
121
|
klass.send :alias_method, method, with_profiling
|
119
122
|
end
|
120
123
|
|
@@ -154,7 +157,6 @@ module Rack
|
|
154
157
|
def clean_method_name(method)
|
155
158
|
method.to_s.gsub(/[\?\!]/, "")
|
156
159
|
end
|
157
|
-
|
158
160
|
end
|
159
161
|
end
|
160
162
|
end
|
@@ -23,16 +23,18 @@ class ::Rack::MiniProfiler::SnapshotsTransporter
|
|
23
23
|
end
|
24
24
|
|
25
25
|
attr_reader :buffer
|
26
|
-
attr_accessor :max_buffer_size
|
26
|
+
attr_accessor :max_buffer_size, :gzip_requests
|
27
27
|
|
28
28
|
def initialize(config)
|
29
29
|
@uri = URI(config.snapshots_transport_destination_url)
|
30
30
|
@auth_key = config.snapshots_transport_auth_key
|
31
|
+
@gzip_requests = config.snapshots_transport_gzip_requests
|
31
32
|
@thread = nil
|
32
33
|
@thread_mutex = Mutex.new
|
33
34
|
@buffer = []
|
34
35
|
@buffer_mutex = Mutex.new
|
35
36
|
@max_buffer_size = 100
|
37
|
+
@consecutive_failures_count = 0
|
36
38
|
@testing = false
|
37
39
|
end
|
38
40
|
|
@@ -49,12 +51,24 @@ class ::Rack::MiniProfiler::SnapshotsTransporter
|
|
49
51
|
@buffer.dup if @buffer.size > 0
|
50
52
|
end
|
51
53
|
if buffer_content
|
52
|
-
|
53
|
-
@uri,
|
54
|
+
headers = {
|
54
55
|
'Content-Type' => 'application/json',
|
55
56
|
'Mini-Profiler-Transport-Auth' => @auth_key
|
56
|
-
|
57
|
-
|
57
|
+
}
|
58
|
+
json = { snapshots: buffer_content }.to_json
|
59
|
+
body = if @gzip_requests
|
60
|
+
require 'zlib'
|
61
|
+
io = StringIO.new
|
62
|
+
gzip_writer = Zlib::GzipWriter.new(io)
|
63
|
+
gzip_writer.write(json)
|
64
|
+
gzip_writer.close
|
65
|
+
headers['Content-Encoding'] = 'gzip'
|
66
|
+
io.string
|
67
|
+
else
|
68
|
+
json
|
69
|
+
end
|
70
|
+
request = Net::HTTP::Post.new(@uri, headers)
|
71
|
+
request.body = body
|
58
72
|
http = Net::HTTP.new(@uri.hostname, @uri.port)
|
59
73
|
http.use_ssl = @uri.scheme == 'https'
|
60
74
|
res = http.request(request)
|
@@ -64,19 +78,30 @@ class ::Rack::MiniProfiler::SnapshotsTransporter
|
|
64
78
|
@buffer_mutex.synchronize do
|
65
79
|
@buffer -= buffer_content
|
66
80
|
end
|
81
|
+
@consecutive_failures_count = 0
|
67
82
|
else
|
68
83
|
@@failed_http_requests_count += 1
|
84
|
+
@consecutive_failures_count += 1
|
69
85
|
end
|
70
86
|
end
|
71
87
|
end
|
72
88
|
|
89
|
+
def requests_interval
|
90
|
+
[30 + backoff_delay, 60 * 60].min
|
91
|
+
end
|
92
|
+
|
73
93
|
private
|
74
94
|
|
95
|
+
def backoff_delay
|
96
|
+
return 0 if @consecutive_failures_count == 0
|
97
|
+
2**@consecutive_failures_count
|
98
|
+
end
|
99
|
+
|
75
100
|
def start_thread
|
76
101
|
return if @thread&.alive? || @testing
|
77
102
|
@thread = Thread.new do
|
78
103
|
while true
|
79
|
-
sleep
|
104
|
+
sleep requests_interval
|
80
105
|
flush_buffer
|
81
106
|
end
|
82
107
|
end
|
@@ -36,7 +36,7 @@ module Rack
|
|
36
36
|
""
|
37
37
|
end
|
38
38
|
|
39
|
-
# a list of tokens that are permitted to access profiler in
|
39
|
+
# a list of tokens that are permitted to access profiler in explicit mode
|
40
40
|
def allowed_tokens
|
41
41
|
raise NotImplementedError.new("allowed_tokens is not implemented")
|
42
42
|
end
|
@@ -87,7 +87,9 @@ module Rack
|
|
87
87
|
executed_non_queries: 0,
|
88
88
|
custom_timing_names: [],
|
89
89
|
custom_timing_stats: {},
|
90
|
-
custom_fields: {}
|
90
|
+
custom_fields: {},
|
91
|
+
has_flamegraph: false,
|
92
|
+
flamegraph: nil
|
91
93
|
)
|
92
94
|
self[:request_method] = env['REQUEST_METHOD']
|
93
95
|
self[:request_path] = env['PATH_INFO']
|
@@ -111,12 +113,16 @@ module Rack
|
|
111
113
|
@attributes[:root]
|
112
114
|
end
|
113
115
|
|
116
|
+
def attributes_to_serialize
|
117
|
+
@attributes.keys - [:flamegraph]
|
118
|
+
end
|
119
|
+
|
114
120
|
def to_json(*a)
|
115
|
-
::JSON.generate(@attributes.merge(
|
121
|
+
::JSON.generate(@attributes.slice(*attributes_to_serialize).merge(extra_json))
|
116
122
|
end
|
117
123
|
|
118
124
|
def as_json(options = nil)
|
119
|
-
super(options).merge!(extra_json)
|
125
|
+
super(options).slice(*attributes_to_serialize.map(&:to_s)).merge!(extra_json)
|
120
126
|
end
|
121
127
|
|
122
128
|
def extra_json
|
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
|
@@ -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/rack-mini-profiler.gemspec
CHANGED
@@ -28,21 +28,22 @@ Gem::Specification.new do |s|
|
|
28
28
|
'changelog_uri' => 'https://github.com/MiniProfiler/rack-mini-profiler/blob/master/CHANGELOG.md'
|
29
29
|
}
|
30
30
|
|
31
|
-
s.add_development_dependency 'rake'
|
31
|
+
s.add_development_dependency 'rake'
|
32
32
|
s.add_development_dependency 'rack-test'
|
33
33
|
s.add_development_dependency 'dalli'
|
34
34
|
s.add_development_dependency 'rspec', '~> 3.6.0'
|
35
35
|
s.add_development_dependency 'redis'
|
36
36
|
s.add_development_dependency 'sassc'
|
37
|
-
s.add_development_dependency '
|
37
|
+
s.add_development_dependency 'stackprof'
|
38
38
|
s.add_development_dependency 'rubocop'
|
39
39
|
s.add_development_dependency 'mini_racer'
|
40
40
|
s.add_development_dependency 'nokogiri'
|
41
41
|
s.add_development_dependency 'rubocop-discourse'
|
42
42
|
s.add_development_dependency 'listen'
|
43
|
-
s.add_development_dependency 'webpacker'
|
44
|
-
s.add_development_dependency 'rails', '~>
|
43
|
+
s.add_development_dependency 'webpacker'
|
44
|
+
s.add_development_dependency 'rails', '~> 6.0'
|
45
45
|
s.add_development_dependency 'webmock', '3.9.1'
|
46
|
+
s.add_development_dependency 'rubyzip'
|
46
47
|
|
47
48
|
s.require_paths = ["lib"]
|
48
49
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-mini-profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2
|
4
|
+
version: 2.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2021-04-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -30,16 +30,16 @@ dependencies:
|
|
30
30
|
name: rake
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
33
|
+
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '
|
35
|
+
version: '0'
|
36
36
|
type: :development
|
37
37
|
prerelease: false
|
38
38
|
version_requirements: !ruby/object:Gem::Requirement
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: '
|
42
|
+
version: '0'
|
43
43
|
- !ruby/object:Gem::Dependency
|
44
44
|
name: rack-test
|
45
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,7 +111,7 @@ dependencies:
|
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
113
|
- !ruby/object:Gem::Dependency
|
114
|
-
name:
|
114
|
+
name: stackprof
|
115
115
|
requirement: !ruby/object:Gem::Requirement
|
116
116
|
requirements:
|
117
117
|
- - ">="
|
@@ -198,30 +198,30 @@ dependencies:
|
|
198
198
|
name: webpacker
|
199
199
|
requirement: !ruby/object:Gem::Requirement
|
200
200
|
requirements:
|
201
|
-
- - "
|
201
|
+
- - ">="
|
202
202
|
- !ruby/object:Gem::Version
|
203
|
-
version: '
|
203
|
+
version: '0'
|
204
204
|
type: :development
|
205
205
|
prerelease: false
|
206
206
|
version_requirements: !ruby/object:Gem::Requirement
|
207
207
|
requirements:
|
208
|
-
- - "
|
208
|
+
- - ">="
|
209
209
|
- !ruby/object:Gem::Version
|
210
|
-
version: '
|
210
|
+
version: '0'
|
211
211
|
- !ruby/object:Gem::Dependency
|
212
212
|
name: rails
|
213
213
|
requirement: !ruby/object:Gem::Requirement
|
214
214
|
requirements:
|
215
215
|
- - "~>"
|
216
216
|
- !ruby/object:Gem::Version
|
217
|
-
version: '
|
217
|
+
version: '6.0'
|
218
218
|
type: :development
|
219
219
|
prerelease: false
|
220
220
|
version_requirements: !ruby/object:Gem::Requirement
|
221
221
|
requirements:
|
222
222
|
- - "~>"
|
223
223
|
- !ruby/object:Gem::Version
|
224
|
-
version: '
|
224
|
+
version: '6.0'
|
225
225
|
- !ruby/object:Gem::Dependency
|
226
226
|
name: webmock
|
227
227
|
requirement: !ruby/object:Gem::Requirement
|
@@ -236,6 +236,20 @@ dependencies:
|
|
236
236
|
- - '='
|
237
237
|
- !ruby/object:Gem::Version
|
238
238
|
version: 3.9.1
|
239
|
+
- !ruby/object:Gem::Dependency
|
240
|
+
name: rubyzip
|
241
|
+
requirement: !ruby/object:Gem::Requirement
|
242
|
+
requirements:
|
243
|
+
- - ">="
|
244
|
+
- !ruby/object:Gem::Version
|
245
|
+
version: '0'
|
246
|
+
type: :development
|
247
|
+
prerelease: false
|
248
|
+
version_requirements: !ruby/object:Gem::Requirement
|
249
|
+
requirements:
|
250
|
+
- - ">="
|
251
|
+
- !ruby/object:Gem::Version
|
252
|
+
version: '0'
|
239
253
|
description: Profiling toolkit for Rack applications with Rails integration. Client
|
240
254
|
Side profiling, DB profiling and Server profiling.
|
241
255
|
email: sam.saffron@gmail.com
|
@@ -261,6 +275,21 @@ files:
|
|
261
275
|
- lib/html/rack-mini-profiler.css
|
262
276
|
- lib/html/rack-mini-profiler.js
|
263
277
|
- lib/html/share.html
|
278
|
+
- lib/html/speedscope/LICENSE
|
279
|
+
- lib/html/speedscope/README.md
|
280
|
+
- lib/html/speedscope/demangle-cpp.1768f4cc.js
|
281
|
+
- lib/html/speedscope/favicon-16x16.f74b3187.png
|
282
|
+
- lib/html/speedscope/favicon-32x32.bc503437.png
|
283
|
+
- lib/html/speedscope/file-format-schema.json
|
284
|
+
- lib/html/speedscope/fonts/source-code-pro-regular.css
|
285
|
+
- lib/html/speedscope/fonts/source-code-pro-v13-regular.woff
|
286
|
+
- lib/html/speedscope/fonts/source-code-pro-v13-regular.woff2
|
287
|
+
- lib/html/speedscope/import.cf0fa83f.js
|
288
|
+
- lib/html/speedscope/index.html
|
289
|
+
- lib/html/speedscope/release.txt
|
290
|
+
- lib/html/speedscope/reset.8c46b7a1.css
|
291
|
+
- lib/html/speedscope/source-map.438fa06b.js
|
292
|
+
- lib/html/speedscope/speedscope.44364064.js
|
264
293
|
- lib/html/vendor.js
|
265
294
|
- lib/mini_profiler/asset_version.rb
|
266
295
|
- lib/mini_profiler/client_settings.rb
|
@@ -288,6 +317,8 @@ files:
|
|
288
317
|
- lib/patches/db/mongo.rb
|
289
318
|
- lib/patches/db/moped.rb
|
290
319
|
- lib/patches/db/mysql2.rb
|
320
|
+
- lib/patches/db/mysql2/alias_method.rb
|
321
|
+
- lib/patches/db/mysql2/prepend.rb
|
291
322
|
- lib/patches/db/neo4j.rb
|
292
323
|
- lib/patches/db/nobrainer.rb
|
293
324
|
- lib/patches/db/oracle_enhanced.rb
|
@@ -298,6 +329,7 @@ files:
|
|
298
329
|
- lib/patches/db/sequel.rb
|
299
330
|
- lib/patches/net_patches.rb
|
300
331
|
- lib/patches/sql_patches.rb
|
332
|
+
- lib/prepend_mysql2_patch.rb
|
301
333
|
- lib/prepend_net_http_patch.rb
|
302
334
|
- lib/rack-mini-profiler.rb
|
303
335
|
- rack-mini-profiler.gemspec
|
@@ -322,7 +354,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
322
354
|
- !ruby/object:Gem::Version
|
323
355
|
version: '0'
|
324
356
|
requirements: []
|
325
|
-
rubygems_version: 3.
|
357
|
+
rubygems_version: 3.2.2
|
326
358
|
signing_key:
|
327
359
|
specification_version: 4
|
328
360
|
summary: Profiles loading speed for rack applications.
|