tuttle 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/app/controllers/tuttle/active_model_serializers_controller.rb +26 -0
  4. data/app/controllers/tuttle/active_support_controller.rb +26 -0
  5. data/app/controllers/tuttle/cancancan_controller.rb +1 -0
  6. data/app/controllers/tuttle/gems_controller.rb +4 -0
  7. data/app/controllers/tuttle/home_controller.rb +1 -3
  8. data/app/controllers/tuttle/performance_tuning_controller.rb +14 -0
  9. data/app/controllers/tuttle/rails_controller.rb +20 -18
  10. data/app/controllers/tuttle/request_controller.rb +16 -0
  11. data/app/controllers/tuttle/ruby_controller.rb +2 -0
  12. data/app/helpers/tuttle/application_helper.rb +8 -0
  13. data/app/views/layouts/tuttle/application.html.erb +22 -7
  14. data/app/views/tuttle/active_model_serializers/index.html.erb +86 -0
  15. data/app/views/tuttle/active_model_serializers/index9.html.erb +68 -0
  16. data/app/views/tuttle/active_support/dependencies.html.erb +72 -0
  17. data/app/views/tuttle/active_support/index.html.erb +69 -0
  18. data/app/views/tuttle/{rails → active_support}/inflectors.html.erb +0 -0
  19. data/app/views/tuttle/active_support/time_zones.html.erb +24 -0
  20. data/app/views/tuttle/cancancan/rule_tester.html.erb +1 -20
  21. data/app/views/tuttle/devise/index.html.erb +62 -9
  22. data/app/views/tuttle/gems/get_process_mem.html.erb +92 -0
  23. data/app/views/tuttle/gems/other.html.erb +102 -0
  24. data/app/views/tuttle/home/index.html.erb +1 -1
  25. data/app/views/tuttle/performance_tuning/index.html.erb +79 -0
  26. data/app/views/tuttle/rails/assets.html.erb +38 -43
  27. data/app/views/tuttle/rails/database.html.erb +2 -2
  28. data/app/views/tuttle/rails/engines.html.erb +40 -0
  29. data/app/views/tuttle/rails/generators.html.erb +74 -0
  30. data/app/views/tuttle/rails/index.html.erb +62 -86
  31. data/app/views/tuttle/rails/models.html.erb +16 -1
  32. data/app/views/tuttle/rails/schema_cache.html.erb +3 -1
  33. data/app/views/tuttle/request/index.html.erb +37 -0
  34. data/app/views/tuttle/ruby/index.html.erb +65 -0
  35. data/config/routes.rb +19 -3
  36. data/lib/tuttle.rb +6 -1
  37. data/lib/tuttle/engine.rb +23 -61
  38. data/lib/tuttle/instrumenter.rb +38 -0
  39. data/lib/tuttle/middleware/request_profiler.rb +80 -0
  40. data/lib/tuttle/ruby_prof/fast_call_stack_printer.rb +164 -0
  41. data/lib/tuttle/version.rb +1 -1
  42. metadata +21 -21
  43. data/app/assets/images/tuttle/favicon.ico +0 -0
  44. data/app/assets/javascripts/tuttle/application.js +0 -12
  45. data/app/assets/stylesheets/tuttle/application.css +0 -71
@@ -0,0 +1,72 @@
1
+ <h1>Active Support Dependencies</h1>
2
+
3
+ <!-- TODO: add option to toggle log/activity and control logger at runtime -->
4
+
5
+ <table class="table table-condensed">
6
+ <tr>
7
+ <th>Setting</th>
8
+ <th>Value</th>
9
+ <th>Description</th>
10
+ </tr>
11
+ <tr>
12
+ <td>warnings_on_first_load</td>
13
+ <td><%= truth_label(ActiveSupport::Dependencies.warnings_on_first_load) %></td>
14
+ <td>Should we turn on Ruby warnings on the first load of dependent files?</td>
15
+ </tr>
16
+ <tr>
17
+ <td>mechanism</td>
18
+ <td><code><%= ActiveSupport::Dependencies.mechanism %></code></td>
19
+ <td>Should we load files or require them?</td>
20
+ </tr>
21
+ </table>
22
+
23
+ <h3>Autoload Paths (<%= ActiveSupport::Dependencies.autoload_paths.size %> directories)</h3>
24
+ <p>
25
+ The set of directories from which we may automatically load files. Files
26
+ under these directories will be reloaded on each request in development mode,
27
+ unless the directory also appears in autoload_once_paths.
28
+ </p>
29
+ <ul>
30
+ <%- ActiveSupport::Dependencies.autoload_paths.each do |path_name| %>
31
+ <li><%= path_name %></li>
32
+ <%- end %>
33
+ </ul>
34
+
35
+ <h3>Autoload Once Paths (<%= ActiveSupport::Dependencies.autoload_once_paths.size %> directories)</h3>
36
+ <p>
37
+ The set of directories from which automatically loaded constants are loaded
38
+ only once. All directories in this set must also be present in +autoload_paths+.
39
+ </p>
40
+ <ul>
41
+ <%- ActiveSupport::Dependencies.autoload_once_paths.each do |path_name| %>
42
+ <li><%= path_name %></li>
43
+ <%- end %>
44
+ </ul>
45
+
46
+ <h3>Explicitly Unloadable Constants (<%= ActiveSupport::Dependencies.explicitly_unloadable_constants.size %> constants)</h3>
47
+ <p>
48
+ An array of constant names that need to be unloaded on every request. Used
49
+ to allow arbitrary constants to be marked for unloading.
50
+ </p>
51
+ <ul>
52
+ <%- ActiveSupport::Dependencies.explicitly_unloadable_constants.each do |const| %>
53
+ <li><%= const %></li>
54
+ <%- end %>
55
+ </ul>
56
+
57
+ <h3>Autoloaded Constants (<%= ActiveSupport::Dependencies.autoloaded_constants.size %> constants)</h3>
58
+ <p>
59
+ An array of qualified constant names that have been loaded.
60
+ </p>
61
+ <ul>
62
+ <%- ActiveSupport::Dependencies.autoloaded_constants.each do |const| %>
63
+ <li><%= const %></li>
64
+ <%- end %>
65
+ </ul>
66
+
67
+ <h3>Loaded files (<%= ActiveSupport::Dependencies.history.size %> files)</h3>
68
+ <ul>
69
+ <% ActiveSupport::Dependencies.history.sort.each do |loaded_file| %>
70
+ <li><%= loaded_file %><%= ActiveSupport::Dependencies.loaded.include?(loaded_file) ? nil : ' - NOT LOADED' %></li>
71
+ <% end %>
72
+ </ul>
@@ -0,0 +1,69 @@
1
+ <h1>Active Support Overview</h1>
2
+
3
+ <dl class="dl-horizontal">
4
+ <dt>Active Support Version</dt><dd><%= ActiveSupport::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_support</td>
16
+ <td><code><%= Rails.configuration.active_support %></code></td>
17
+ <td>All settings for config.active_support</td>
18
+ </tr>
19
+ <tr>
20
+ <td>config.active_support.bare</td>
21
+ <td><%= truth_label(Rails.configuration.active_support.bare) %></td>
22
+ <td>enables or disables the loading of active_support/all when booting Rails. Defaults to nil, which means active_support/all is loaded.</td>
23
+ </tr>
24
+ <tr>
25
+ <td>config.active_support.test_order</td>
26
+ <td><code><%= Rails.configuration.active_support.test_order %></code></td>
27
+ <td>sets the order that test cases are executed. Possible values are :sorted and :random. Currently defaults to :sorted. In Rails 5.0, the default will be changed to :random instead.</td>
28
+ </tr>
29
+ <tr>
30
+ <td>config.active_support.escape_html_entities_in_json</td>
31
+ <td><code><%= Rails.configuration.active_support.escape_html_entities_in_json %></code></td>
32
+ <td>enables or disables the escaping of HTML entities in JSON serialization. Defaults to false.</td>
33
+ </tr>
34
+ <tr>
35
+ <td>config.active_support.use_standard_json_time_format</td>
36
+ <td><code><%= Rails.configuration.active_support.use_standard_json_time_format %></code></td>
37
+ <td>enables or disables serializing dates to ISO 8601 format. Defaults to true.</td>
38
+ </tr>
39
+ <tr>
40
+ <td>config.active_support.time_precision</td>
41
+ <td><code><%= Rails.configuration.active_support.time_precision %></code></td>
42
+ <td>sets the precision of JSON encoded time values. Defaults to 3.</td>
43
+ </tr>
44
+ <tr>
45
+ <td>ActiveSupport::Logger.silencer</td>
46
+ <td><%= truth_label(ActiveSupport::Logger.silencer) %></td>
47
+ <td>set to false to disable the ability to silence logging in a block. The default is true.</td>
48
+ </tr>
49
+ <tr>
50
+ <td>ActiveSupport::Cache::Store.logger</td>
51
+ <td><code><%= ActiveSupport::Cache::Store.logger %></code></td>
52
+ <td>specifies the logger to use within cache store operations</td>
53
+ </tr>
54
+ <tr>
55
+ <td>ActiveSupport::Deprecation.silenced</td>
56
+ <td><%= truth_label(ActiveSupport::Deprecation.silenced) %></td>
57
+ <td>sets whether or not to display deprecation warnings</td>
58
+ </tr>
59
+ <tr>
60
+ <td>config.active_support.deprecation</td>
61
+ <td><code><%= Rails.configuration.active_support.deprecation %></code></td>
62
+ <td>specifies which deprecation method to use. the default values are <code><%= ActiveSupport::Deprecation::DEFAULT_BEHAVIORS.keys %></code></td>
63
+ </tr>
64
+ <tr>
65
+ <td>current deprecation behavior</td>
66
+ <td><code><%= ActiveSupport::Deprecation::DEFAULT_BEHAVIORS.key(ActiveSupport::Deprecation.behavior.first) || 'custom' %></code></td>
67
+ <td>The current runtime value of the depreaction behavior</td>
68
+ </tr>
69
+ </table>
@@ -0,0 +1,24 @@
1
+ <h1>ActiveSupport Time Zones</h1>
2
+
3
+ <!-- TODO: add information about how time zones are configured and possible options -->
4
+
5
+ <h2>All TimeZones</h2>
6
+
7
+ <table class="table table-striped table-condensed">
8
+ <tr>
9
+ <th>Name</th>
10
+ <th>UTC Offset</th>
11
+ <th>to_s</th>
12
+ <th>Now</th>
13
+ <th>TZInfo</th>
14
+ </tr>
15
+ <% ActiveSupport::TimeZone.all.each do |tz| %>
16
+ <tr>
17
+ <td><%= tz.name %></td>
18
+ <td><%= tz.utc_offset %></td>
19
+ <td><%= tz.to_s %></td>
20
+ <td><%= tz.now %></td>
21
+ <td><%= tz.tzinfo %></td>
22
+ </tr>
23
+ <% end %>
24
+ </table>
@@ -7,7 +7,7 @@
7
7
  </ul>
8
8
  <br/>
9
9
 
10
- <form class="form-horizontal" role="form" metho="get">
10
+ <form class="form-horizontal" role="form" method="get">
11
11
  <div class="form-group">
12
12
  <label for="action_name" class="col-sm-2 control-label">Action</label>
13
13
  <div class="col-sm-10">
@@ -47,22 +47,3 @@
47
47
 
48
48
  <h3>All Rules</h3>
49
49
  <%= render :partial => 'rule_table', :locals => {:rules => @ability.instance_variable_get('@rules') } =%>
50
-
51
- <%- action_list = @ability.instance_variable_get('@rules').collect(&:actions).flatten.uniq -%>
52
-
53
- <%- content_for(:javascripts) do -%>
54
- <script>
55
- var action_name_list = <%= action_list.as_json.to_s.html_safe =%>;
56
- var action_names = new Bloodhound({
57
- datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
58
- queryTokenizer: Bloodhound.tokenizers.whitespace,
59
- local: $.map(action_name_list, function(name) { return { value: name }; })
60
- });
61
-
62
- action_names.initialize();
63
-
64
- $('#action_name.typeahead').typeahead({ hint: true, highlight: true, minLength: 1},
65
- { name: 'action_names', displayKey: 'value', source: action_names.ttAdapter()
66
- });
67
- </script>
68
- <%- end -%>
@@ -1,12 +1,68 @@
1
1
  <h1>Devise Configuration</h1>
2
2
 
3
- <ul class="nav nav-tabs" role="tablist">
4
- <li class="active"><a href="#overview" role="tab" data-toggle="tab">Overview</a></li>
5
- <li><a href="#config" role="tab" data-toggle="tab">Config</a></li>
6
- </ul>
3
+ <nav>
4
+ <ul class="nav nav-pills">
5
+ <li role="presentation" class="active"><a href="#mappings" role="tab" data-toggle="pill">Mappings</a></li>
6
+ <li role="presentation"><a href="#overview" role="tab" data-toggle="pill">Overview</a></li>
7
+ <li role="presentation"><a href="#config" role="tab" data-toggle="pill">Config</a></li>
8
+ </ul>
9
+ </nav>
7
10
 
8
11
  <div class="tab-content">
9
- <div class="tab-pane active" id="overview">
12
+ <div role="tabpanel" class="tab-pane active" id="mappings">
13
+ <% Devise.mappings.each do |key, mapping| %>
14
+ <div class="panel panel-default">
15
+ <div class="panel-heading">
16
+ <h3 class="panel-title">:<%= key %> =&gt; <%= mapping.class_name %></h3>
17
+ </div>
18
+ <div class="panel-body">
19
+ <h3>Attributes</h3>
20
+ <table class="table table-condensed">
21
+ <tr>
22
+ <th>Attribute</th>
23
+ <th>Value</th>
24
+ </tr>
25
+ <% [:singular, :scoped_path, :path, :controllers, :path_names,
26
+ :class_name, :sign_out_via, :format, :used_routes, :used_helpers,
27
+ :failure_app, :router_name, :strategies, :authenticatable?].each do |attr| %>
28
+ <tr>
29
+ <td><%= attr %></td>
30
+ <td><%= mapping.send(attr) %></td>
31
+ </tr>
32
+ <% end %>
33
+ </table>
34
+ <h3>Enabled Modules</h3>
35
+ <table class="table table-condensed">
36
+ <tr>
37
+ <th>Module Name</th>
38
+ <th>Config Options</th>
39
+ </tr>
40
+ <% mapped_class = mapping.to
41
+ mapped_class.devise_modules.each do |devise_module| %>
42
+ <tr>
43
+ <td>:<%= devise_module %></td>
44
+ <td>
45
+ <%
46
+ mod = Devise::Models.const_get(devise_module.to_s.classify)
47
+ if mod.const_defined?(:ClassMethods)
48
+ class_mod = mod.const_get(:ClassMethods)
49
+ if class_mod.respond_to?(:available_configs)
50
+ class_mod.available_configs.each do |config| %>
51
+ <%= config %>:
52
+ <code><%= mapped_class.send(config) %></code><br/>
53
+ <% end
54
+ end
55
+ end
56
+ %>
57
+ </td>
58
+ </tr>
59
+ <% end %>
60
+ </table>
61
+ </div>
62
+ <% end %>
63
+ </div>
64
+ </div>
65
+ <div role="tabpanel" class="tab-pane" id="overview">
10
66
  <dl class="dl-horizontal">
11
67
  <dt>Devise Version</dt><dd><%= Devise::VERSION %></dd>
12
68
  </dl>
@@ -23,10 +79,8 @@
23
79
 
24
80
  </pre>
25
81
  </div>
26
-
27
- <div class="tab-pane" id="config">
82
+ <div role="tabpanel" class="tab-pane" id="config">
28
83
  <pre>
29
-
30
84
  rememberable_options = <%= Devise.rememberable_options %>
31
85
  stretches = <%= Devise.stretches %>
32
86
  http_authentication_key = <%= Devise.http_authentication_key %>
@@ -67,7 +121,6 @@ parent_mailer = <%= Devise.parent_mailer %>
67
121
  router_name = <%= Devise.router_name %>
68
122
  omniauth_path_prefix = <%= Devise.omniauth_path_prefix %>
69
123
  clean_up_csrf_token_on_authentication = <%= Devise.clean_up_csrf_token_on_authentication %>
70
- mappings = <%= Devise.mappings %>
71
124
  omniauth_configs = <%= Devise.omniauth_configs %>
72
125
  helpers = <%= Devise.helpers %>
73
126
  warden_config = <%= Devise.warden_config %>
@@ -0,0 +1,92 @@
1
+ <h2>Process and Memory</h2>
2
+ GetProcessMem Version: <%= GetProcessMem::VERSION %>
3
+
4
+ <h3>Ruby Process Information</h3>
5
+ <table class="table table-condensed not-wide">
6
+ <tr>
7
+ <th>PID</th>
8
+ <td><%= $PID %></td>
9
+ </tr>
10
+ <tr>
11
+ <th>Parent PPID</th>
12
+ <td><%= Process.ppid %></td>
13
+ </tr>
14
+ <tr>
15
+ <th>Process EGID</th>
16
+ <td><%= Process.egid %></td>
17
+ </tr>
18
+ <tr>
19
+ <th>Process EUID</th>
20
+ <td><%= Process.euid %></td>
21
+ </tr>
22
+ <tr>
23
+ <th>Process pgrp</th>
24
+ <td><%= Process.getpgrp %></td>
25
+ </tr>
26
+ <tr>
27
+ <th>Process rlimit(Process::RLIMIT_CORE)</th>
28
+ <td><%= Process.getrlimit(Process::RLIMIT_CORE) %></td>
29
+ </tr>
30
+ <tr>
31
+ <th>Process rlimit(Process::RLIMIT_MEMLOCK)</th>
32
+ <td><%= Process.getrlimit(Process::RLIMIT_MEMLOCK) %></td>
33
+ </tr>
34
+ <tr>
35
+ <th>Process getsid</th>
36
+ <td><%= Process.getsid %></td>
37
+ </tr>
38
+ <tr>
39
+ <th>Process gid</th>
40
+ <td><%= Process.gid %></td>
41
+ </tr>
42
+ <tr>
43
+ <th>Process groups</th>
44
+ <td><%= Process.groups %></td>
45
+ </tr>
46
+ <tr>
47
+ <th>Process maxgroups</th>
48
+ <td><%= Process.maxgroups %></td>
49
+ </tr>
50
+ </table>
51
+
52
+
53
+ <% if defined?(GetProcessMem) %>
54
+ <% memory_self = GetProcessMem.new($PID) %>
55
+ <% memory_parent = GetProcessMem.new(Process.ppid) %>
56
+ <h3>GetProcessMem</h3>
57
+ <table class="table table-condensed not-wide">
58
+ <tr>
59
+ <th>Linux?</th>
60
+ <td><%= truth_label(memory_self.linux?) %></td>
61
+ </tr>
62
+ <tr>
63
+ <th>PID bytes</th>
64
+ <td><%= memory_self.bytes %></td>
65
+ </tr>
66
+ <tr>
67
+ <th>PID ps_memory</th>
68
+ <td><%= memory_self.send(:ps_memory) %></td>
69
+ </tr>
70
+ <% if memory_parent.respond_to?(:linux_status_memory) %>
71
+ <tr>
72
+ <th>PID status_memory</th>
73
+ <td><%= memory_self.linux_status_memory || '--Unknown--' %></td>
74
+ </tr>
75
+ <% end %>
76
+ <tr>
77
+ <th>PPID bytes</th>
78
+ <td><%= memory_parent.bytes %></td>
79
+ </tr>
80
+ <tr>
81
+ <th>PPID ps_memory</th>
82
+ <td><%= memory_parent.send(:ps_memory) %></td>
83
+ </tr>
84
+ <% if memory_parent.respond_to?(:linux_status_memory) %>
85
+ <tr>
86
+ <th>PPID status_memory</th>
87
+ <td><%= memory_parent.linux_status_memory || '--Unknown--' %></td>
88
+ </tr>
89
+ <% end %>
90
+ </table>
91
+
92
+ <% end %>
@@ -14,3 +14,105 @@
14
14
  <div class="panel-footer">
15
15
  </div>
16
16
  </div>
17
+
18
+ <div class="panel panel-default">
19
+ <div class="panel-heading">
20
+ <h3 class="panel-title">Work In Progress</h3>
21
+ </div>
22
+ <div class="panel-body">
23
+ <p>Much of Tuttle is a work in progress. But these bits are still under development...</p>
24
+ <ul>
25
+ <li><%= link_to 'Request Inspector', '/tuttle/request' %></li>
26
+ <% if defined?(ActiveModel::Serializers) %>
27
+ <li><%= link_to 'ActiveModel Serializers', '/tuttle/active_model_serializers' %> - (0.9 and 0.10 support)</li>
28
+ <% end %>
29
+ <% if defined?(Rack::MiniProfiler) %>
30
+ <li><%= link_to 'Rack::MiniProfiler', '/tuttle/performance_tuning' %></li>
31
+ <% end %>
32
+ </ul>
33
+ </div>
34
+ <div class="panel-footer">
35
+ </div>
36
+ </div>
37
+
38
+ <div class="panel panel-default">
39
+ <div class="panel-heading">
40
+ <h3 class="panel-title">Experimental Request Profiler</h3>
41
+ </div>
42
+ <div class="panel-body">
43
+ <p>
44
+ Tuttle includes an optional middleware (Tuttle::Middleware::RequestProfiler)
45
+ to assist with memory and CPU profiling using the
46
+ <code>memory_profiler</code> and <code>ruby-prof</code> gems.
47
+ </p>
48
+ <p>
49
+ This middleware provides the ability to profile individual requests on demand
50
+ and to vary the profiling options.
51
+ </p>
52
+ <h4>Middleware Installation</h4>
53
+ <p>
54
+ Middleware loaded? <%= truth_label(defined?(Tuttle::Middleware::RequestProfiler)) %>
55
+ </p>
56
+ <% if defined?(Tuttle::Middleware::RequestProfiler) && middleware_position = Rails.application.config.middleware.middlewares.index(Tuttle::Middleware::RequestProfiler) %>
57
+ <p>
58
+ Middleware stack position: <%= middleware_position + 1 %>
59
+ </p>
60
+ <br/>
61
+
62
+ <h4>Memory Profiling <%= truth_label(defined?(MemoryProfiler), 'available', 'not available') %></h4>
63
+ <p>Profile memory allocation using <code>memory_profiler</code> with <code>tuttle-profiler=memory_profiler</code> query param.</p>
64
+ <p>
65
+ 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
+ </p>
72
+ <p>Example:
73
+ <% example_url = main_app_root_url + '?tuttle-profiler=memory_profiler' %>
74
+ <%= link_to example_url, example_url %></p>
75
+ <br/>
76
+
77
+ <h4>CPU Profiling <%= truth_label(defined?(RubyProf), 'available', 'not available') %></h4>
78
+ <p>Profile CPU usage using <code>ruby-prof</code> with <code>tuttle-profiler=ruby-prof</code> query param.</p>
79
+ <p>
80
+ Specify the profile type with a <code>ruby-prof_printer</code> parameter:
81
+ <ul>
82
+ <li><code>stack</code> - (Default) Visualization of the call hierarchy with time spent in each method</li>
83
+ <li><code>fast_stack</code> - Fast version of stack (without colors or links)</li>
84
+ <li><code>flat</code> - Overall time spent in each method</li>
85
+ <li><code>graph</code> - Time spent in each method and callers/callees</li>
86
+ </ul>
87
+ <p>Example:
88
+ <% example_url = main_app_root_url + '?tuttle-profiler=ruby-prof&ruby-prof_printer=fast_stack' %>
89
+ <%= link_to example_url, example_url %></p>
90
+ </p>
91
+
92
+ <% else %>
93
+ <p>
94
+ You can include this middleware by configuring it in an initializer.
95
+ It can be put at the beginning of the stack to help profile the other middleware.
96
+ Or it can be put at the end of the stack to focus on memory from the application.
97
+ </p>
98
+ <pre>
99
+ require 'tuttle/middleware/request_profiler'
100
+ # Add memory profiler middleware at beginning of the stack
101
+ # Rails.application.config.middleware.insert(0, Tuttle::Middleware::RequestProfiler)
102
+
103
+ # Add memory profiler middleware at the end of the stack
104
+ Rails.application.config.middleware.use Tuttle::Middleware::RequestProfiler
105
+ </pre>
106
+ <% end %>
107
+
108
+ <br/>
109
+ <p>
110
+ <em>Note: Ruby-prof also provides a middleware that saves profile results to a directory
111
+ on the server for every request. And RackMiniProfiler includes this same
112
+ memory_profiler capability but requires RackMiniProfiler to be enabled,
113
+ which has an impact on profiling.</em>
114
+ </p>
115
+ </div>
116
+ <div class="panel-footer">
117
+ </div>
118
+ </div>