rack-mini-profiler 0.10.7 → 1.0.0
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 +12 -0
- data/README.md +7 -19
- data/lib/generators/rack_profiler/install_generator.rb +2 -0
- data/lib/generators/rack_profiler/templates/rack_profiler.rb +2 -0
- data/lib/html/includes.js +27 -22
- data/lib/mini_profiler/asset_version.rb +1 -1
- data/lib/mini_profiler/client_settings.rb +4 -0
- data/lib/mini_profiler/config.rb +46 -41
- data/lib/mini_profiler/context.rb +2 -0
- data/lib/mini_profiler/gc_profiler.rb +2 -0
- data/lib/mini_profiler/profiler.rb +14 -11
- data/lib/mini_profiler/profiling_methods.rb +2 -0
- data/lib/mini_profiler/storage/abstract_store.rb +2 -0
- data/lib/mini_profiler/storage/file_store.rb +3 -1
- data/lib/mini_profiler/storage/memcache_store.rb +2 -0
- data/lib/mini_profiler/storage/memory_store.rb +4 -2
- data/lib/mini_profiler/storage/redis_store.rb +2 -0
- data/lib/mini_profiler/timer_struct/base.rb +2 -0
- data/lib/mini_profiler/timer_struct/client.rb +3 -1
- data/lib/mini_profiler/timer_struct/custom.rb +2 -0
- data/lib/mini_profiler/timer_struct/page.rb +7 -3
- data/lib/mini_profiler/timer_struct/request.rb +2 -0
- data/lib/mini_profiler/timer_struct/sql.rb +2 -1
- data/lib/mini_profiler/version.rb +3 -1
- data/lib/mini_profiler_rails/railtie.rb +3 -1
- data/lib/patches/db/activerecord.rb +2 -0
- data/lib/patches/db/mongo.rb +2 -0
- data/lib/patches/db/moped.rb +2 -0
- data/lib/patches/db/mysql2.rb +2 -0
- data/lib/patches/db/neo4j.rb +2 -0
- data/lib/patches/db/nobrainer.rb +3 -1
- data/lib/patches/db/oracle_enhanced.rb +2 -0
- data/lib/patches/db/pg.rb +2 -0
- data/lib/patches/db/plucky.rb +2 -0
- data/lib/patches/db/riak.rb +2 -0
- data/lib/patches/db/rsolr.rb +3 -1
- data/lib/patches/db/sequel.rb +2 -0
- data/lib/patches/net_patches.rb +2 -0
- data/lib/patches/sql_patches.rb +2 -0
- data/lib/rack-mini-profiler.rb +2 -2
- data/rack-mini-profiler.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ece809a3861e0508dd92e06d0fa272bf483de9d
|
4
|
+
data.tar.gz: 2edb42b798d5aa568008c715a56b5f521c8dac4f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f6f0f8477e82af1183ccf3cc38236b2cdc39c3e32801ae276bc1657649b3641fafd336b2b7ac683bf1cab74426f4cf409eaa6bac4b7be39650f53e8a3d3d5d7
|
7
|
+
data.tar.gz: 50eec3c2f3599412395699db1f850b6633b604022e059dfbe30c753d2b4fc782611c63a274b2a1e61e6c00a2a4cb01f4ed460ac4340bac1d2b8e0d6e640fb77f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.0.0 2017-03-29
|
4
|
+
|
5
|
+
- [BREAKING CHANGE] Ruby version 2.2.0 or later is required
|
6
|
+
- [FEATURE] use new web performance API to avoid warning @MikeRogers0
|
7
|
+
- [FEATURE] store hidden pref regarding showing mini profiler in session @MikeRogers0
|
8
|
+
- [FIX] correct jQuery 3.0 deprecations @TiSer
|
9
|
+
- [FIX] JS in IFRAME @naiyt
|
10
|
+
|
11
|
+
## 0.10.8 2017-12-01
|
12
|
+
|
13
|
+
- [FEATURE] Add `# frozen_string_literal: true` to all `lib/**/*.rb` files
|
14
|
+
|
3
15
|
## 0.10.7 2017-11-24
|
4
16
|
|
5
17
|
- [FEATURE] Replace Time.now with Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
data/README.md
CHANGED
@@ -4,14 +4,6 @@
|
|
4
4
|
|
5
5
|
Middleware that displays speed badge for every html page. Designed to work both in production and in development.
|
6
6
|
|
7
|
-
# URGENT HELP NEEDED!!!
|
8
|
-
|
9
|
-
Well, not exactly mega urgent, but nice to see you are reading this.
|
10
|
-
|
11
|
-
There is one very simple change I would like to see ASAP: I would like to see `# frozen_string_literal: true` on every file we ship
|
12
|
-
|
13
|
-
If you pick up this task, be sure to amend the README in your PR AND add a Changelog.
|
14
|
-
|
15
7
|
#### Features
|
16
8
|
|
17
9
|
* Database profiling - Currently supports Mysql2, Postgres, Oracle (oracle_enhanced ~> 1.5.0) and Mongoid3 (with fallback support to ActiveRecord)
|
@@ -38,7 +30,7 @@ If you feel like taking on any of this start an issue and update us on your prog
|
|
38
30
|
|
39
31
|
## Installation
|
40
32
|
|
41
|
-
Install/add to Gemfile
|
33
|
+
Install/add to Gemfile in Ruby 2.2+
|
42
34
|
|
43
35
|
```ruby
|
44
36
|
gem 'rack-mini-profiler'
|
@@ -48,13 +40,12 @@ NOTE: Be sure to require rack_mini_profiler below the `pg` and `mysql` gems in y
|
|
48
40
|
|
49
41
|
You can also include optional libraries to enable additional features.
|
50
42
|
```ruby
|
51
|
-
# For memory profiling
|
43
|
+
# For memory profiling
|
52
44
|
gem 'memory_profiler'
|
53
45
|
|
54
|
-
# For call-stack profiling flamegraphs
|
46
|
+
# For call-stack profiling flamegraphs
|
55
47
|
gem 'flamegraph'
|
56
|
-
gem 'stackprof'
|
57
|
-
gem 'fast_stack' # For Ruby MRI 2.0
|
48
|
+
gem 'stackprof'
|
58
49
|
```
|
59
50
|
|
60
51
|
#### Rails
|
@@ -144,13 +135,10 @@ To generate [flamegraphs](http://samsaffron.com/archive/2013/03/19/flame-graphs-
|
|
144
135
|
* add the [**flamegraph**](https://github.com/SamSaffron/flamegraph) gem to your Gemfile
|
145
136
|
* visit a page in your app with `?pp=flamegraph`
|
146
137
|
|
147
|
-
Flamegraph generation is supported in Ruby MRI 2.0+
|
148
|
-
|
149
138
|
### Memory Profiling
|
150
139
|
|
151
140
|
Memory allocations can be measured (using the [memory_profiler](https://github.com/SamSaffron/memory_profiler) gem)
|
152
141
|
which will show allocations broken down by gem, file location, and class and will also highlight `String` allocations.
|
153
|
-
(Requires Ruby MRI 2.1.0+)
|
154
142
|
|
155
143
|
Add `?pp=profile-memory` to the URL of any request while Rack::MiniProfiler is enabled to generate the report.
|
156
144
|
|
@@ -166,8 +154,8 @@ Example: `?pp=profile-memory&memory_profiler_allow_files=active_record|app`
|
|
166
154
|
|
167
155
|
There are two additional `pp` options that can be used to analyze memory which do not require the `memory_profiler` gem
|
168
156
|
|
169
|
-
* Use `?pp=profile-gc` to report on Garbage Collection statistics
|
170
|
-
* Use `?pp=analyze-memory` to report on ObjectSpace statistics
|
157
|
+
* Use `?pp=profile-gc` to report on Garbage Collection statistics
|
158
|
+
* Use `?pp=analyze-memory` to report on ObjectSpace statistics
|
171
159
|
|
172
160
|
## Access control in non-development environments
|
173
161
|
|
@@ -326,7 +314,7 @@ backtrace_includes|Rails: `[/^\/?(app|config|lib|test)/]`<br>Rack: `[]`|Regexes
|
|
326
314
|
backtrace_remove|rails: `Rails.root`<br>Rack: `nil`|A string or regex to remove part of each line in the backtrace.
|
327
315
|
toggle_shortcut|Alt+P|Keyboard shortcut to toggle the mini_profiler's visibility. See [jquery.hotkeys](https://github.com/jeresig/jquery.hotkeys).
|
328
316
|
start_hidden|`false`|`false` to make mini_profiler visible on page load.
|
329
|
-
backtrace_threshold_ms|`0`|Minimum SQL query elapsed time before a backtrace is recorded.
|
317
|
+
backtrace_threshold_ms|`0`|Minimum SQL query elapsed time before a backtrace is recorded.
|
330
318
|
flamegraph_sample_rate|`0.5`|How often to capture stack traces for flamegraphs in milliseconds.
|
331
319
|
disable_env_dump|`false`|`true` disables `?pp=env`, which prevents sending ENV vars over HTTP.
|
332
320
|
base_url_path|`'/mini-profiler-resources/'`|Path for assets; added as a prefix when naming assets and sought when responding to requests.
|
data/lib/html/includes.js
CHANGED
@@ -108,18 +108,6 @@ var MiniProfiler = (function () {
|
|
108
108
|
copy.navigation.redirectCount = clientPerformance.navigation.redirectCount;
|
109
109
|
}
|
110
110
|
clientPerformance = copy;
|
111
|
-
|
112
|
-
// hack to add chrome timings
|
113
|
-
if (window.chrome && window.chrome.loadTimes) {
|
114
|
-
var chromeTimes = window.chrome.loadTimes();
|
115
|
-
if (chromeTimes.firstPaintTime) {
|
116
|
-
clientPerformance.timing["First Paint Time"] = Math.round(chromeTimes.firstPaintTime * 1000);
|
117
|
-
}
|
118
|
-
if (chromeTimes.firstPaintTime) {
|
119
|
-
clientPerformance.timing["First Paint After Load Time"] = Math.round(chromeTimes.firstPaintAfterLoadTime * 1000);
|
120
|
-
}
|
121
|
-
|
122
|
-
}
|
123
111
|
}
|
124
112
|
} else if (ajaxStartTime !== null && clientProbes && clientProbes.length > 0) {
|
125
113
|
clientPerformance = { timing: { navigationStart: ajaxStartTime.getTime() } };
|
@@ -166,7 +154,7 @@ var MiniProfiler = (function () {
|
|
166
154
|
|
167
155
|
totalsControl = $("<div class='profiler-result'><div class='profiler-button profiler-totals'></div></div>");
|
168
156
|
totalsControl.appendTo(container);
|
169
|
-
totalsControl.click
|
157
|
+
totalsControl.on('click', function(){
|
170
158
|
totalsControl.parent().find('.profiler-result').show();
|
171
159
|
totalsControl.hide();
|
172
160
|
expandedResults = true;
|
@@ -192,13 +180,13 @@ var MiniProfiler = (function () {
|
|
192
180
|
popup = result.find('.profiler-popup');
|
193
181
|
|
194
182
|
// button will appear in corner with the total profiling duration - click to show details
|
195
|
-
button.click
|
183
|
+
button.on('click', function () { buttonClick(button, popup); });
|
196
184
|
|
197
185
|
// small duration steps and the column with aggregate durations are hidden by default; allow toggling
|
198
186
|
toggleHidden(popup);
|
199
187
|
|
200
188
|
// lightbox in the queries
|
201
|
-
popup.find('.profiler-queries-show').click
|
189
|
+
popup.find('.profiler-queries-show').on('click', function () { queriesShow($(this), result); });
|
202
190
|
|
203
191
|
// limit count
|
204
192
|
if (container.find('.profiler-result').length > options.maxTracesToShow)
|
@@ -222,7 +210,7 @@ var MiniProfiler = (function () {
|
|
222
210
|
popupPreventHorizontalScroll(popup);
|
223
211
|
};
|
224
212
|
|
225
|
-
childrenTime.add(trivial).add(trivialGaps).click
|
213
|
+
childrenTime.add(trivial).add(trivialGaps).on('click', function () {
|
226
214
|
toggleIt(this);
|
227
215
|
});
|
228
216
|
|
@@ -266,7 +254,7 @@ var MiniProfiler = (function () {
|
|
266
254
|
var popupSetDimensions = function (button, popup) {
|
267
255
|
var px = button.position().top - 1, // position next to the button we clicked
|
268
256
|
windowHeight = $(window).height(),
|
269
|
-
maxHeight = windowHeight -
|
257
|
+
maxHeight = windowHeight - 40; // make sure the popup doesn't extend below the fold
|
270
258
|
|
271
259
|
popup
|
272
260
|
.css(options.renderVerticalPosition, px)
|
@@ -402,6 +390,7 @@ var MiniProfiler = (function () {
|
|
402
390
|
});
|
403
391
|
$(document).on('keydown.mini-profiler', null, options.toggleShortcut, function(e) {
|
404
392
|
$('.profiler-results').toggle();
|
393
|
+
sessionStorage['rack-mini-profiler-start-hidden'] = $('.profiler-results').is(':hidden');
|
405
394
|
});
|
406
395
|
|
407
396
|
if (typeof Turbolinks !== 'undefined' && Turbolinks.supported) {
|
@@ -430,7 +419,7 @@ var MiniProfiler = (function () {
|
|
430
419
|
prettyPrint();
|
431
420
|
|
432
421
|
// since queries are already shown, just highlight and scroll when clicking a "1 sql" link
|
433
|
-
popup.find('.profiler-queries-show').click
|
422
|
+
popup.find('.profiler-queries-show').on('click', function () {
|
434
423
|
queriesScrollIntoView($(this), $('.profiler-queries'), $(document));
|
435
424
|
});
|
436
425
|
});
|
@@ -440,7 +429,7 @@ var MiniProfiler = (function () {
|
|
440
429
|
if (options.showControls) {
|
441
430
|
controls = $('<div class="profiler-controls"><span class="profiler-min-max">m</span><span class="profiler-clear">c</span></div>').appendTo(container);
|
442
431
|
|
443
|
-
$('.profiler-controls .profiler-min-max').click
|
432
|
+
$('.profiler-controls .profiler-min-max').on('click', function () {
|
444
433
|
container.toggleClass('profiler-min');
|
445
434
|
});
|
446
435
|
|
@@ -455,7 +444,7 @@ var MiniProfiler = (function () {
|
|
455
444
|
}
|
456
445
|
});
|
457
446
|
|
458
|
-
$('.profiler-controls .profiler-clear').click
|
447
|
+
$('.profiler-controls .profiler-clear').on('click', function () {
|
459
448
|
container.find('.profiler-result').remove();
|
460
449
|
});
|
461
450
|
}
|
@@ -636,7 +625,7 @@ var MiniProfiler = (function () {
|
|
636
625
|
var children = script.getAttribute('data-children') === 'true';
|
637
626
|
var controls = script.getAttribute('data-controls') === 'true';
|
638
627
|
var authorized = script.getAttribute('data-authorized') === 'true';
|
639
|
-
var startHidden = script.getAttribute('data-start-hidden') === 'true';
|
628
|
+
var startHidden = script.getAttribute('data-start-hidden') === 'true' || sessionStorage['rack-mini-profiler-start-hidden'] === 'true';
|
640
629
|
var htmlContainer = script.getAttribute('data-html-container');
|
641
630
|
|
642
631
|
return {
|
@@ -815,7 +804,7 @@ var MiniProfiler = (function () {
|
|
815
804
|
|
816
805
|
for (var i = 0; i < clientTimings.timings.length; i++) {
|
817
806
|
t = clientTimings.timings[i];
|
818
|
-
var trivial = t.Name != "Dom Complete" && t.Name != "Response"
|
807
|
+
var trivial = t.Name != "Dom Complete" && t.Name != "Response"
|
819
808
|
trivial = t.Duration < 2 ? trivial : false;
|
820
809
|
list.push(
|
821
810
|
{
|
@@ -826,6 +815,22 @@ var MiniProfiler = (function () {
|
|
826
815
|
});
|
827
816
|
}
|
828
817
|
|
818
|
+
|
819
|
+
// Use the Paint Timing API for render performance.
|
820
|
+
if (window.performance) {
|
821
|
+
var firstPaint = window.performance.getEntriesByName("first-paint");
|
822
|
+
|
823
|
+
if(firstPaint !== undefined && firstPaint.length >= 1){
|
824
|
+
list.push(
|
825
|
+
{
|
826
|
+
isTrivial: false,
|
827
|
+
name: "First Paint Time",
|
828
|
+
duration: firstPaint[0].duration,
|
829
|
+
start: firstPaint[0].startTime
|
830
|
+
});
|
831
|
+
}
|
832
|
+
}
|
833
|
+
|
829
834
|
list.sort(function (a, b) { return a.start - b.start; });
|
830
835
|
return list;
|
831
836
|
},
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
class ClientSettings
|
@@ -17,6 +19,8 @@ module Rack
|
|
17
19
|
@cookie = request.cookies[COOKIE_NAME]
|
18
20
|
@store = store
|
19
21
|
@start = start
|
22
|
+
@backtrace_level = nil
|
23
|
+
@orig_disable_profiling = @disable_profiling = nil
|
20
24
|
|
21
25
|
@allowed_tokens, @orig_auth_tokens = nil
|
22
26
|
|
data/lib/mini_profiler/config.rb
CHANGED
@@ -1,37 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
class Config
|
6
|
+
def self.attr_accessor(*vars)
|
7
|
+
@attributes ||= []
|
8
|
+
@attributes.concat vars
|
9
|
+
super(*vars)
|
10
|
+
end
|
4
11
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
super(*vars)
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.attributes
|
12
|
-
@attributes
|
13
|
-
end
|
14
|
-
|
15
|
-
attr_accessor :authorization_mode, :auto_inject, :backtrace_ignores,
|
16
|
-
:backtrace_includes, :backtrace_remove, :backtrace_threshold_ms,
|
17
|
-
:base_url_path, :disable_caching, :disable_env_dump, :enabled,
|
18
|
-
:flamegraph_sample_rate, :logger, :pre_authorize_cb, :skip_paths,
|
19
|
-
:skip_schema_queries, :storage, :storage_failure, :storage_instance,
|
20
|
-
:storage_options, :user_provider
|
21
|
-
attr_accessor :skip_sql_param_names, :suppress_encoding, :max_sql_param_length
|
22
|
-
|
23
|
-
# ui accessors
|
24
|
-
attr_accessor :collapse_results, :max_traces_to_show, :position, :vertical_position, :horizontal_position,
|
25
|
-
:show_children, :show_controls, :show_trivial, :start_hidden,
|
26
|
-
:toggle_shortcut, :html_container
|
27
|
-
|
28
|
-
# Deprecated options
|
29
|
-
attr_accessor :use_existing_jquery
|
12
|
+
def self.attributes
|
13
|
+
@attributes
|
14
|
+
end
|
30
15
|
|
31
16
|
def self.default
|
32
17
|
new.instance_eval {
|
33
18
|
@auto_inject = true # automatically inject on every html page
|
34
|
-
@base_url_path = "/mini-profiler-resources/"
|
19
|
+
@base_url_path = "/mini-profiler-resources/".dup
|
35
20
|
@disable_caching = true
|
36
21
|
# called prior to rack chain, to ensure we are allowed to profile
|
37
22
|
@pre_authorize_cb = lambda {|env| true}
|
@@ -54,20 +39,46 @@ module Rack
|
|
54
39
|
@skip_sql_param_names = /password/ # skips parameters with the name password by default
|
55
40
|
|
56
41
|
# ui parameters
|
57
|
-
@autorized
|
58
|
-
@collapse_results
|
59
|
-
@max_traces_to_show
|
60
|
-
@show_children
|
61
|
-
@show_controls
|
62
|
-
@show_trivial
|
63
|
-
@start_hidden
|
64
|
-
@toggle_shortcut
|
65
|
-
@html_container
|
42
|
+
@autorized = true
|
43
|
+
@collapse_results = true
|
44
|
+
@max_traces_to_show = 20
|
45
|
+
@show_children = false
|
46
|
+
@show_controls = false
|
47
|
+
@show_trivial = false
|
48
|
+
@start_hidden = false
|
49
|
+
@toggle_shortcut = 'Alt+P'
|
50
|
+
@html_container = 'body'
|
51
|
+
@position = "top-left"
|
66
52
|
|
67
53
|
self
|
68
54
|
}
|
69
55
|
end
|
70
56
|
|
57
|
+
attr_accessor :authorization_mode, :auto_inject, :backtrace_ignores,
|
58
|
+
:backtrace_includes, :backtrace_remove, :backtrace_threshold_ms,
|
59
|
+
:base_url_path, :disable_caching, :disable_env_dump, :enabled,
|
60
|
+
:flamegraph_sample_rate, :logger, :pre_authorize_cb, :skip_paths,
|
61
|
+
:skip_schema_queries, :storage, :storage_failure, :storage_instance,
|
62
|
+
:storage_options, :user_provider
|
63
|
+
attr_accessor :skip_sql_param_names, :suppress_encoding, :max_sql_param_length
|
64
|
+
|
65
|
+
# ui accessors
|
66
|
+
attr_accessor :collapse_results, :max_traces_to_show, :position,
|
67
|
+
:show_children, :show_controls, :show_trivial, :start_hidden,
|
68
|
+
:toggle_shortcut, :html_container
|
69
|
+
|
70
|
+
# Deprecated options
|
71
|
+
attr_accessor :use_existing_jquery
|
72
|
+
|
73
|
+
def vertical_position
|
74
|
+
position.include?('bottom') ? 'bottom' : 'top'
|
75
|
+
end
|
76
|
+
|
77
|
+
def horizontal_position
|
78
|
+
position.include?('right') ? 'right' : 'left'
|
79
|
+
end
|
80
|
+
|
81
|
+
|
71
82
|
def merge!(config)
|
72
83
|
if config
|
73
84
|
if Hash === config
|
@@ -79,14 +90,8 @@ module Rack
|
|
79
90
|
}
|
80
91
|
end
|
81
92
|
end
|
82
|
-
set_positions!
|
83
93
|
end
|
84
94
|
|
85
|
-
def set_positions!
|
86
|
-
position = (self.position && self.position.match("-")) ? self.position.split("-") : ["top", "left"]
|
87
|
-
self.vertical_position = position.first
|
88
|
-
self.horizontal_position = position.last
|
89
|
-
end
|
90
95
|
end
|
91
96
|
end
|
92
97
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
class << self
|
@@ -109,12 +111,13 @@ module Rack
|
|
109
111
|
end
|
110
112
|
|
111
113
|
def generate_html(page_struct, env, result_json = page_struct.to_json)
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
114
|
+
# double-assigning to suppress "assigned but unused variable" warnings
|
115
|
+
path = path = "#{env['RACK_MINI_PROFILER_ORIGINAL_SCRIPT_NAME']}#{@config.base_url_path}"
|
116
|
+
version = version = MiniProfiler::ASSET_VERSION
|
117
|
+
json = json = result_json
|
118
|
+
includes = includes = get_profile_script(env)
|
119
|
+
name = name = page_struct[:name]
|
120
|
+
duration = duration = page_struct.duration_ms.round(1).to_s
|
118
121
|
|
119
122
|
MiniProfiler.share_template.result(binding)
|
120
123
|
end
|
@@ -406,13 +409,13 @@ module Rack
|
|
406
409
|
end
|
407
410
|
|
408
411
|
def dump_exceptions(exceptions)
|
409
|
-
body = "Exceptions raised during request\n\n"
|
412
|
+
body = "Exceptions raised during request\n\n".dup
|
410
413
|
if exceptions.empty?
|
411
414
|
body << "No exceptions raised"
|
412
415
|
else
|
413
416
|
body << "Exceptions: (#{exceptions.size} total)\n"
|
414
|
-
exceptions.group_by(&:class).each do |klass,
|
415
|
-
body << " #{klass.name} (#{
|
417
|
+
exceptions.group_by(&:class).each do |klass, exceptions_per_class|
|
418
|
+
body << " #{klass.name} (#{exceptions_per_class.size})\n"
|
416
419
|
end
|
417
420
|
|
418
421
|
body << "\nBacktraces\n"
|
@@ -424,7 +427,7 @@ module Rack
|
|
424
427
|
end
|
425
428
|
|
426
429
|
def dump_env(env)
|
427
|
-
body = "Rack Environment\n---------------\n"
|
430
|
+
body = "Rack Environment\n---------------\n".dup
|
428
431
|
env.each do |k,v|
|
429
432
|
body << "#{k}: #{v}\n"
|
430
433
|
end
|
@@ -475,7 +478,7 @@ module Rack
|
|
475
478
|
str
|
476
479
|
end
|
477
480
|
|
478
|
-
body = "ObjectSpace stats:\n\n"
|
481
|
+
body = "ObjectSpace stats:\n\n".dup
|
479
482
|
|
480
483
|
counts = ObjectSpace.count_objects
|
481
484
|
total_strings = counts[:T_STRING]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
class FileStore < AbstractStore
|
@@ -16,7 +18,7 @@ module Rack
|
|
16
18
|
begin
|
17
19
|
data = ::File.open(path(key),"rb") {|f| f.read}
|
18
20
|
return Marshal.load data
|
19
|
-
rescue
|
21
|
+
rescue
|
20
22
|
return nil
|
21
23
|
end
|
22
24
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
class MemoryStore < AbstractStore
|
@@ -50,7 +52,7 @@ module Rack
|
|
50
52
|
args ||= {}
|
51
53
|
@expires_in_seconds = args.fetch(:expires_in) { EXPIRES_IN_SECONDS }
|
52
54
|
|
53
|
-
@token1, @token2, @
|
55
|
+
@token1, @token2, @cycle_at = nil
|
54
56
|
|
55
57
|
initialize_locks
|
56
58
|
initialize_cleanup_thread(args)
|
@@ -68,7 +70,7 @@ module Rack
|
|
68
70
|
def initialize_cleanup_thread(args={})
|
69
71
|
cleanup_interval = args.fetch(:cleanup_interval) { CLEANUP_INTERVAL }
|
70
72
|
cleanup_cycle = args.fetch(:cleanup_cycle) { CLEANUP_CYCLE }
|
71
|
-
t = CacheCleanupThread.new(cleanup_interval, cleanup_cycle, self) do
|
73
|
+
t = CacheCleanupThread.new(cleanup_interval, cleanup_cycle, self) do
|
72
74
|
until Thread.current[:should_exit] do
|
73
75
|
CacheCleanupThread.current.sleepy_run
|
74
76
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
module TimerStruct
|
@@ -15,7 +17,7 @@ module Rack
|
|
15
17
|
|
16
18
|
# used by Railtie to instrument asset_tag for JS / CSS
|
17
19
|
def self.instrument(name, orig)
|
18
|
-
probe = "<script>mPt.probe('#{name}')</script>"
|
20
|
+
probe = "<script>mPt.probe('#{name}')</script>".dup
|
19
21
|
wrapped = probe
|
20
22
|
wrapped << orig
|
21
23
|
wrapped << probe
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Rack
|
2
4
|
class MiniProfiler
|
3
5
|
module TimerStruct
|
@@ -11,12 +13,14 @@ module Rack
|
|
11
13
|
def initialize(env)
|
12
14
|
timer_id = MiniProfiler.generate_id
|
13
15
|
page_name = env['PATH_INFO']
|
14
|
-
started_at = (
|
16
|
+
started_at = (Time.now.to_f * 1000).to_i
|
17
|
+
started = (Process.clock_gettime(Process::CLOCK_MONOTONIC) * 1000).to_i
|
15
18
|
machine_name = env['SERVER_NAME']
|
16
19
|
super(
|
17
20
|
:id => timer_id,
|
18
21
|
:name => page_name,
|
19
|
-
:started =>
|
22
|
+
:started => started,
|
23
|
+
:started_at => started_at,
|
20
24
|
:machine_name => machine_name,
|
21
25
|
:level => 0,
|
22
26
|
:user => "unknown user",
|
@@ -66,7 +70,7 @@ module Rack
|
|
66
70
|
|
67
71
|
def extra_json
|
68
72
|
{
|
69
|
-
:started => '/Date(%d)/' % @attributes
|
73
|
+
:started => '/Date(%d)/' % @attributes.delete(:started_at),
|
70
74
|
:duration_milliseconds => @attributes[:root][:duration_milliseconds],
|
71
75
|
:custom_timing_names => @attributes[:custom_timing_stats].keys.sort
|
72
76
|
}
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Rack
|
3
4
|
class MiniProfiler
|
4
5
|
|
@@ -10,7 +11,7 @@ module Rack
|
|
10
11
|
stack_trace = nil
|
11
12
|
unless skip_backtrace || duration_ms < Rack::MiniProfiler.config.backtrace_threshold_ms
|
12
13
|
# Allow us to filter the stack trace
|
13
|
-
stack_trace =
|
14
|
+
stack_trace = "".dup
|
14
15
|
# Clean up the stack trace if there are options to do so
|
15
16
|
Kernel.caller.each do |ln|
|
16
17
|
ln.gsub!(Rack::MiniProfiler.config.backtrace_remove, '') if Rack::MiniProfiler.config.backtrace_remove and !full_backtrace
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
|
3
5
|
module Rack::MiniProfilerRails
|
@@ -5,7 +7,7 @@ module Rack::MiniProfilerRails
|
|
5
7
|
# call direct if needed to do a defer init
|
6
8
|
def self.initialize!(app)
|
7
9
|
|
8
|
-
raise "MiniProfilerRails initialized twice. Set `require: false' for rack-mini-profiler in your Gemfile" if @already_initialized
|
10
|
+
raise "MiniProfilerRails initialized twice. Set `require: false' for rack-mini-profiler in your Gemfile" if defined?(@already_initialized) && @already_initialized
|
9
11
|
|
10
12
|
c = Rack::MiniProfiler.config
|
11
13
|
|
data/lib/patches/db/mongo.rb
CHANGED
data/lib/patches/db/moped.rb
CHANGED
data/lib/patches/db/mysql2.rb
CHANGED
data/lib/patches/db/neo4j.rb
CHANGED
data/lib/patches/db/nobrainer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Rack::MiniProfiler::NoBrainerProfiler
|
2
4
|
|
3
5
|
def on_query(env)
|
@@ -6,7 +8,7 @@ class Rack::MiniProfiler::NoBrainerProfiler
|
|
6
8
|
!env[:criteria].where_indexed? &&
|
7
9
|
!env[:criteria].model.try(:perf_warnings_disabled)
|
8
10
|
|
9
|
-
query = ""
|
11
|
+
query = "".dup
|
10
12
|
|
11
13
|
# per-model/query database overrides
|
12
14
|
query << "[#{env[:options][:db]}] " if env[:options][:db]
|
data/lib/patches/db/pg.rb
CHANGED
data/lib/patches/db/plucky.rb
CHANGED
data/lib/patches/db/riak.rb
CHANGED
data/lib/patches/db/rsolr.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class RSolr::Connection
|
2
4
|
alias_method :execute_without_profiling, :execute
|
3
5
|
def execute_with_profiling(client, request_context)
|
@@ -7,7 +9,7 @@ class RSolr::Connection
|
|
7
9
|
result = execute_without_profiling(client, request_context)
|
8
10
|
elapsed_time = SqlPatches.elapsed_time(start)
|
9
11
|
|
10
|
-
data = "#{request_context[:method].upcase} #{request_context[:uri]}"
|
12
|
+
data = "#{request_context[:method].upcase} #{request_context[:uri]}".dup
|
11
13
|
if request_context[:method] == :post and request_context[:data]
|
12
14
|
if request_context[:headers].include?("Content-Type") and request_context[:headers]["Content-Type"] == "text/xml"
|
13
15
|
# it's xml, unescaping isn't needed
|
data/lib/patches/db/sequel.rb
CHANGED
data/lib/patches/net_patches.rb
CHANGED
data/lib/patches/sql_patches.rb
CHANGED
data/lib/rack-mini-profiler.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'json'
|
2
4
|
require 'timeout'
|
3
5
|
require 'thread'
|
@@ -25,8 +27,6 @@ require 'mini_profiler/context'
|
|
25
27
|
require 'mini_profiler/client_settings'
|
26
28
|
require 'mini_profiler/gc_profiler'
|
27
29
|
require 'mini_profiler/profiler'
|
28
|
-
# TODO
|
29
|
-
# require 'mini_profiler/gc_profiler_ruby_head' if Gem::Version.new('2.1.0') <= Gem::Version.new(RUBY_VERSION)
|
30
30
|
|
31
31
|
require 'patches/sql_patches'
|
32
32
|
require 'patches/net_patches'
|
data/rack-mini-profiler.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
"CHANGELOG.md"
|
20
20
|
]
|
21
21
|
s.add_runtime_dependency 'rack', '>= 1.2.0'
|
22
|
-
s.required_ruby_version = '>=
|
22
|
+
s.required_ruby_version = '>= 2.2.0'
|
23
23
|
|
24
24
|
s.metadata = {
|
25
25
|
'source_code_uri' => 'https://github.com/MiniProfiler/rack-mini-profiler',
|
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: 0.
|
4
|
+
version: 1.0.0
|
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: 2018-03-29 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -213,7 +213,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
213
213
|
requirements:
|
214
214
|
- - ">="
|
215
215
|
- !ruby/object:Gem::Version
|
216
|
-
version:
|
216
|
+
version: 2.2.0
|
217
217
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
218
218
|
requirements:
|
219
219
|
- - ">="
|