rails_mini_profiler 0 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -111
  3. data/Rakefile +18 -0
  4. data/app/{javascript/images → assets/images/rails_mini_profiler}/bookmark.svg +0 -0
  5. data/app/{javascript/images → assets/images/rails_mini_profiler}/chart.svg +0 -0
  6. data/app/{javascript/images → assets/images/rails_mini_profiler}/delete.svg +0 -0
  7. data/app/{javascript/images → assets/images/rails_mini_profiler}/graph.svg +0 -0
  8. data/app/{javascript/images → assets/images/rails_mini_profiler}/logo.svg +0 -0
  9. data/app/{javascript/images → assets/images/rails_mini_profiler}/logo_variant.svg +2 -2
  10. data/app/assets/images/rails_mini_profiler/search.svg +10 -0
  11. data/app/{javascript/images → assets/images/rails_mini_profiler}/setting.svg +0 -0
  12. data/app/{javascript/images → assets/images/rails_mini_profiler}/show.svg +0 -0
  13. data/app/assets/javascripts/rails_mini_profiler.js +76 -1
  14. data/app/assets/stylesheets/rails_mini_profiler/application.css +149 -1
  15. data/app/assets/stylesheets/rails_mini_profiler/flamegraph.css +14 -0
  16. data/app/{javascript/stylesheets/flashes.scss → assets/stylesheets/rails_mini_profiler/flashes.css} +5 -3
  17. data/app/{javascript/stylesheets/navbar.scss → assets/stylesheets/rails_mini_profiler/navbar.css} +14 -8
  18. data/app/assets/stylesheets/rails_mini_profiler/profiled_requests.css +180 -0
  19. data/app/{javascript/stylesheets/traces.scss → assets/stylesheets/rails_mini_profiler/traces.css} +22 -17
  20. data/app/controllers/rails_mini_profiler/application_controller.rb +4 -9
  21. data/app/controllers/rails_mini_profiler/profiled_requests_controller.rb +10 -23
  22. data/app/helpers/rails_mini_profiler/application_helper.rb +0 -11
  23. data/app/models/rails_mini_profiler/application_record.rb +1 -1
  24. data/app/models/rails_mini_profiler/controller_trace.rb +3 -7
  25. data/app/models/rails_mini_profiler/flamegraph.rb +0 -4
  26. data/app/models/rails_mini_profiler/instantiation_trace.rb +3 -7
  27. data/app/models/rails_mini_profiler/profiled_request.rb +15 -21
  28. data/app/models/rails_mini_profiler/render_partial_trace.rb +3 -7
  29. data/app/models/rails_mini_profiler/render_template_trace.rb +3 -7
  30. data/app/models/rails_mini_profiler/rmp_trace.rb +3 -7
  31. data/app/models/rails_mini_profiler/sequel_trace.rb +3 -7
  32. data/app/models/rails_mini_profiler/trace.rb +3 -7
  33. data/app/presenters/rails_mini_profiler/profiled_request_presenter.rb +15 -8
  34. data/app/views/layouts/rails_mini_profiler/application.html.erb +12 -1
  35. data/app/views/layouts/rails_mini_profiler/flamegraph.html.erb +8 -1
  36. data/app/views/rails_mini_profiler/badge.html.erb +2 -2
  37. data/app/views/rails_mini_profiler/profiled_requests/index.html.erb +58 -8
  38. data/app/views/rails_mini_profiler/profiled_requests/show.html.erb +1 -1
  39. data/app/views/rails_mini_profiler/shared/_navbar.html.erb +1 -1
  40. data/db/migrate/20210621185018_create_rmp.rb +6 -8
  41. data/lib/generators/rails_mini_profiler/install_generator.rb +0 -24
  42. data/lib/generators/rails_mini_profiler/templates/rails_mini_profiler.rb.erb +7 -23
  43. data/lib/rails_mini_profiler/badge.rb +1 -23
  44. data/lib/rails_mini_profiler/configuration.rb +4 -28
  45. data/lib/rails_mini_profiler/engine.rb +4 -15
  46. data/lib/rails_mini_profiler/errors.rb +8 -0
  47. data/lib/rails_mini_profiler/guard.rb +7 -18
  48. data/lib/rails_mini_profiler/logger.rb +0 -5
  49. data/lib/rails_mini_profiler/middleware.rb +4 -4
  50. data/lib/rails_mini_profiler/models/base_model.rb +0 -5
  51. data/lib/rails_mini_profiler/models/trace.rb +9 -0
  52. data/lib/rails_mini_profiler/redirect.rb +1 -9
  53. data/lib/rails_mini_profiler/request_context.rb +7 -31
  54. data/lib/rails_mini_profiler/request_wrapper.rb +8 -44
  55. data/lib/rails_mini_profiler/storage.rb +29 -0
  56. data/lib/rails_mini_profiler/tracers.rb +85 -0
  57. data/lib/rails_mini_profiler/version.rb +1 -1
  58. data/lib/rails_mini_profiler.rb +9 -33
  59. metadata +30 -127
  60. data/LICENSE +0 -20
  61. data/app/javascript/images/check.svg +0 -3
  62. data/app/javascript/images/chevron.svg +0 -3
  63. data/app/javascript/images/filter.svg +0 -1
  64. data/app/javascript/images/search.svg +0 -9
  65. data/app/javascript/js/checklist_controller.js +0 -48
  66. data/app/javascript/js/enable_controller.js +0 -24
  67. data/app/javascript/js/filter_controller.js +0 -44
  68. data/app/javascript/js/search_controller.js +0 -18
  69. data/app/javascript/js/select_controller.js +0 -47
  70. data/app/javascript/packs/rails-mini-profiler.js +0 -88
  71. data/app/javascript/stylesheets/components/page_header/page_header.scss +0 -3
  72. data/app/javascript/stylesheets/components/pagination.scss +0 -55
  73. data/app/javascript/stylesheets/components/profiled_request_table/placeholder.scss +0 -33
  74. data/app/javascript/stylesheets/components/profiled_request_table/profiled_request_table.scss +0 -179
  75. data/app/javascript/stylesheets/flamegraph.scss +0 -10
  76. data/app/javascript/stylesheets/profiled_requests.scss +0 -89
  77. data/app/javascript/stylesheets/rails-mini-profiler.scss +0 -205
  78. data/app/search/rails_mini_profiler/base_search.rb +0 -67
  79. data/app/search/rails_mini_profiler/profiled_request_search.rb +0 -34
  80. data/app/views/models/_flamegraph.json.jb +0 -3
  81. data/app/views/models/_profiled_request.jb +0 -3
  82. data/app/views/models/_trace.jb +0 -3
  83. data/app/views/rails_mini_profiler/flamegraphs/show.json.jb +0 -3
  84. data/app/views/rails_mini_profiler/profiled_requests/index.json.jb +0 -3
  85. data/app/views/rails_mini_profiler/profiled_requests/shared/header/_header.erb +0 -20
  86. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_placeholder.erb +0 -12
  87. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_table.erb +0 -14
  88. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_table_head.erb +0 -125
  89. data/app/views/rails_mini_profiler/profiled_requests/shared/table/_table_row.erb +0 -21
  90. data/app/views/rails_mini_profiler/profiled_requests/show.json.jb +0 -5
  91. data/app/views/rails_mini_profiler/shared/_head.erb +0 -13
  92. data/lib/generators/rails_mini_profiler/templates/rails_mini_profiler.js.erb +0 -13
  93. data/lib/rails_mini_profiler/configuration/storage.rb +0 -47
  94. data/lib/rails_mini_profiler/configuration/user_interface.rb +0 -48
  95. data/lib/rails_mini_profiler/tracing/controller_tracer.rb +0 -15
  96. data/lib/rails_mini_profiler/tracing/null_trace.rb +0 -7
  97. data/lib/rails_mini_profiler/tracing/sequel_tracer.rb +0 -37
  98. data/lib/rails_mini_profiler/tracing/sequel_tracker.rb +0 -37
  99. data/lib/rails_mini_profiler/tracing/subscriptions.rb +0 -34
  100. data/lib/rails_mini_profiler/tracing/trace.rb +0 -45
  101. data/lib/rails_mini_profiler/tracing/trace_factory.rb +0 -37
  102. data/lib/rails_mini_profiler/tracing/tracer.rb +0 -31
  103. data/lib/rails_mini_profiler/tracing/view_tracer.rb +0 -12
  104. data/lib/rails_mini_profiler/tracing.rb +0 -11
  105. data/public/rails_mini_profiler/speedscope/LICENSE +0 -21
  106. data/public/rails_mini_profiler/speedscope/demangle-cpp.1768f4cc.js +0 -4
  107. data/public/rails_mini_profiler/speedscope/demangle-cpp.1768f4cc.js.map +0 -1
  108. data/public/rails_mini_profiler/speedscope/favicon-16x16.f74b3187.png +0 -0
  109. data/public/rails_mini_profiler/speedscope/favicon-32x32.bc503437.png +0 -0
  110. data/public/rails_mini_profiler/speedscope/file-format-schema.json +0 -324
  111. data/public/rails_mini_profiler/speedscope/import.e3a73ef4.js +0 -117
  112. data/public/rails_mini_profiler/speedscope/import.e3a73ef4.js.map +0 -1
  113. data/public/rails_mini_profiler/speedscope/index.html +0 -2
  114. data/public/rails_mini_profiler/speedscope/release.txt +0 -3
  115. data/public/rails_mini_profiler/speedscope/reset.8c46b7a1.css +0 -2
  116. data/public/rails_mini_profiler/speedscope/reset.8c46b7a1.css.map +0 -1
  117. data/public/rails_mini_profiler/speedscope/source-map.438fa06b.js +0 -24
  118. data/public/rails_mini_profiler/speedscope/source-map.438fa06b.js.map +0 -1
  119. data/public/rails_mini_profiler/speedscope/speedscope.026f36b0.js +0 -200
  120. data/public/rails_mini_profiler/speedscope/speedscope.026f36b0.js.map +0 -1
  121. data/vendor/assets/images/bookmark.svg +0 -10
  122. data/vendor/assets/images/chart.svg +0 -12
  123. data/vendor/assets/images/check.svg +0 -3
  124. data/vendor/assets/images/chevron.svg +0 -3
  125. data/vendor/assets/images/delete.svg +0 -9
  126. data/vendor/assets/images/filter.svg +0 -1
  127. data/vendor/assets/images/graph.svg +0 -11
  128. data/vendor/assets/images/logo.svg +0 -18
  129. data/vendor/assets/images/logo_variant.svg +0 -32
  130. data/vendor/assets/images/search.svg +0 -9
  131. data/vendor/assets/images/setting.svg +0 -10
  132. data/vendor/assets/images/show.svg +0 -11
  133. data/vendor/assets/javascripts/rails-mini-profiler.css +0 -1
  134. data/vendor/assets/javascripts/rails-mini-profiler.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96a6d11caabcae6df487601bf8f2283ddfd4d72eecefcab62355f56ae4dbf552
4
- data.tar.gz: ddc642e94f3e9832023d3de12e532490ad509c4a9cfc61b4dd010dab811dc750
3
+ metadata.gz: 5b1f043e04e0f4aaf67b7cfe22be413aa689e51553c3e30e535b2a828d5abde2
4
+ data.tar.gz: '028d6a1d92f6d66552ccf5f7ea9d1c622d15551ba16977c53b773041fd48464c'
5
5
  SHA512:
6
- metadata.gz: be8f67fe210563c0857dd665b7a58ce02648814f7b8848eded9919a8af667332d3718d8d5525a4ea5777f380f8c16dfcb41baaec5d74c3b9f53b9284745809de
7
- data.tar.gz: 237ddd6a552449b30e13fb0f36d866c65b3be913e4cce8f4f69b9d48e8f800cb75f773ede153409f1dc0aa21314fa0cfd1f6f80551a7e2621aa43b5bb28768ea
6
+ metadata.gz: 4722b94b458742b5f0c3f3ebe12c119054f053f9a4c783748e5e72686f5676de3fdc7ea5ff9c7aa1bc3872e4ed1d139934aeeb7f653ab40a4818d11b268b85ef
7
+ data.tar.gz: '0958d98854d3df4c1129a2aef7a85dbf0053770f6c761b7901bf3e121acbb2d1116308d419364ce5528b1b8458d68368bb6f32938966b5a35215c45fe8cd2872'
data/README.md CHANGED
@@ -6,42 +6,33 @@
6
6
 
7
7
  ### Performance profiling for Rails, made simple.
8
8
 
9
- [![Gem Version](https://badge.fury.io/rb/rails_mini_profiler.svg)](https://badge.fury.io/rb/rails_mini_profiler)
9
+ [![Gem Version](https://badge.fury.io/rb/graphql-groups.svg)](https://badge.fury.io/rb/graphql-groups)
10
10
  [![Main](https://github.com/hschne/rails-mini-profiler/actions/workflows/main.yml/badge.svg)](https://github.com/hschne/rails-mini-profiler/actions/workflows/main.yml)
11
- [![License](https://img.shields.io/github/license/hschne/rails-mini-profiler)](https://img.shields.io/github/license/hschne/rails-mini-profiler)
12
-
13
- [![Maintainability](https://api.codeclimate.com/v1/badges/1fcc2f4d01ab5bf7a260/maintainability)](https://codeclimate.com/github/hschne/rails-mini-profiler/maintainability)
14
- [![Test Coverage](https://api.codeclimate.com/v1/badges/1fcc2f4d01ab5bf7a260/test_coverage)](https://codeclimate.com/github/hschne/rails-mini-profiler/test_coverage)
11
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/692d4125ac8548fb145e/test_coverage)](https://codeclimate.com/github/hschne/graphql-groups/test_coverage)
15
12
 
16
13
  </div>
17
14
 
18
15
  ## What's this?
19
16
 
20
- Rails Mini Profiler is an easy-to-use performance profiler for your Rails applications. It is heavily inspired by [Rack Mini Profiler](https://github.com/MiniProfiler/rack-mini-profiler) and other APM tools. To find out how it stacks up against those check out [Why Rails Mini Profiler](#why-rails-mini-profiler)?
21
-
22
- To see it in action view the preview below:
17
+ Rails Mini Profiler is an easy-to-use performance profiler for your Rails applications. It is heavily inspired by [Rack Mini Profiler](https://github.com/MiniProfiler/rack-mini-profiler) and other APM tools. It looks something like this:
23
18
 
24
- <div align="center">
25
19
 
26
- [![Rails Mini Profiler Preview](http://img.youtube.com/vi/fSR8fCcsO8Q/0.jpg)](https://www.youtube.com/watch?v=fSR8fCcsO8Q)
27
20
 
28
- </div>
29
-
30
- **Note**: This gem is in early development and I'm looking for contributors. Try it out and leave some feedback, it really goes a long way in helping me out with development. Any [feature request](https://github.com/hschne/rails-mini-profiler/issues/new?assignees=&labels=type%3ABug&template=FEATURE_REQUEST.md&title=) or [bug report](https://github.com/hschne/rails-mini-profiler/issues/new?assignees=&labels=type%3AEnhancement&template=BUG_REPORT.md&title=) is welcome. If you like this project, leave a star to show your support! ⭐
21
+ **Note**: This gem is in early development and I'm looking for contributors. Try it out and leave some feedback, it really goes a long way in helping me out with development. Any [feature request](https://github.com/hschne/rails-mini-profiler/issues/new?assignees=&labels=type%3ABug&template=FEATURE_REQUEST.md&title=) or [bug report](https://github.com/hschne/rails-mini-profiler/issues/new?assignees=&labels=type%3AEnhancement&template=BUG_REPORT.md&title=) is welcome. If you like this project, leave a star to show your support! ⭐
31
22
 
32
23
  ## Getting Started
33
24
 
34
25
  Add Rails Mini Profiler to your Gemfile:
35
26
 
36
27
  ```ruby
37
- gem 'rails_mini_profiler'
28
+ gem 'rails-mini-profiler'
38
29
  ```
39
30
 
40
31
  Install the gem and run the installer:
41
32
 
42
33
  ```bash
43
34
  bundle install
44
- rails rails_mini_profiler:install
35
+ rails rail_mini_profiler:install
45
36
  ```
46
37
 
47
38
  Inspect the generated migration in `db/migrate` and run it:
@@ -51,7 +42,7 @@ rails db:migrate
51
42
  ```
52
43
 
53
44
  Start your Rails application and perform some requests. You can either click the little hedgehog 🦔 on the top
54
- left or navigate to `/rails_mini_profiler` to view collected performance metrics.
45
+ right or navigate to `/rails_mini_profiler` to view collected performance metrics.
55
46
 
56
47
  ## Usage
57
48
 
@@ -64,7 +55,7 @@ route:
64
55
  # routes.rb
65
56
  Rails.application.routes.draw do
66
57
  ...
67
-
58
+
68
59
  mount RailsMiniProfiler::Engine => '/rails_mini_profiler'
69
60
  end
70
61
  ```
@@ -91,37 +82,35 @@ By clicking on individual traces you can find out detailed information.
91
82
 
92
83
  ### Flamegraphs
93
84
 
94
- Rails Mini Profiler automatically records Flamegraphs for profiled requests. To enable this feature, add [Stackprof](https://github.com/tmm1/stackprof)
95
- to your Gemfile:
85
+ Rails Mini Profiler per default records Flamegraphs for every profiled request for convenience. Note that Flamegraphs recording
86
+ incur a significant performance penalty, and can take up a lot of space.
96
87
 
97
- ```ruby
98
- gem 'stackprof'
99
- ```
100
-
101
- For convenience, Flamegraphs are recorded for every request. This may incur a significant performance penalty. To change the default behavior see [Configuration](#Configuration).
88
+ To change the default behavior see [Configuration](#Configuration).
102
89
 
103
- Flamegraphs are rendered using [Speedscope](https://github.com/jlfwong/speedscope). See [Troubleshooting](#Troubleshooting) if Flamegraphs are not rendering correctly.
90
+ Flamegraphs are rendered using [Speedscope](https://github.com/jlfwong/speedscope). If Flamegraphs are not rendering
91
+ you may have to amend your content security policy. See [Troubleshooting](#Troubleshooting)
104
92
 
105
93
  ## Configuration
106
94
 
107
- Rails Mini Profiler provides a wide array of configuration options. You can find details below. For an example configuration check `initializers/rails_mini_profiler.rb` (or [the template file](https://github.com/hschne/rails-mini-profiler/blob/main/lib/generators/rails_mini_profiler/templates/rails_mini_profiler.rb.erb)).
95
+ You can set the following configuration options in Rails Mini Profiler:
108
96
 
109
- | Name | Default | Description |
97
+ | Option | Default | Description |
110
98
  |--------------------------|------------------------------|-------------------------------------------------------------------------------------------------|
111
99
  | `enabled` | `true` (dev)/ `false` (prod) | Whether or not RMP is enabled |
100
+ | `badge_enabled` | `true` | Should the hedgehog 🦔 badge be injected into pages? |
101
+ | `badge_position` | `'top-left'` | Where to display the badge. Options are `'top-left', 'top-right', 'bottom-left, 'bottom-right'` |
112
102
  | `flamegraph_enabled` | `true` | Should flamegraphs be recorded automatically? |
113
103
  | `flamegraph_sample_rate` | `0.5` | The flamegraph sample rate. How many snapshots per millisecond are created. |
114
104
  | `skip_paths` | `[]` | An array of request paths that should not be profiled. Regex allowed. |
115
- | `storage` | `Storage.new` | Storage configuration. See [Storage](#Storage). |
116
- | `ui` | `UserInterface.new` | UI configuration. See [UI](#UI). |
105
+ | `storage` | `Storage` | Storage configuration. See [Storage](#Storage) |
117
106
  | `user_provider` | `Rack::Request.new(env).ip` | How to identify users. See [Users](#Users) |
118
107
 
119
108
  ### Request Configuration
120
109
 
121
110
  You may override the configuration by sending request parameters. The following parameters are available:
122
111
 
123
- | Name | Description |
124
- | ---------------- | ------------------------------------------------------------------------------------------- |
112
+ | Option | Description |
113
+ |------------------|---------------------------------------------------------------------------------------------|
125
114
  | `rmp_flamegraph` | Overrides `flamegraph_enabled` If set to `true` will redirect to the flamegraph immediatly. |
126
115
 
127
116
  ### Storage
@@ -129,8 +118,8 @@ You may override the configuration by sending request parameters. The following
129
118
  Rails Mini Profiler stores profiling information in your database per default. You can configure various details of how
130
119
  traces and requests are stored.
131
120
 
132
- | Name | Default | Description |
133
- | ------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------- |
121
+ | Configuration | Default | Description |
122
+ |---------------------------|-------------------------|-----------------------------------------------------------------------------------------------------------|
134
123
  | `database` | `nil` | Set a custom database to be used for storing profiler information. Uses `connect_to` for profiler records |
135
124
  | `profiled_requests_table` | `rmp_profiled_requests` | The table to be used to store profiled requests. |
136
125
  | `flamegraphs_table` | `rmp_flamegraphs` | The table to be used to store flamegraphs. |
@@ -138,7 +127,7 @@ traces and requests are stored.
138
127
 
139
128
  Rails Mini Profiler does not offer an automatic way to clean up old profiling information. It is recommended you add a sweeper job to clean up old profiled requests periodically (e.g. using [clockwork](https://github.com/adamwiggins/clockwork). For example, with ActiveJob:
140
129
 
141
- ```ruby
130
+ ```
142
131
  # Clockwork
143
132
  every(1.month, 'purge rails mini profiler' do
144
133
  ProfiledRequestCleanupJob.perform_later
@@ -148,22 +137,12 @@ end
148
137
  class ProfiledRequestCleanupJob < ApplicationJob
149
138
  queue_as :default
150
139
 
151
- def perform
140
+ def perform(*guests)
152
141
  RailsMiniProfiler::ProfiledRequest.where('created_at < ?', 1.month.ago).destroy_all
153
142
  end
154
143
  end
155
144
  ```
156
145
 
157
- ### UI
158
-
159
- Rails Mini Profiler allows you to configure various UI features.
160
-
161
- | Name | Default | Description |
162
- |------------------|--------------|-------------------------------------------------------------------------------------------------|
163
- | `badge_enabled` | `true` | Should the hedgehog 🦔 badge be injected into pages? |
164
- | `badge_position` | `'top-left'` | Where to display the badge. Options are `'top-left', 'top-right', 'bottom-left, 'bottom-right'` |
165
- | `page_size` | `25` | The page size for lists shown in the UI. |
166
-
167
146
  ### Users
168
147
 
169
148
  Profiling information is segregated by user ID. That means users cannot see each other's profiled requests.
@@ -178,7 +157,9 @@ You may also explicitly set the user from the application itself:
178
157
 
179
158
  ```ruby
180
159
  class ApplicationController < ActionController::Base
181
- before_action do
160
+ ...
161
+
162
+ before_action do
182
163
  RailsMiniProfiler::User.authorize(current_user.id)
183
164
  end
184
165
  end
@@ -202,71 +183,8 @@ end
202
183
 
203
184
  Only requests by explicitly set users will be stored. To configure how individual users are identified see [Users](#Users)
204
185
 
205
- ## Why Rails Mini Profiler?
206
-
207
- Improving the performance of any application is a 3-step process. You have to answer these questions:
208
-
209
- 1. What is slow?
210
- 2. Why is it slow?
211
- 3. Did my solution fix the slowness?
212
-
213
- I'm a huge fan of [rack-mini-profiler](https://github.com/MiniProfiler/rack-mini-profiler), and AMP tools such as [Skylight](https://www.skylight.io/) or [Scout APM](https://scoutapm.com), and each of these tools has its place.
214
-
215
- APM tools are excellent for profiling your app in production - aka. they show you what is slow - and offer _some_ hints as to what causes the slowdown. `rack-mini-profiler` can do some sampling in production, but excels at providing detailed insight into _why_ something is slow, using Flamegraphs and detailed query information.
216
-
217
- Rails Mini Profiler improves upon `rack-mini-profiler` in the latter regard. It is a developer tool, rather than a monitoring tool, and sets a big focus on developer experience. Simply put, it aims to be the best tool available to help you figure out _why_ specific requests are slow.
218
-
219
- As such, compared to `rack-mini-profiler`, it does not support non-Rails apps (e.g. Sinatra) or production sampling, but provides a much better user experience and better supports API-only applications.
220
-
221
186
  ## Troubleshooting
222
187
 
223
- ### Upgrading
224
-
225
- Rails Mini Profiler is in early development. As such, breaking changes may still be introduced on a regular basis. While Rails Mini Profiler is in pre-release we do not offer upgrade migrations.
226
-
227
- If an upgrade to Rails Mini Profiler breaks your application, we recommend that you clean house and start over. Re-run the initializer and overwrite existing files:
228
-
229
- ```bash
230
- rails rails_mini_profiler:install
231
- ```
232
-
233
- If only the DB schema is out of date, drop the offending tables and re-run migrations for the latest version:
234
-
235
- ```
236
- rails rails_mini_profiler:install:migrations
237
- rails db:migrate
238
- ```
239
-
240
- ### Support for API-Only Apps
241
-
242
- Rails Mini Profiler supports API-only apps, but you have to make some small adjustments to use it. At the top of `application.rb` add [Sprockets](https://github.com/rails/sprockets-rails):
243
-
244
- ```
245
- require "sprockets/railtie"
246
- ```
247
-
248
- Then, modify `application.rb`:
249
-
250
- ```
251
- module ApiOnly
252
- class Application < Rails::Application
253
-
254
- config.api_only = true # Either set this to false
255
- config.middleware.use ActionDispatch::Flash # Or add this
256
- end
257
- end
258
- ```
259
-
260
- **Note: Sprockets and flash are currently required for some of Rails Mini Profiler's UI features. These modifications may no longer be needed in the future.
261
-
262
- ### No Flamegraphs are being recored?
263
-
264
- Make sure you have added [StackProf](https://github.com/tmm1/stackprof) to your Gemfile.
265
-
266
- ```ruby
267
- gem 'stackprof'
268
- ```
269
-
270
188
  ### Flamegraphs are not rendering?
271
189
 
272
190
  Flamegraphs are loaded into [Speedscope](https://github.com/jlfwong/speedscope) using an Iframe and URI Encoded blobs (see [source](https://github.com/hschne/rails-mini-profiler/blob/main/app/views/rails_mini_profiler/flamegraphs/show.html.erb))
@@ -284,14 +202,14 @@ end
284
202
  [StackProf](https://github.com/tmm1/stackprof), which is used for recording Flamegraphs, does not work on concurrent requests.
285
203
  Because of this, concurrent requests may skip recording a Flamegraph.
286
204
 
287
- It is recommended that you resend _only_ the request you wish to build a Flamegraph for.
205
+ It is recommended that you resend _only_ the request you wish to get a Flamegraph for.
288
206
 
289
207
  ## Credit
290
208
 
291
209
  This project was heavily inspired by projects such as [rack-mini-profiler](https://github.com/MiniProfiler/rack-mini-profiler) and
292
210
  [rack-profiler](https://github.com/dawanda/rack-profiler). [Skylight](https://www.skylight.io/) was also a huge influence.
293
211
 
294
- [Lena Schnedlitz](https://github.com/LenaSchnedlitz) designed the Logo and provided great support. Without her supreme CSS skills this project would not have been possible 🙌
212
+ [Lena Schnedlitz](https://github.com/LenaSchnedlitz) designed the Logo and provided great support. Without her supreme CSS skills this project would not have been possible :hands_raised:
295
213
 
296
214
  ## Contributing
297
215
 
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
6
+ load 'rails/tasks/engine.rake'
7
+ load 'rails/tasks/statistics.rake'
8
+
9
+ require 'bundler/gem_tasks'
10
+
11
+ require 'rspec/core/rake_task'
12
+ rspec = RSpec::Core::RakeTask.new(:spec)
13
+ rspec.verbose = false
14
+
15
+ require 'rubocop/rake_task'
16
+ RuboCop::RakeTask.new
17
+
18
+ task default: %i[spec rubocop]
@@ -1,5 +1,5 @@
1
- <svg id="logo-variant" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1070" height="1070" viewBox="0 0 1070 1070" version="1.1">
2
- <style>#logo-variant path{fill:none;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4}</style>
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1070" height="1070" viewBox="0 0 1070 1070" version="1.1">
2
+ <style>path{fill:none;stroke-width:64;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4}</style>
3
3
  <defs>
4
4
  <linearGradient id="lightShadow">
5
5
  <stop offset="0" style="stop-color:#c22121;stop-opacity:1"/>
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
3
+ <title>Iconly/Bulk/Search</title>
4
+ <g id="Iconly/Bulk/Search" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5
+ <g id="Search" transform="translate(2.000000, 2.000000)" fill="#000000" fill-rule="nonzero">
6
+ <ellipse id="Ellipse_746" cx="8.59921927" cy="8.65324385" rx="8.59921927" ry="8.65324385"></ellipse>
7
+ <path d="M18.674623,19.9552573 C18.3405833,19.9444414 18.0229443,19.8069986 17.7853553,19.5704698 L15.7489321,17.1901566 C15.3123366,16.7908936 15.2766365,16.1123232 15.668898,15.6689038 L15.668898,15.6689038 C15.8525005,15.4831065 16.1021409,15.3786387 16.3625268,15.3786387 C16.6229128,15.3786387 16.8725531,15.4831065 17.0561557,15.6689038 L19.6172468,17.7181208 C19.9861582,18.0957076 20.0999999,18.656254 19.9078887,19.1492153 C19.7157774,19.6421767 19.2536179,19.9754211 18.7279791,20 L18.674623,19.9552573 Z" id="Path_34202" opacity="0.400000006"></path>
8
+ </g>
9
+ </g>
10
+ </svg>
@@ -12,4 +12,79 @@
12
12
  //
13
13
  //= require rails-ujs
14
14
  //= require_tree .
15
- //= require rails-mini-profiler
15
+
16
+ function setupRequestSearch() {
17
+ const profiledRequestNameSearch = document.getElementById('profiled-request-search')
18
+ if (profiledRequestNameSearch) {
19
+ profiledRequestNameSearch.addEventListener('keyup', function (event) {
20
+ if (event.key === 'Enter') {
21
+ event.preventDefault()
22
+ document.getElementById('profiled-request-search-form').submit()
23
+ }
24
+ })
25
+ }
26
+ }
27
+
28
+ function setupTraceSearch() {
29
+ const traceNameSearch = document.getElementById('trace-search')
30
+ if (traceNameSearch) {
31
+ traceNameSearch.addEventListener('keyup', function (event) {
32
+ if (event.key === 'Enter') {
33
+ event.preventDefault()
34
+ document.getElementById('trace-form').submit()
35
+ }
36
+ })
37
+ }
38
+ }
39
+
40
+ function setupRequestTable() {
41
+ const profiledRequestTable = document.getElementById('profiled-requests-table');
42
+ if (profiledRequestTable) {
43
+ const rows = profiledRequestTable.getElementsByTagName('tr')
44
+ for (let i = 0; i < rows.length; i++) {
45
+ const currentRow = profiledRequestTable.rows[i]
46
+ const link = currentRow.dataset.link
47
+ const createClickHandler = function (currentRow) {
48
+ return function () {
49
+ window.location.href = link
50
+ }
51
+ }
52
+ currentRow.onclick = createClickHandler(currentRow)
53
+ }
54
+ }
55
+ }
56
+
57
+ function setupTraceBars () {
58
+ const traceBars = document.querySelectorAll('.trace-bar')
59
+ traceBars.forEach((bar) => {
60
+ const popover = bar.children[0]
61
+ tippy(bar, {
62
+ trigger: 'click',
63
+ content: popover,
64
+ theme: 'rmp',
65
+ maxWidth: '700px',
66
+ placement: 'bottom',
67
+ interactive: true,
68
+ onShow (instance) {
69
+ instance.popper.querySelector('.popover-close').addEventListener('click', () => {
70
+ instance.hide()
71
+ })
72
+ },
73
+ onHide (instance) {
74
+ instance.popper.querySelector('.popover-close').removeEventListener('click', () => {
75
+ instance.hide()
76
+ })
77
+ },
78
+ })
79
+ })
80
+ }
81
+
82
+
83
+ // Trace Bar Popovers
84
+ document.addEventListener('DOMContentLoaded', () => {
85
+ setupRequestTable();
86
+ setupRequestSearch();
87
+ setupTraceBars();
88
+ setupTraceSearch();
89
+ }, false)
90
+
@@ -12,5 +12,153 @@
12
12
  *
13
13
  *= require_tree .
14
14
  *= require_self
15
- *= require rails-mini-profiler
16
15
  */
16
+
17
+ html {
18
+ width: 100%;
19
+ height: 100%;
20
+ margin: 0;
21
+ padding: 0;
22
+
23
+ --grey-50: #F9FAFB;
24
+ --grey-100: #F3F4F6;
25
+ --grey-200: #E5E7EB;
26
+ --grey-400: #9CA3AF;
27
+ --grey-500: #6B7280;
28
+ --grey-700: #374151;
29
+ --grey-900: #111827;
30
+
31
+ --red-400: #F87171;
32
+ --red-500: #EF4444;
33
+ --red-600: #DC2626;
34
+
35
+ --yellow-400: #FBBF24;
36
+ --yellow-500: #F59E0B;
37
+
38
+ --green-300: #6EE7B7;
39
+ --green-400: #34D399;
40
+ --green-500: #10B981;
41
+
42
+ --blue-400: #60A5FA;
43
+ --blue-500: #3B82F6;
44
+
45
+ --main-width: 1056px;
46
+
47
+ --primary: var(--red-600);
48
+
49
+ --border-color: var(--grey-200);
50
+ --text-color: var(--grey-900);
51
+
52
+ font-family: 'Open Sans', sans-serif;
53
+ }
54
+
55
+ body {
56
+ width: 100%;
57
+ height: 100%;
58
+ margin: 0;
59
+ padding: 0;
60
+
61
+ color: var(--text-color)
62
+ }
63
+
64
+ h1 {
65
+ padding: 2rem 0 1rem;
66
+ }
67
+
68
+ button {
69
+ border: none;
70
+ border-radius: .25rem;
71
+ padding: 0.5em .5em;
72
+ text-align: center;
73
+ text-decoration: none;
74
+ display: inline-block;
75
+ font-size: 1rem;
76
+ cursor: pointer;
77
+ }
78
+
79
+ button:hover {
80
+ box-shadow: 0 .25rem .25rem 0 var(--grey-50);
81
+ }
82
+
83
+ /* --------------------------------------- */
84
+
85
+ .text-left {
86
+ text-align: left;
87
+ }
88
+
89
+ .text-right {
90
+ text-align: right;
91
+ }
92
+
93
+ /* --------------------------------------- */
94
+
95
+ .pill {
96
+ margin: .2rem 0;
97
+ padding: .1rem .4rem;
98
+ border-radius: 5px;
99
+
100
+ font-size: .9rem;
101
+ font-weight: 600;
102
+ letter-spacing: .1rem;
103
+
104
+ background: var(--grey-200);
105
+ }
106
+
107
+ /* --------------------------------------- */
108
+
109
+ .popover {
110
+ display: flex;
111
+ flex-direction: column;
112
+ width: 600px;
113
+ padding: 1em;
114
+ color: black;
115
+ }
116
+
117
+ .popover-header {
118
+ display: flex;
119
+ padding-bottom: 1em;
120
+ flex-direction: row;
121
+ justify-content: space-between;
122
+ align-items: center;
123
+ }
124
+
125
+ .popover-description {
126
+ margin: 0;
127
+ padding: 0;
128
+ }
129
+
130
+ .popover-close {
131
+ background: transparent;
132
+ padding: 0;
133
+ font-weight: 700;
134
+ font-size: 20px;
135
+ color: var(--grey-400);
136
+ }
137
+
138
+ .popover-body {
139
+ padding: 1em 0;
140
+ }
141
+
142
+ .popover-footer {
143
+ border-top: 1px solid var(--grey-50);
144
+ }
145
+
146
+ .tippy-box[data-theme~='rmp'] {
147
+ background: white;
148
+ box-shadow: 8px 0 30px 4px rgba(0, 0, 0, .2), 8px 4px 10px 0 rgba(0, 0, 0, .05);
149
+ border-radius: 3px;
150
+
151
+ transition: all cubic-bezier(.19,1,.22,1) .2s;
152
+ }
153
+ .tippy-box[data-theme~='rmp'][data-placement^='top'] > .tippy-arrow::before {
154
+ border-top-color: white;
155
+ }
156
+ .tippy-box[data-theme~='rmp'][data-placement^='bottom'] > .tippy-arrow::before {
157
+ border-bottom-color: white;
158
+ }
159
+ .tippy-box[data-theme~='rmp'][data-placement^='left'] > .tippy-arrow::before {
160
+ border-left-color: white;
161
+ }
162
+ .tippy-box[data-theme~='rmp'][data-placement^='right'] > .tippy-arrow::before {
163
+ border-right-color: white;
164
+ }
@@ -0,0 +1,14 @@
1
+ /*
2
+ Place all the styles related to the matching controller here.
3
+ They will automatically be included in application.css.
4
+ */
5
+
6
+ #wrapper {
7
+ height: 100vh;
8
+ width: 100%;
9
+ }
10
+
11
+ #speedscope-iframe {
12
+ width: 100%;
13
+ height: 100%;
14
+ border: none; }
@@ -1,15 +1,17 @@
1
1
  .flash {
2
- padding: 1rem 1rem;
3
2
  margin-top: 1rem;
3
+ padding: 1rem 1rem;
4
+
4
5
  border-radius: 5px;
5
6
  }
6
7
 
7
8
  .flash-error {
8
- background: var(--red-500);
9
9
  color: white;
10
+ background: var(--red-500);
10
11
  }
11
12
 
12
13
  .flash-notice {
13
- background: var(--green-400);
14
14
  color: white;
15
+ background: var(--green-400);
16
+
15
17
  }
@@ -1,26 +1,31 @@
1
1
  .header {
2
+ margin: 0;
3
+ padding: 1.5rem 0;
4
+
2
5
  display: flex;
3
6
  justify-content: center;
4
- padding: 1.5rem 0;
5
- margin: 0;
7
+
8
+ box-shadow: 0 0 20px 0 rgba(0,0,0,.2);
9
+
6
10
  background: var(--primary);
7
- box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2);
8
11
  }
9
12
 
10
13
  .header a {
11
- color: white;
14
+ color:white;
12
15
  text-decoration: none;
13
16
  }
14
17
 
15
18
  .nav {
16
- display: flex;
17
19
  width: var(--main-width);
20
+
21
+ display: flex;
18
22
  justify-content: space-between;
19
23
  }
20
24
 
21
25
  .home {
22
26
  display: flex;
23
27
  align-items: center;
28
+
24
29
  text-decoration: none;
25
30
  }
26
31
 
@@ -35,10 +40,11 @@
35
40
  }
36
41
 
37
42
  .header-links {
43
+ margin: 0;
44
+ padding: 0;
45
+ list-style: none;
38
46
  display: flex;
39
47
  align-items: center;
40
- padding: 0;
41
- margin: 0;
48
+
42
49
  font-weight: 700;
43
- list-style: none;
44
50
  }