rack-mini-profiler 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +10 -0
- data/README.md +2 -1
- data/lib/html/includes.css +5 -5
- data/lib/html/includes.js +38 -3
- data/lib/html/includes.scss +1 -1
- data/lib/html/includes.tmpl +5 -0
- data/lib/html/profile_handler.js +1 -1
- data/lib/mini_profiler/asset_version.rb +1 -1
- data/lib/mini_profiler/client_settings.rb +11 -12
- data/lib/mini_profiler/config.rb +17 -17
- data/lib/mini_profiler/context.rb +3 -3
- data/lib/mini_profiler/gc_profiler.rb +15 -16
- data/lib/mini_profiler/profiler.rb +50 -54
- data/lib/mini_profiler/profiling_methods.rb +4 -4
- data/lib/mini_profiler/storage/file_store.rb +10 -7
- data/lib/mini_profiler/storage/memcache_store.rb +4 -5
- data/lib/mini_profiler/storage/memory_store.rb +2 -3
- data/lib/mini_profiler/storage/redis_store.rb +2 -2
- data/lib/mini_profiler/timer_struct/base.rb +2 -2
- data/lib/mini_profiler/timer_struct/client.rb +6 -7
- data/lib/mini_profiler/timer_struct/custom.rb +4 -4
- data/lib/mini_profiler/timer_struct/page.rb +26 -25
- data/lib/mini_profiler/timer_struct/request.rb +25 -24
- data/lib/mini_profiler/timer_struct/sql.rb +20 -20
- data/lib/mini_profiler/version.rb +1 -1
- data/lib/mini_profiler_rails/railtie.rb +3 -3
- data/lib/patches/db/activerecord.rb +2 -2
- data/lib/patches/db/moped.rb +2 -2
- data/lib/patches/db/mysql2.rb +5 -5
- data/lib/patches/db/nobrainer.rb +1 -1
- data/lib/patches/db/pg.rb +34 -16
- data/lib/patches/db/riak.rb +11 -11
- data/lib/patches/db/rsolr.rb +2 -2
- data/rack-mini-profiler.gemspec +5 -4
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e7c0f5a071d07b17ed627b9c25ca3fa6a60f9670178e990fa8d84e7f826c05ff
|
4
|
+
data.tar.gz: 94c852d1876cf526cf1f771bb609d6f6993f5d1827da16861128351b59ee0f83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f53c37831ae521bfc0f79dc375595f76165499b76ca60191f5ba88cf811f68abe2c787e548010c68fd209b0b156e06ba6f54b40d10dd24b1297622aefeb80c58
|
7
|
+
data.tar.gz: 471f7506b95eefc6e9f182a88baa8ef9bd8f613557619d3c34ce7f4d1831026f48ba61da7160dcb3ae7adca4dbf5d33766bbba48880a84633ee7692a2ae9ad1f
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# CHANGELOG
|
2
2
|
|
3
|
+
## 1.0.1 2018-12-10
|
4
|
+
|
5
|
+
- [FIX] add support for exec_params instrumentation in PG, this method as of PG 1.1.0 no longer
|
6
|
+
routes calls to exec / async_exec
|
7
|
+
- [FIX] add missing started_at on requests
|
8
|
+
- [UX] amend colors so we pass lighthouse
|
9
|
+
- [FEATURE] fetch API support
|
10
|
+
- [FIX] getEntriesByName is missing in iOS, workaround
|
11
|
+
- [FEATURE] drop support for Ruby 2.2.0 we require 2.3.0 and up (EOL Ruby no longer supported)
|
12
|
+
|
3
13
|
## 1.0.0 2017-03-29
|
4
14
|
|
5
15
|
- [BREAKING CHANGE] Ruby version 2.2.0 or later is required
|
data/README.md
CHANGED
@@ -30,7 +30,7 @@ If you feel like taking on any of this start an issue and update us on your prog
|
|
30
30
|
|
31
31
|
## Installation
|
32
32
|
|
33
|
-
Install/add to Gemfile in Ruby 2.
|
33
|
+
Install/add to Gemfile in Ruby 2.3+
|
34
34
|
|
35
35
|
```ruby
|
36
36
|
gem 'rack-mini-profiler'
|
@@ -321,6 +321,7 @@ base_url_path|`'/mini-profiler-resources/'`|Path for assets; added as a prefix w
|
|
321
321
|
collapse_results|`true`|If multiple timing results exist in a single page, collapse them till clicked.
|
322
322
|
max_traces_to_show|20|Maximum number of mini profiler timing blocks to show on one page
|
323
323
|
html_container|`body`|The HTML container (as a jQuery selector) to inject the mini_profiler UI into
|
324
|
+
show_total_sql_count|`false`|Displays the total number of SQL executions.
|
324
325
|
|
325
326
|
### Custom middleware ordering (required if using `Rack::Deflate` with Rails)
|
326
327
|
|
data/lib/html/includes.css
CHANGED
@@ -35,11 +35,11 @@
|
|
35
35
|
overflow: hidden;
|
36
36
|
text-overflow: ellipsis; }
|
37
37
|
.profiler-result .profiler-unit {
|
38
|
-
color: #
|
38
|
+
color: #767676; }
|
39
39
|
.profiler-result .profiler-trivial {
|
40
40
|
display: none; }
|
41
41
|
.profiler-result .profiler-trivial td, .profiler-result .profiler-trivial td * {
|
42
|
-
color: #
|
42
|
+
color: #767676 !important; }
|
43
43
|
.profiler-result pre, .profiler-result code, .profiler-result .profiler-number, .profiler-result .profiler-unit {
|
44
44
|
font-family: Consolas, monospace, serif; }
|
45
45
|
.profiler-result .profiler-number {
|
@@ -52,7 +52,7 @@
|
|
52
52
|
white-space: nowrap; }
|
53
53
|
.profiler-result .profiler-timings th {
|
54
54
|
background-color: #fff;
|
55
|
-
color: #
|
55
|
+
color: #767676;
|
56
56
|
text-align: right; }
|
57
57
|
.profiler-result .profiler-timings th, .profiler-result .profiler-timings td {
|
58
58
|
white-space: nowrap; }
|
@@ -228,7 +228,7 @@
|
|
228
228
|
cursor: default;
|
229
229
|
text-align: center; }
|
230
230
|
.profiler-results .profiler-controls span {
|
231
|
-
border-right: 1px solid #
|
231
|
+
border-right: 1px solid #767676;
|
232
232
|
padding-right: 5px;
|
233
233
|
margin-right: 5px;
|
234
234
|
cursor: pointer; }
|
@@ -306,7 +306,7 @@
|
|
306
306
|
display: none; }
|
307
307
|
.profiler-result-full .profiler-result .profiler-popup .profiler-info {
|
308
308
|
font-size: 25px;
|
309
|
-
border-bottom: 1px solid #
|
309
|
+
border-bottom: 1px solid #767676;
|
310
310
|
padding-bottom: 3px;
|
311
311
|
margin-bottom: 25px; }
|
312
312
|
.profiler-result-full .profiler-result .profiler-popup .profiler-info .profiler-overall-duration {
|
data/lib/html/includes.js
CHANGED
@@ -11,7 +11,8 @@ var MiniProfiler = (function () {
|
|
11
11
|
totalsControl,
|
12
12
|
reqs = 0,
|
13
13
|
expandedResults = false,
|
14
|
-
totalTime = 0
|
14
|
+
totalTime = 0,
|
15
|
+
totalSqlCount = 0
|
15
16
|
;
|
16
17
|
|
17
18
|
var hasLocalStorage = function (keyPrefix) {
|
@@ -146,6 +147,7 @@ var MiniProfiler = (function () {
|
|
146
147
|
var result = renderTemplate(json);
|
147
148
|
|
148
149
|
totalTime += parseFloat(json.duration_milliseconds, 10);
|
150
|
+
totalSqlCount += parseInt(json.sql_count);
|
149
151
|
reqs++;
|
150
152
|
|
151
153
|
if (!controls && reqs > 1 && options.collapseResults && !expandedResults) {
|
@@ -164,8 +166,10 @@ var MiniProfiler = (function () {
|
|
164
166
|
}
|
165
167
|
|
166
168
|
var reqsHtml = reqs > 1 ? ("<span class='profiler-reqs'>" + reqs + "</span>") : "";
|
169
|
+
var sqlHtml = options.showTotalSqlCount && totalSqlCount > 0 ? (" / <span class='profiler-number'>" + totalSqlCount + "</span> <span class='profiler-unit'>sql</span>") : "";
|
167
170
|
totalsControl.find('.profiler-button').html("<span class='profiler-number'>" +
|
168
171
|
totalTime.toFixed(1) + "</span> <span class='profiler-unit'>ms</span>" +
|
172
|
+
sqlHtml +
|
169
173
|
reqsHtml);
|
170
174
|
|
171
175
|
result.hide();
|
@@ -592,6 +596,31 @@ var MiniProfiler = (function () {
|
|
592
596
|
};
|
593
597
|
}
|
594
598
|
|
599
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
|
600
|
+
if(typeof(window.fetch) === 'function' && window.fetch.__patchedByMiniProfiler === undefined) {
|
601
|
+
var __originalFetch = window.fetch;
|
602
|
+
|
603
|
+
window.fetch = function(input,init) {
|
604
|
+
return new Promise(function(resolve,reject) {
|
605
|
+
__originalFetch(input,init).then(function(response) {
|
606
|
+
// look for x-mini-profile-ids
|
607
|
+
var entries = response.headers.entries();
|
608
|
+
for (var i = 0; i < entries.length; i++) {
|
609
|
+
var pair = entries[i];
|
610
|
+
if(pair[0] && (pair[0].toLowerCase() == 'x-miniprofiler-ids')) {
|
611
|
+
var ids = JSON.parse(pair[1]);
|
612
|
+
fetchResults(ids);
|
613
|
+
}
|
614
|
+
}
|
615
|
+
resolve(response);
|
616
|
+
}).catch(function(error) {
|
617
|
+
reject(error);
|
618
|
+
});
|
619
|
+
});
|
620
|
+
}
|
621
|
+
window.fetch.__patchedByMiniProfiler = true;
|
622
|
+
}
|
623
|
+
|
595
624
|
// some elements want to be hidden on certain doc events
|
596
625
|
bindDocumentEvents();
|
597
626
|
};
|
@@ -624,6 +653,7 @@ var MiniProfiler = (function () {
|
|
624
653
|
var trivial = script.getAttribute('data-trivial') === 'true';
|
625
654
|
var children = script.getAttribute('data-children') === 'true';
|
626
655
|
var controls = script.getAttribute('data-controls') === 'true';
|
656
|
+
var totalSqlCount = script.getAttribute('data-total-sql-count') === 'true';
|
627
657
|
var authorized = script.getAttribute('data-authorized') === 'true';
|
628
658
|
var startHidden = script.getAttribute('data-start-hidden') === 'true' || sessionStorage['rack-mini-profiler-start-hidden'] === 'true';
|
629
659
|
var htmlContainer = script.getAttribute('data-html-container');
|
@@ -638,6 +668,7 @@ var MiniProfiler = (function () {
|
|
638
668
|
showChildrenTime: children,
|
639
669
|
maxTracesToShow: maxTraces,
|
640
670
|
showControls: controls,
|
671
|
+
showTotalSqlCount: totalSqlCount,
|
641
672
|
currentId: currentId,
|
642
673
|
authorized: authorized,
|
643
674
|
toggleShortcut: toggleShortcut,
|
@@ -817,9 +848,9 @@ var MiniProfiler = (function () {
|
|
817
848
|
|
818
849
|
|
819
850
|
// Use the Paint Timing API for render performance.
|
820
|
-
if (window.performance) {
|
851
|
+
if (window.performance && window.performance.getEntriesByName) {
|
821
852
|
var firstPaint = window.performance.getEntriesByName("first-paint");
|
822
|
-
|
853
|
+
|
823
854
|
if(firstPaint !== undefined && firstPaint.length >= 1){
|
824
855
|
list.push(
|
825
856
|
{
|
@@ -1011,6 +1042,10 @@ var MiniProfiler = (function () {
|
|
1011
1042
|
|
1012
1043
|
formatDuration: function (duration) {
|
1013
1044
|
return (duration || 0).toFixed(1);
|
1045
|
+
},
|
1046
|
+
|
1047
|
+
showTotalSqlCount: function () {
|
1048
|
+
return options.showTotalSqlCount
|
1014
1049
|
}
|
1015
1050
|
};
|
1016
1051
|
})();
|
data/lib/html/includes.scss
CHANGED
@@ -8,7 +8,7 @@ $anchorColor: #0077CC;
|
|
8
8
|
$buttonBorderColor: #888;
|
9
9
|
$numberColor: #111;
|
10
10
|
$textColor: #555;
|
11
|
-
$mutedColor: #
|
11
|
+
$mutedColor: #767676;
|
12
12
|
$normalFonts: Helvetica, Arial, sans-serif;
|
13
13
|
$codeFonts: Consolas, monospace, serif;
|
14
14
|
$zindex:2147483640; // near 32bit max 2147483647
|
data/lib/html/includes.tmpl
CHANGED
@@ -7,6 +7,11 @@
|
|
7
7
|
<span class="profiler-number">
|
8
8
|
${MiniProfiler.formatDuration(duration_milliseconds)} <span class="profiler-unit">ms</span>
|
9
9
|
</span>
|
10
|
+
{{if MiniProfiler.showTotalSqlCount()}}
|
11
|
+
<span class="profiler-number">
|
12
|
+
${sql_count} <span class="profiler-unit">sql</span>
|
13
|
+
</span>
|
14
|
+
{{/if}}
|
10
15
|
</div>
|
11
16
|
|
12
17
|
<div class="profiler-popup">
|
data/lib/html/profile_handler.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
<script async type="text/javascript" id="mini-profiler" src="{path}includes.js?v={version}" data-version="{version}" data-path="{path}" data-current-id="{currentId}" data-ids="{ids}" data-horizontal-position="{horizontalPosition}" data-vertical-position="{verticalPosition}" data-trivial="{showTrivial}" data-children="{showChildren}" data-max-traces="{maxTracesToShow}" data-controls="{showControls}" data-authorized="{authorized}" data-toggle-shortcut="{toggleShortcut}" data-start-hidden="{startHidden}" data-collapse-results="{collapseResults}" data-html-container="{htmlContainer}"></script>
|
1
|
+
<script async type="text/javascript" id="mini-profiler" src="{path}includes.js?v={version}" data-version="{version}" data-path="{path}" data-current-id="{currentId}" data-ids="{ids}" data-horizontal-position="{horizontalPosition}" data-vertical-position="{verticalPosition}" data-trivial="{showTrivial}" data-children="{showChildren}" data-max-traces="{maxTracesToShow}" data-controls="{showControls}" data-total-sql-count="{showTotalSqlCount}" data-authorized="{authorized}" data-toggle-shortcut="{toggleShortcut}" data-start-hidden="{startHidden}" data-collapse-results="{collapseResults}" data-html-container="{htmlContainer}"></script>
|
@@ -13,10 +13,9 @@ module Rack
|
|
13
13
|
attr_accessor :disable_profiling
|
14
14
|
attr_accessor :backtrace_level
|
15
15
|
|
16
|
-
|
17
16
|
def initialize(env, store, start)
|
18
|
-
request = ::Rack::Request.new(env)
|
19
|
-
@cookie = request.cookies[COOKIE_NAME]
|
17
|
+
@request = ::Rack::Request.new(env)
|
18
|
+
@cookie = @request.cookies[COOKIE_NAME]
|
20
19
|
@store = store
|
21
20
|
@start = start
|
22
21
|
@backtrace_level = nil
|
@@ -25,8 +24,8 @@ module Rack
|
|
25
24
|
@allowed_tokens, @orig_auth_tokens = nil
|
26
25
|
|
27
26
|
if @cookie
|
28
|
-
@cookie.split(",").map{|pair| pair.split("=")}.each do |k,v|
|
29
|
-
@orig_disable_profiling = @disable_profiling = (v=='t') if k == "dp"
|
27
|
+
@cookie.split(",").map { |pair| pair.split("=") }.each do |k, v|
|
28
|
+
@orig_disable_profiling = @disable_profiling = (v == 't') if k == "dp"
|
30
29
|
@backtrace_level = v.to_i if k == "bt"
|
31
30
|
@orig_auth_tokens = v.to_s.split("|") if k == "a"
|
32
31
|
end
|
@@ -41,7 +40,7 @@ module Rack
|
|
41
40
|
end
|
42
41
|
|
43
42
|
def handle_cookie(result)
|
44
|
-
status,headers,_body = result
|
43
|
+
status, headers, _body = result
|
45
44
|
|
46
45
|
if (MiniProfiler.config.authorization_mode == :whitelist && !MiniProfiler.request_authorized?)
|
47
46
|
# this is non-obvious, don't kill the profiling cookie on errors or short requests
|
@@ -70,19 +69,20 @@ module Rack
|
|
70
69
|
@cookie.nil? ||
|
71
70
|
tokens_changed
|
72
71
|
|
73
|
-
settings = {"p" =>
|
72
|
+
settings = { "p" => "t" }
|
74
73
|
settings["dp"] = "t" if @disable_profiling
|
75
74
|
settings["bt"] = @backtrace_level if @backtrace_level
|
76
75
|
settings["a"] = @allowed_tokens.join("|") if @allowed_tokens && MiniProfiler.request_authorized?
|
77
|
-
|
78
|
-
|
79
|
-
|
76
|
+
settings_string = settings.map { |k, v| "#{k}=#{v}" }.join(",")
|
77
|
+
cookie = { value: settings_string, path: '/', httponly: true }
|
78
|
+
cookie[:secure] = true if @request.ssl?
|
79
|
+
Rack::Utils.set_cookie_header!(headers, COOKIE_NAME, cookie)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
83
|
def discard_cookie!(headers)
|
84
84
|
if @cookie
|
85
|
-
Rack::Utils.delete_cookie_header!(headers, COOKIE_NAME, :
|
85
|
+
Rack::Utils.delete_cookie_header!(headers, COOKIE_NAME, path: '/')
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -99,7 +99,6 @@ module Rack
|
|
99
99
|
valid_cookie
|
100
100
|
end
|
101
101
|
|
102
|
-
|
103
102
|
def disable_profiling?
|
104
103
|
@disable_profiling
|
105
104
|
end
|
data/lib/mini_profiler/config.rb
CHANGED
@@ -19,12 +19,12 @@ module Rack
|
|
19
19
|
@base_url_path = "/mini-profiler-resources/".dup
|
20
20
|
@disable_caching = true
|
21
21
|
# called prior to rack chain, to ensure we are allowed to profile
|
22
|
-
@pre_authorize_cb = lambda {|env| true}
|
22
|
+
@pre_authorize_cb = lambda { |env| true }
|
23
23
|
|
24
24
|
# called after rack chain, to ensure we are REALLY allowed to profile
|
25
25
|
@skip_schema_queries = false
|
26
26
|
@storage = MiniProfiler::MemoryStore
|
27
|
-
@user_provider = Proc.new{|env| Rack::Request.new(env).ip}
|
27
|
+
@user_provider = Proc.new { |env| Rack::Request.new(env).ip }
|
28
28
|
@authorization_mode = :allow_all
|
29
29
|
@backtrace_threshold_ms = 0
|
30
30
|
@flamegraph_sample_rate = 0.5
|
@@ -39,16 +39,17 @@ module Rack
|
|
39
39
|
@skip_sql_param_names = /password/ # skips parameters with the name password by default
|
40
40
|
|
41
41
|
# ui parameters
|
42
|
-
@autorized
|
43
|
-
@collapse_results
|
44
|
-
@max_traces_to_show
|
45
|
-
@show_children
|
46
|
-
@show_controls
|
47
|
-
@show_trivial
|
48
|
-
@
|
49
|
-
@
|
50
|
-
@
|
51
|
-
@
|
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
|
+
@show_total_sql_count = false
|
49
|
+
@start_hidden = false
|
50
|
+
@toggle_shortcut = 'Alt+P'
|
51
|
+
@html_container = 'body'
|
52
|
+
@position = "top-left"
|
52
53
|
|
53
54
|
self
|
54
55
|
}
|
@@ -64,8 +65,8 @@ module Rack
|
|
64
65
|
|
65
66
|
# ui accessors
|
66
67
|
attr_accessor :collapse_results, :max_traces_to_show, :position,
|
67
|
-
:show_children, :show_controls, :show_trivial, :
|
68
|
-
:toggle_shortcut, :html_container
|
68
|
+
:show_children, :show_controls, :show_trivial, :show_total_sql_count,
|
69
|
+
:start_hidden, :toggle_shortcut, :html_container
|
69
70
|
|
70
71
|
# Deprecated options
|
71
72
|
attr_accessor :use_existing_jquery
|
@@ -78,13 +79,12 @@ module Rack
|
|
78
79
|
position.include?('right') ? 'right' : 'left'
|
79
80
|
end
|
80
81
|
|
81
|
-
|
82
82
|
def merge!(config)
|
83
83
|
if config
|
84
84
|
if Hash === config
|
85
|
-
config.each{|k,v| instance_variable_set "@#{k}",v}
|
85
|
+
config.each { |k, v| instance_variable_set "@#{k}", v }
|
86
86
|
else
|
87
|
-
self.class.attributes.each{ |k|
|
87
|
+
self.class.attributes.each { |k|
|
88
88
|
v = config.send k
|
89
89
|
instance_variable_set "@#{k}", v if v
|
90
90
|
}
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Rack::MiniProfiler::Context
|
4
|
-
attr_accessor :inject_js
|
5
|
-
:full_backtrace
|
4
|
+
attr_accessor :inject_js, :current_timer, :page_struct, :skip_backtrace,
|
5
|
+
:full_backtrace, :discard, :mpt_init, :measure
|
6
6
|
|
7
7
|
def initialize(opts = {})
|
8
8
|
opts["measure"] = true unless opts.key? "measure"
|
9
|
-
opts.each do |k,v|
|
9
|
+
opts.each do |k, v|
|
10
10
|
self.instance_variable_set('@' + k, v)
|
11
11
|
end
|
12
12
|
end
|
@@ -30,7 +30,7 @@ class Rack::MiniProfiler::GCProfiler
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
result = {:
|
33
|
+
result = { stats: stats, ids: ids }
|
34
34
|
@ignore << result.__id__
|
35
35
|
|
36
36
|
result
|
@@ -38,10 +38,10 @@ class Rack::MiniProfiler::GCProfiler
|
|
38
38
|
|
39
39
|
def diff_object_stats(before, after)
|
40
40
|
diff = {}.compare_by_identity
|
41
|
-
after.each do |k,v|
|
41
|
+
after.each do |k, v|
|
42
42
|
diff[k] = v - before[k]
|
43
43
|
end
|
44
|
-
before.each do |k,v|
|
44
|
+
before.each do |k, v|
|
45
45
|
diff[k] = 0 - v unless after.has_key?(k)
|
46
46
|
end
|
47
47
|
|
@@ -50,7 +50,7 @@ class Rack::MiniProfiler::GCProfiler
|
|
50
50
|
|
51
51
|
def analyze_strings(ids_before, ids_after)
|
52
52
|
result = {}
|
53
|
-
ids_after.each do |id,_|
|
53
|
+
ids_after.each do |id, _|
|
54
54
|
obj = ObjectSpace._id2ref(id)
|
55
55
|
if String === obj && !ids_before.include?(obj.object_id)
|
56
56
|
result[obj] ||= 0
|
@@ -64,8 +64,8 @@ class Rack::MiniProfiler::GCProfiler
|
|
64
64
|
new_objects = 0
|
65
65
|
memory_allocated = 0
|
66
66
|
|
67
|
-
ids_after.each do |id,_|
|
68
|
-
if !ids_before.include?(id) && obj=ObjectSpace._id2ref(id)
|
67
|
+
ids_after.each do |id, _|
|
68
|
+
if !ids_before.include?(id) && obj = ObjectSpace._id2ref(id)
|
69
69
|
# this is going to be version specific (may change in 2.1)
|
70
70
|
size = ObjectSpace.memsize_of(obj)
|
71
71
|
memory_allocated += size
|
@@ -80,15 +80,15 @@ class Rack::MiniProfiler::GCProfiler
|
|
80
80
|
memory_allocated = 0
|
81
81
|
objects = 0
|
82
82
|
|
83
|
-
ids_before.each do |id,_|
|
84
|
-
if obj=ObjectSpace._id2ref(id)
|
83
|
+
ids_before.each do |id, _|
|
84
|
+
if obj = ObjectSpace._id2ref(id)
|
85
85
|
# this is going to be version specific (may change in 2.1)
|
86
86
|
memory_allocated += ObjectSpace.memsize_of(obj)
|
87
87
|
objects += 1
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
-
[objects,memory_allocated]
|
91
|
+
[objects, memory_allocated]
|
92
92
|
end
|
93
93
|
|
94
94
|
def profile_gc(app, env)
|
@@ -107,7 +107,7 @@ class Rack::MiniProfiler::GCProfiler
|
|
107
107
|
# so we don't blow out on memory
|
108
108
|
prev_gc_state ? GC.disable : GC.enable
|
109
109
|
|
110
|
-
diff = diff_object_stats(stat_before[:stats],stat_after[:stats])
|
110
|
+
diff = diff_object_stats(stat_before[:stats], stat_after[:stats])
|
111
111
|
string_analysis = analyze_strings(stat_before[:ids], stat_after[:ids])
|
112
112
|
new_objects, memory_allocated = analyze_growth(stat_before[:ids], stat_after[:ids])
|
113
113
|
objects_before, memory_before = analyze_initial_state(stat_before[:ids])
|
@@ -122,7 +122,7 @@ Memory allocated outside heap (bytes): #{memory_before}
|
|
122
122
|
|
123
123
|
GC Stats:
|
124
124
|
--------
|
125
|
-
#{stat.map{|k,v| "#{k} : #{v}" }.sort!.join("\n")}
|
125
|
+
#{stat.map { |k, v| "#{k} : #{v}" }.sort!.join("\n")}
|
126
126
|
|
127
127
|
New bytes allocated outside of Ruby heaps: #{memory_allocated}
|
128
128
|
New objects: #{new_objects}
|
@@ -131,7 +131,7 @@ New objects: #{new_objects}
|
|
131
131
|
body << "
|
132
132
|
ObjectSpace delta caused by request:
|
133
133
|
-----------------------------------\n"
|
134
|
-
diff.to_a.delete_if{|_k, v| v == 0}.sort_by! { |_k, v| v }.reverse_each do |k,v|
|
134
|
+
diff.to_a.delete_if { |_k, v| v == 0 }.sort_by! { |_k, v| v }.reverse_each do |k, v|
|
135
135
|
body << "#{k} : #{v}\n"
|
136
136
|
end
|
137
137
|
|
@@ -139,20 +139,19 @@ ObjectSpace delta caused by request:
|
|
139
139
|
ObjectSpace stats:
|
140
140
|
-----------------\n"
|
141
141
|
|
142
|
-
stat_after[:stats].to_a.sort_by!{ |_k, v| v }.reverse_each do |k,v|
|
142
|
+
stat_after[:stats].to_a.sort_by! { |_k, v| v }.reverse_each do |k, v|
|
143
143
|
body << "#{k} : #{v}\n"
|
144
144
|
end
|
145
145
|
|
146
|
-
|
147
146
|
body << "\n
|
148
147
|
String stats:
|
149
148
|
------------\n"
|
150
149
|
|
151
|
-
string_analysis.to_a.sort_by!{ |_k, v| -v }.take(1000).each do |string,count|
|
150
|
+
string_analysis.to_a.sort_by! { |_k, v| -v }.take(1000).each do |string, count|
|
152
151
|
body << "#{count} : #{string}\n"
|
153
152
|
end
|
154
153
|
|
155
|
-
return [200, {'Content-Type' => 'text/plain'}, body]
|
154
|
+
return [200, { 'Content-Type' => 'text/plain' }, body]
|
156
155
|
ensure
|
157
156
|
prev_gc_state ? GC.disable : GC.enable
|
158
157
|
end
|