tuttle 0.0.5 → 0.0.6
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 +61 -4
- data/Rakefile +1 -16
- data/app/controllers/tuttle/active_job_controller.rb +51 -0
- data/app/controllers/tuttle/active_model_serializers_controller.rb +3 -8
- data/app/controllers/tuttle/application_controller.rb +3 -0
- data/app/controllers/tuttle/cancancan_controller.rb +8 -15
- data/app/controllers/tuttle/devise_controller.rb +1 -2
- data/app/controllers/tuttle/gems_controller.rb +4 -4
- data/app/controllers/tuttle/home_controller.rb +0 -1
- data/app/controllers/tuttle/paperclip_controller.rb +1 -2
- data/app/controllers/tuttle/rack_mini_profiler_controller.rb +15 -0
- data/app/controllers/tuttle/rails_controller.rb +45 -7
- data/app/controllers/tuttle/request_controller.rb +0 -4
- data/app/controllers/tuttle/ruby_controller.rb +6 -2
- data/app/helpers/tuttle/application_helper.rb +13 -8
- data/app/models/tuttle/configuration_registry.rb +25 -0
- data/app/models/tuttle/version_detector.rb +9 -0
- data/app/views/layouts/tuttle/application.html.erb +29 -20
- data/app/views/tuttle/active_job/index.html.erb +48 -0
- data/app/views/tuttle/active_model_serializers/index.html.erb +2 -0
- data/app/views/tuttle/gems/get_process_mem.html.erb +13 -13
- data/app/views/tuttle/gems/http_clients.html.erb +9 -10
- data/app/views/tuttle/gems/json.html.erb +3 -3
- data/app/views/tuttle/gems/other.html.erb +41 -11
- data/app/views/tuttle/home/index.html.erb +27 -23
- data/app/views/tuttle/{performance_tuning → rack_mini_profiler}/index.html.erb +6 -6
- data/app/views/tuttle/rails/_cache_dalli_store.html.erb +65 -0
- data/app/views/tuttle/rails/_cache_memory_store.html.erb +43 -0
- data/app/views/tuttle/rails/_cache_monitor.html.erb +63 -0
- data/app/views/tuttle/rails/assets.html.erb +181 -28
- data/app/views/tuttle/rails/cache.html.erb +92 -102
- data/app/views/tuttle/rails/database.html.erb +2 -2
- data/app/views/tuttle/rails/index.html.erb +20 -21
- data/app/views/tuttle/rails/routes.html.erb +88 -36
- data/app/views/tuttle/rails/schema_cache.html.erb +2 -1
- data/app/views/tuttle/ruby/index.html.erb +24 -20
- data/config/rails_config_base.yml +80 -0
- data/config/rails_config_v4.x.yml +14 -0
- data/config/rails_config_v5.x.yml +12 -0
- data/config/routes.rb +7 -1
- data/lib/tuttle.rb +3 -6
- data/lib/tuttle/engine.rb +24 -12
- data/lib/tuttle/instrumenter.rb +7 -7
- data/lib/tuttle/middleware/request_profiler.rb +165 -24
- data/lib/tuttle/presenters/action_dispatch/routing/route_wrapper.rb +7 -3
- data/lib/tuttle/presenters/rack_mini_profiler/client_settings.rb +27 -0
- data/lib/tuttle/ruby_prof/fast_call_stack_printer.rb +26 -53
- data/lib/tuttle/version.rb +1 -1
- metadata +18 -8
- data/app/controllers/tuttle/performance_tuning_controller.rb +0 -14
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
module Tuttle
|
2
4
|
module ApplicationHelper
|
3
|
-
|
4
|
-
|
5
|
-
|
5
|
+
def truth_label(is_true, true_label = 'true', false_label = 'false')
|
6
|
+
content_tag(:span, is_true ? true_label : false_label,
|
7
|
+
class: ['label', is_true ? 'label-success' : 'label-danger'])
|
6
8
|
end
|
7
9
|
|
8
10
|
def tuttle_redacted(enumarator)
|
@@ -12,23 +14,26 @@ module Tuttle
|
|
12
14
|
end
|
13
15
|
|
14
16
|
def main_app_root_path
|
15
|
-
main_app.respond_to?(:root_path) ? main_app.root_path :
|
17
|
+
main_app.respond_to?(:root_path) ? main_app.root_path : '/'
|
16
18
|
end
|
17
19
|
|
18
20
|
def main_app_root_url
|
19
|
-
main_app.respond_to?(:root_url) ? main_app.root_url :
|
21
|
+
main_app.respond_to?(:root_url) ? main_app.root_url : '/'
|
22
|
+
end
|
23
|
+
|
24
|
+
def rails_guides_versioned_url(path)
|
25
|
+
"http://guides.rubyonrails.org/v#{Tuttle::VersionDetector.rails_major_minor}/#{path}"
|
20
26
|
end
|
21
27
|
|
22
28
|
private
|
23
29
|
|
24
30
|
def redact_by_key(key, value)
|
25
31
|
case key
|
26
|
-
when 'password',
|
27
|
-
'--HIDDEN--'
|
32
|
+
when 'password', /(_secret|_credentials)/
|
33
|
+
'--HIDDEN--'
|
28
34
|
else
|
29
35
|
value
|
30
36
|
end
|
31
37
|
end
|
32
|
-
|
33
38
|
end
|
34
39
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Tuttle
|
2
|
+
class ConfigurationRegistry
|
3
|
+
|
4
|
+
class << self
|
5
|
+
def data
|
6
|
+
@registry ||= load_data
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def load_data
|
12
|
+
data_dir = Tuttle::Engine.instance.paths['config'].first
|
13
|
+
|
14
|
+
data = YAML.load_file(File.expand_path('rails_config_base.yml', data_dir))
|
15
|
+
if Rails::VERSION::MAJOR == 4
|
16
|
+
data.merge!(YAML.load_file(File.expand_path('rails_config_v4.x.yml', data_dir)))
|
17
|
+
elsif Rails::VERSION::MAJOR == 5
|
18
|
+
data.merge!(YAML.load_file(File.expand_path('rails_config_v5.x.yml', data_dir)))
|
19
|
+
end
|
20
|
+
|
21
|
+
data
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -5,13 +5,19 @@
|
|
5
5
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
7
7
|
<title>Tuttle</title>
|
8
|
-
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/
|
9
|
-
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/
|
8
|
+
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
|
9
|
+
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
|
10
|
+
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" integrity="sha384-T8Gy5hrqNKT+hzMclPo118YTQO6cYprQmhrYwIiQ/3axmI1hQomh7Ud2hPOy8SP1" crossorigin="anonymous">
|
11
|
+
<%= stylesheet_link_tag "//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.6.0/styles/default.min.css" %>
|
12
|
+
<%= content_for(:stylesheets) -%>
|
10
13
|
<link rel="icon" href="//s3.amazonaws.com/tuttle-assets/images/favicon.ico">
|
11
14
|
<style>
|
12
15
|
html { overflow: -moz-scrollbars-vertical; overflow-y: scroll; }
|
13
16
|
body { padding-top: 50px; }
|
14
17
|
table.not-wide { width: auto; }
|
18
|
+
pre code.hljs { background-color: #f5f5f5; }
|
19
|
+
a[href*="github.com"] { white-space: nowrap; }
|
20
|
+
a[href*="github.com"]:after { font-family: FontAwesome; content: "\f09b"; display: inline-block; color: initial; padding-left: 3px; }
|
15
21
|
</style>
|
16
22
|
<%= csrf_meta_tags %>
|
17
23
|
</head>
|
@@ -35,18 +41,21 @@
|
|
35
41
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Rails <span class="caret"></span></a>
|
36
42
|
<ul class="dropdown-menu" role="menu">
|
37
43
|
<li><%= link_to 'Overview', rails_path %></li>
|
38
|
-
<li class="divider"></li>
|
44
|
+
<li role="separator" class="divider"></li>
|
39
45
|
<li><%= link_to 'Controllers', rails_controllers_path %></li>
|
40
46
|
<li><%= link_to 'Models', rails_models_path %></li>
|
41
|
-
<li><%= link_to 'Helpers', rails_helpers_path %></li>
|
42
|
-
<li><%= link_to 'Assets', rails_assets_path %></li>
|
43
47
|
<li><%= link_to 'Routes', rails_routes_path %></li>
|
44
|
-
<li><%= link_to '
|
45
|
-
<li
|
48
|
+
<li><%= link_to 'Helpers', rails_helpers_path %></li>
|
49
|
+
<li role="separator" class="divider"></li>
|
50
|
+
<li><%= link_to 'Asset Pipeline', rails_assets_path %></li>
|
51
|
+
<li><%= link_to 'Caching', rails_cache_path %></li>
|
52
|
+
<li role="separator" class="divider"></li>
|
46
53
|
<li><%= link_to 'Database', rails_database_path %></li>
|
47
54
|
<li><%= link_to 'Schema Cache', rails_schema_cache_path %></li>
|
48
|
-
<li
|
49
|
-
<li><%= link_to '
|
55
|
+
<li role="separator" class="divider"></li>
|
56
|
+
<li><%= link_to 'Generators', rails_generators_path %></li>
|
57
|
+
<li><%= link_to 'Engines', rails_engines_path %></li>
|
58
|
+
<li class="hide"><%= link_to 'Instrumentation', rails_instrumentation_path %></li>
|
50
59
|
</ul>
|
51
60
|
</li>
|
52
61
|
<li class="dropdown">
|
@@ -64,10 +73,13 @@
|
|
64
73
|
<ul class="dropdown-menu" role="menu">
|
65
74
|
<li><%= link_to 'Overview', gems_path %></li>
|
66
75
|
<li class="divider"></li>
|
67
|
-
<%- if defined?(
|
76
|
+
<%- if defined?(::ActiveJob) %>
|
77
|
+
<li><%= link_to 'ActiveJob', active_job_path %></li>
|
78
|
+
<%- end %>
|
79
|
+
<%- if defined?(::Devise) %>
|
68
80
|
<li><%= link_to 'Devise', devise_path %></li>
|
69
81
|
<%- end %>
|
70
|
-
<%- if defined?(CanCanCan) %>
|
82
|
+
<%- if defined?(::CanCanCan) %>
|
71
83
|
<li><%= link_to 'CanCanCan', cancancan_path %></li>
|
72
84
|
<%- end %>
|
73
85
|
<%- if defined?(::Paperclip) %>
|
@@ -97,17 +109,14 @@
|
|
97
109
|
|
98
110
|
<div class="container">
|
99
111
|
<div class="row">
|
100
|
-
<%= yield
|
112
|
+
<%= yield -%>
|
101
113
|
</div>
|
102
114
|
</div>
|
103
115
|
|
104
|
-
<script src="//code.jquery.com/jquery-2.
|
105
|
-
<script src="//maxcdn.bootstrapcdn.com/bootstrap/
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
});
|
110
|
-
</script>
|
111
|
-
<%= content_for(:javascripts) =%>
|
116
|
+
<script src="//code.jquery.com/jquery-2.2.4.min.js" integrity="sha384-rY/jv8mMhqDabXSo+UCggqKtdmBfd3qC2/KvyTDNQ6PcUJXaxK1tMepoQda4g5vB" crossorigin="anonymous"></script>
|
117
|
+
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
|
118
|
+
<%= javascript_include_tag "//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js" %>
|
119
|
+
<%= content_for(:javascripts) -%>
|
120
|
+
<script>hljs.initHighlightingOnLoad();</script>
|
112
121
|
</body>
|
113
122
|
</html>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<h1>Active Job Overview</h1>
|
2
|
+
|
3
|
+
<dl class="dl-horizontal">
|
4
|
+
<dt>Active Job Version</dt><dd><%= ActiveJob::VERSION::STRING %></dd>
|
5
|
+
</dl>
|
6
|
+
|
7
|
+
<h3>Config Settings</h3>
|
8
|
+
<table class="table table-condensed">
|
9
|
+
<tr>
|
10
|
+
<th>Setting</th>
|
11
|
+
<th>Value</th>
|
12
|
+
<th>Description</th>
|
13
|
+
</tr>
|
14
|
+
<tr>
|
15
|
+
<td>config.active_job</td>
|
16
|
+
<td><code><%= Rails.configuration.active_job %></code></td>
|
17
|
+
<td>All settings for config.active_job</td>
|
18
|
+
</tr>
|
19
|
+
<tr>
|
20
|
+
<td>config.active_job.queue_adapter</td>
|
21
|
+
<td><%= Rails.configuration.active_job.queue_adapter %></td>
|
22
|
+
<td></td>
|
23
|
+
</tr>
|
24
|
+
<tr>
|
25
|
+
<td>config.active_job.queue_name_prefix</td>
|
26
|
+
<td><%= Rails.configuration.active_job.queue_name_prefix %></td>
|
27
|
+
<td>An optional name to prepend to job queue names</td>
|
28
|
+
</tr>
|
29
|
+
</table>
|
30
|
+
|
31
|
+
<h3>Job Classes</h3>
|
32
|
+
<table class="table table-condensed">
|
33
|
+
<tr>
|
34
|
+
<th>Class</th>
|
35
|
+
<th>Queue Adapter</th>
|
36
|
+
<th>Queue</th>
|
37
|
+
<th>perform arguments</th>
|
38
|
+
</tr>
|
39
|
+
<% @job_classes.each do |job_klass| %>
|
40
|
+
<tr>
|
41
|
+
<td><code><%= job_klass.name %></code></td>
|
42
|
+
<td><code><%= job_klass.queue_adapter %></code></td>
|
43
|
+
<% # TODO: queue_name can be a Proc set with `queue_as` %>
|
44
|
+
<td><code><%= job_klass.queue_name %></code></td>
|
45
|
+
<td><code><%= job_klass.instance_method(:perform).parameters.map { |_req, var| var }.join(', ') %></code></td>
|
46
|
+
</tr>
|
47
|
+
<% end %>
|
48
|
+
</table>
|
@@ -54,6 +54,7 @@
|
|
54
54
|
<% end %>
|
55
55
|
</table>
|
56
56
|
|
57
|
+
<% if false # This seems to be in flux %>
|
57
58
|
<h3>Adapters</h3>
|
58
59
|
<table class="table table-condensed not-wide">
|
59
60
|
<tr>
|
@@ -67,6 +68,7 @@
|
|
67
68
|
</tr>
|
68
69
|
<% end %>
|
69
70
|
</table>
|
71
|
+
<% end %>
|
70
72
|
|
71
73
|
<h3>Active Record Models</h3>
|
72
74
|
<table class="table table-condensed not-wide">
|
@@ -1,11 +1,13 @@
|
|
1
1
|
<h2>Process and Memory</h2>
|
2
|
+
<% if defined?(GetProcessMem) %>
|
2
3
|
GetProcessMem Version: <%= GetProcessMem::VERSION %>
|
4
|
+
<% end %>
|
3
5
|
|
4
6
|
<h3>Ruby Process Information</h3>
|
5
7
|
<table class="table table-condensed not-wide">
|
6
8
|
<tr>
|
7
9
|
<th>PID</th>
|
8
|
-
<td><%=
|
10
|
+
<td><%= Process.pid %></td>
|
9
11
|
</tr>
|
10
12
|
<tr>
|
11
13
|
<th>Parent PPID</th>
|
@@ -50,41 +52,39 @@ GetProcessMem Version: <%= GetProcessMem::VERSION %>
|
|
50
52
|
</table>
|
51
53
|
|
52
54
|
|
53
|
-
<% if
|
54
|
-
<% memory_self = GetProcessMem.new($PID) %>
|
55
|
-
<% memory_parent = GetProcessMem.new(Process.ppid) %>
|
55
|
+
<% if @memory_self %>
|
56
56
|
<h3>GetProcessMem</h3>
|
57
57
|
<table class="table table-condensed not-wide">
|
58
58
|
<tr>
|
59
59
|
<th>Linux?</th>
|
60
|
-
<td><%= truth_label(memory_self.linux?) %></td>
|
60
|
+
<td><%= truth_label(@memory_self.linux?) %></td>
|
61
61
|
</tr>
|
62
62
|
<tr>
|
63
63
|
<th>PID bytes</th>
|
64
|
-
<td><%= memory_self.bytes %></td>
|
64
|
+
<td><%= ActiveSupport::NumberHelper.number_to_human_size(@memory_self.bytes.to_i) %></td>
|
65
65
|
</tr>
|
66
66
|
<tr>
|
67
67
|
<th>PID ps_memory</th>
|
68
|
-
<td><%= memory_self.send(:ps_memory) %></td>
|
68
|
+
<td><%= ActiveSupport::NumberHelper.number_to_human_size(@memory_self.send(:ps_memory).to_i) %></td>
|
69
69
|
</tr>
|
70
|
-
<% if
|
70
|
+
<% if @memory_self.respond_to?(:linux_status_memory) %>
|
71
71
|
<tr>
|
72
72
|
<th>PID status_memory</th>
|
73
|
-
<td><%= memory_self.linux_status_memory
|
73
|
+
<td><%= @memory_self.linux_status_memory > 0 ? ActiveSupport::NumberHelper.number_to_human_size(@memory_self.linux_status_memory.to_i) : '--Unknown--' %></td>
|
74
74
|
</tr>
|
75
75
|
<% end %>
|
76
76
|
<tr>
|
77
77
|
<th>PPID bytes</th>
|
78
|
-
<td><%= memory_parent.bytes %></td>
|
78
|
+
<td><%= ActiveSupport::NumberHelper.number_to_human_size(@memory_parent.bytes.to_i) %></td>
|
79
79
|
</tr>
|
80
80
|
<tr>
|
81
81
|
<th>PPID ps_memory</th>
|
82
|
-
<td><%= memory_parent.send(:ps_memory) %></td>
|
82
|
+
<td><%= ActiveSupport::NumberHelper.number_to_human_size(@memory_parent.send(:ps_memory).to_i) %></td>
|
83
83
|
</tr>
|
84
|
-
<% if memory_parent.respond_to?(:linux_status_memory) %>
|
84
|
+
<% if @memory_parent.respond_to?(:linux_status_memory) %>
|
85
85
|
<tr>
|
86
86
|
<th>PPID status_memory</th>
|
87
|
-
<td><%= memory_parent.linux_status_memory
|
87
|
+
<td><%= @memory_parent.linux_status_memory > 0 ? ActiveSupport::NumberHelper.number_to_human_size(@memory_parent.linux_status_memory.to_i) : '--Unknown--' %></td>
|
88
88
|
</tr>
|
89
89
|
<% end %>
|
90
90
|
</table>
|
@@ -14,21 +14,20 @@
|
|
14
14
|
<p>Libraries detected and loaded</p>
|
15
15
|
<ul>
|
16
16
|
<li>Net::HTTP (core ruby) <%= truth_label(defined?(Net::HTTP)) %></li>
|
17
|
-
<li>Excon
|
18
|
-
<li>HTTPI
|
19
|
-
<li>httpclient
|
20
|
-
<li>Typhoeus
|
21
|
-
<li>Faraday
|
17
|
+
<li><a href="https://github.com/excon/excon">Excon</a>: <%= truth_label(defined?(Excon)) %></li>
|
18
|
+
<li><a href="https://github.com/savonrb/httpi">HTTPI</a>: <%= truth_label(defined?(HTTPI)) %></li>
|
19
|
+
<li><a href="https://github.com/nahi/httpclient">httpclient</a>: <%= truth_label(defined?(HTTPClient)) %></li>
|
20
|
+
<li><a href="https://github.com/typhoeus/typhoeus">Typhoeus</a>: <%= truth_label(defined?(Typhoeus)) %></li>
|
21
|
+
<li><a href="https://github.com/lostisland/faraday">Faraday</a>: <%= truth_label(defined?(Faraday)) %>
|
22
22
|
<%- if defined?(Faraday) %>
|
23
23
|
— (Default adapter: <%= Faraday.default_adapter %>)
|
24
24
|
<%- end %>
|
25
25
|
</li>
|
26
|
-
<li>
|
27
|
-
<li>Patron
|
28
|
-
<li>Savon
|
29
|
-
<li>Event Machine HttpRequest
|
26
|
+
<li><a href="https://github.com/nicksieger/multipart-post">multipart-post</a>: <%= truth_label(defined?(Net::HTTP::Post::Multipart)) %></li>
|
27
|
+
<li><a href="https://github.com/toland/patron">Patron</a>: <%= truth_label(defined?(Patron::Session)) %></li>
|
28
|
+
<li><a href="https://github.com/savonrb/savon">Savon</a>: <%= truth_label(defined?(Savon)) %></li>
|
29
|
+
<li><a href="https://github.com/igrigorik/em-http-request">Event Machine HttpRequest</a>: <%= truth_label(defined?(EventMachine::HttpRequest)) %></li>
|
30
30
|
</ul>
|
31
|
-
<p></p>
|
32
31
|
</div>
|
33
32
|
<div class="panel-footer">
|
34
33
|
</div>
|
@@ -14,10 +14,10 @@
|
|
14
14
|
<ul>
|
15
15
|
<li>JSON Pure: <%= truth_label(defined?(JSON::Pure)) %></li>
|
16
16
|
<li>JSON: <%= truth_label(defined?(JSON) && !defined?(JSON::Pure)) %></li>
|
17
|
-
<li>Yajl
|
18
|
-
<li>Oj
|
17
|
+
<li><a href="https://github.com/brianmario/yajl-ruby">Yajl</a>: <%= truth_label(defined?(Yajl)) %></li>
|
18
|
+
<li><a href="https://github.com/ohler55/oj">Oj</a>: <%= truth_label(defined?(Oj)) %></li>
|
19
19
|
<li>
|
20
|
-
MultiJson
|
20
|
+
<a href="https://github.com/intridea/multi_json">MultiJson</a>: <%= truth_label(defined?(MultiJson)) %>
|
21
21
|
<%- if defined?(MultiJson) %>
|
22
22
|
— (Adapter: <%= MultiJson.adapter %>)
|
23
23
|
<%- end %>
|
@@ -9,7 +9,7 @@
|
|
9
9
|
Various gems are often included in applications to eke out a bit more performance.
|
10
10
|
Here are various gems which may be helpful.
|
11
11
|
</p>
|
12
|
-
<p>fast_blank - <%= truth_label("TEST".methods.include?(:blank_as?), 'installed', 'not installed') %></p>
|
12
|
+
<p><a href="https://github.com/SamSaffron/fast_blank">fast_blank</a> - <%= truth_label("TEST".methods.include?(:blank_as?), 'installed', 'not installed') %></p>
|
13
13
|
</div>
|
14
14
|
<div class="panel-footer">
|
15
15
|
</div>
|
@@ -23,11 +23,11 @@
|
|
23
23
|
<p>Much of Tuttle is a work in progress. But these bits are still under development...</p>
|
24
24
|
<ul>
|
25
25
|
<li><%= link_to 'Request Inspector', '/tuttle/request' %></li>
|
26
|
-
<% if defined?(ActiveModel::
|
26
|
+
<% if defined?(ActiveModel::Serializer) || defined?(ActiveModelSerializers) %>
|
27
27
|
<li><%= link_to 'ActiveModel Serializers', '/tuttle/active_model_serializers' %> - (0.9 and 0.10 support)</li>
|
28
28
|
<% end %>
|
29
|
-
<% if defined?(Rack::MiniProfiler) %>
|
30
|
-
<li><%= link_to 'Rack::MiniProfiler',
|
29
|
+
<% if defined?(::Rack::MiniProfiler::ClientSettings) %>
|
30
|
+
<li><%= link_to 'Rack::MiniProfiler', rack_mini_profiler_path %></li>
|
31
31
|
<% end %>
|
32
32
|
</ul>
|
33
33
|
</div>
|
@@ -35,6 +35,7 @@
|
|
35
35
|
</div>
|
36
36
|
</div>
|
37
37
|
|
38
|
+
<a id="request-profiler"></a>
|
38
39
|
<div class="panel panel-default">
|
39
40
|
<div class="panel-heading">
|
40
41
|
<h3 class="panel-title">Experimental Request Profiler</h3>
|
@@ -63,15 +64,16 @@
|
|
63
64
|
<p>Profile memory allocation using <code>memory_profiler</code> with <code>tuttle-profiler=memory_profiler</code> query param.</p>
|
64
65
|
<p>
|
65
66
|
Additional parameters can include:
|
66
|
-
<ul>
|
67
|
-
<li><code>memory_profiler_allow_files</code> - Regexp pattern for files to be included</li>
|
68
|
-
<li><code>memory_profiler_ignore_files</code> - Regexp pattern for files to be ignored</li>
|
69
|
-
<li><code>memory_profiler_top</code> - Number of lines to include in report (defaults to 50)</li>
|
70
|
-
</ul>
|
71
67
|
</p>
|
68
|
+
<ul>
|
69
|
+
<li><code>memory_profiler_allow_files</code> - Regexp pattern for files to be included</li>
|
70
|
+
<li><code>memory_profiler_ignore_files</code> - Regexp pattern for files to be ignored</li>
|
71
|
+
<li><code>memory_profiler_top</code> - Number of lines to include in report (defaults to 50)</li>
|
72
|
+
</ul>
|
72
73
|
<p>Example:
|
73
74
|
<% example_url = main_app_root_url + '?tuttle-profiler=memory_profiler' %>
|
74
|
-
<%= link_to example_url, example_url
|
75
|
+
<%= link_to example_url, example_url %>
|
76
|
+
</p>
|
75
77
|
<br/>
|
76
78
|
|
77
79
|
<h4>CPU Profiling <%= truth_label(defined?(RubyProf), 'available', 'not available') %></h4>
|
@@ -86,7 +88,7 @@
|
|
86
88
|
</ul>
|
87
89
|
<p>Example:
|
88
90
|
<% example_url = main_app_root_url + '?tuttle-profiler=ruby-prof&ruby-prof_printer=fast_stack' %>
|
89
|
-
<%= link_to example_url, example_url
|
91
|
+
<%= link_to example_url, example_url %>
|
90
92
|
</p>
|
91
93
|
|
92
94
|
<% else %>
|
@@ -116,3 +118,31 @@
|
|
116
118
|
<div class="panel-footer">
|
117
119
|
</div>
|
118
120
|
</div>
|
121
|
+
|
122
|
+
<div class="panel panel-default">
|
123
|
+
<div class="panel-heading">
|
124
|
+
<h3 class="panel-title">Facter</h3>
|
125
|
+
</div>
|
126
|
+
<div class="panel-body">
|
127
|
+
<p>
|
128
|
+
<a href="https://github.com/puppetlabs/facter">Facter</a> is a gem that will collect and display system facts.
|
129
|
+
It is typically used by Puppet separately from your application.
|
130
|
+
If the gem is available, those facts will be reported here by Tuttle.
|
131
|
+
</p>
|
132
|
+
|
133
|
+
<% if defined?(Facter) %>
|
134
|
+
<p>Facter has collected the following information:</p>
|
135
|
+
<dl class="dl-horizontal">
|
136
|
+
<% Facter.to_hash.sort.each do |k, v| %>
|
137
|
+
<dt><%= k %></dt><dd><%= v.inspect %></dd>
|
138
|
+
<% end %>
|
139
|
+
</dl>
|
140
|
+
<% else %>
|
141
|
+
<p class="alert alert-warning">
|
142
|
+
<a href="https://github.com/puppetlabs/facter">Facter</a> is not available
|
143
|
+
</p>
|
144
|
+
<p>You can optionally require this gem (even if you do not use Puppet) by adding the following to your Gemfile.</p>
|
145
|
+
<pre><code class="ruby">gem 'facter'</code></pre>
|
146
|
+
<% end %>
|
147
|
+
</div>
|
148
|
+
</div>
|
@@ -11,21 +11,28 @@
|
|
11
11
|
<p>Version: <%= Rails::VERSION::STRING %></p>
|
12
12
|
<p>Environment: <%= Rails.env %></p>
|
13
13
|
<p>Root: <%= Rails.root %></p>
|
14
|
-
<p>
|
15
|
-
<p>
|
14
|
+
<p>Database: <%= ::ActiveRecord::Base.connection.adapter_name rescue 'N/A' %></p>
|
15
|
+
<p>Caching: <%= truth_label(::ActionController::Base.send(:cache_configured?), 'Enabled', 'Disabled') %></p>
|
16
16
|
</div>
|
17
17
|
<div class="panel-footer">
|
18
|
-
<%= link_to '
|
18
|
+
<%= link_to "Configuration", rails_path, :class=>['btn','btn-primary'], :role=>'button' %>
|
19
|
+
<%= link_to "Database", rails_database_path, :class=>['btn','btn-primary'], :role=>'button' %>
|
20
|
+
<%= link_to "Asset Pipeline", rails_assets_path, :class=>['btn','btn-primary'], :role=>'button' %>
|
21
|
+
<%= link_to "Caching", rails_cache_path, :class=>['btn','btn-primary'], :role=>'button' %>
|
19
22
|
</div>
|
20
23
|
</div>
|
21
24
|
|
22
25
|
<div class="panel panel-default">
|
23
26
|
<div class="panel-heading">
|
24
|
-
<h3 class="panel-title">
|
27
|
+
<h3 class="panel-title">Libraries and Frameworks</h3>
|
25
28
|
</div>
|
26
29
|
<ul class="list-group">
|
30
|
+
<li class="list-group-item"><%= link_to 'ActiveSupport', active_support_path %></li>
|
31
|
+
<%- if defined?(::ActiveJob) %>
|
32
|
+
<li class="list-group-item"><%= link_to 'ActiveJob', active_job_path %></li>
|
33
|
+
<%- end %>
|
27
34
|
<%- if defined?(CanCanCan) %>
|
28
|
-
<li class="list-group-item"><%= link_to '
|
35
|
+
<li class="list-group-item"><%= link_to 'CanCanCan', cancancan_path %></li>
|
29
36
|
<%- end %>
|
30
37
|
<%- if defined?(Devise) %>
|
31
38
|
<li class="list-group-item"><%= link_to 'Devise', devise_path %></li>
|
@@ -33,23 +40,19 @@
|
|
33
40
|
<%- if defined?(Paperclip) %>
|
34
41
|
<li class="list-group-item"><%= link_to 'Paperclip', paperclip_path %></li>
|
35
42
|
<%- end %>
|
36
|
-
|
37
|
-
|
38
|
-
<%- end %>
|
43
|
+
<li class="list-group-item"><%= link_to 'HTTP Clients', gems_http_clients_path %></li>
|
44
|
+
<li class="list-group-item"><%= link_to 'JSON', gems_json_path %></li>
|
39
45
|
</ul>
|
40
46
|
</div>
|
41
47
|
|
42
48
|
<div class="panel panel-default">
|
43
49
|
<div class="panel-heading">
|
44
|
-
<h3 class="panel-title">
|
45
|
-
</div>
|
46
|
-
<div class="panel-body">
|
47
|
-
<p>Version: <%= RUBY_DESCRIPTION %></p>
|
48
|
-
<p>Gems: <%= Bundler.rubygems.all_specs.size %></p>
|
49
|
-
</div>
|
50
|
-
<div class="panel-footer">
|
51
|
-
<%= link_to 'More...', ruby_path %>
|
50
|
+
<h3 class="panel-title">Performance Tuning</h3>
|
52
51
|
</div>
|
52
|
+
<ul class="list-group">
|
53
|
+
<li class="list-group-item"><%= link_to 'Ruby VM tuning', ruby_tuning_path %></li>
|
54
|
+
<li class="list-group-item"><%= link_to 'Request Profiling', gems_other_path(:anchor => 'request-profiler') %></li>
|
55
|
+
</ul>
|
53
56
|
</div>
|
54
57
|
|
55
58
|
</div>
|
@@ -68,17 +71,18 @@
|
|
68
71
|
|
69
72
|
<div class="panel panel-default">
|
70
73
|
<div class="panel-heading">
|
71
|
-
<h3 class="panel-title">
|
74
|
+
<h3 class="panel-title">Ruby</h3>
|
72
75
|
</div>
|
73
|
-
<ul class="list-group">
|
74
|
-
<% @event_counts.sort.each do |name,val| -%>
|
75
|
-
<li class="list-group-item"><span class="badge"><%= val %></span><%= name %></li>
|
76
|
-
<% end -%>
|
77
|
-
</ul>
|
78
76
|
<div class="panel-body">
|
79
|
-
<%=
|
77
|
+
<p>Version: <%= RUBY_DESCRIPTION %></p>
|
78
|
+
<p>Gems: <%= Bundler.rubygems.all_specs.size %></p>
|
79
|
+
</div>
|
80
|
+
<div class="panel-footer">
|
81
|
+
<%= link_to "Configuration", ruby_path, :class=>['btn','btn-primary'], :role=>'button' %>
|
82
|
+
<%= link_to "Gems", gems_path, :class=>['btn','btn-primary'], :role=>'button' %>
|
80
83
|
</div>
|
81
84
|
</div>
|
85
|
+
|
82
86
|
</div>
|
83
87
|
|
84
88
|
</div>
|