rails_mini_profiler 0.1.0 → 0.1.1
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/README.md +52 -16
- data/app/models/rails_mini_profiler/controller_trace.rb +7 -3
- data/app/models/rails_mini_profiler/flamegraph.rb +4 -0
- data/app/models/rails_mini_profiler/instantiation_trace.rb +7 -3
- data/app/models/rails_mini_profiler/profiled_request.rb +21 -15
- data/app/models/rails_mini_profiler/render_partial_trace.rb +7 -3
- data/app/models/rails_mini_profiler/render_template_trace.rb +7 -3
- data/app/models/rails_mini_profiler/rmp_trace.rb +7 -3
- data/app/models/rails_mini_profiler/sequel_trace.rb +7 -3
- data/app/models/rails_mini_profiler/trace.rb +7 -3
- data/db/migrate/20210621185018_create_rmp.rb +8 -6
- data/lib/generators/rails_mini_profiler/templates/rails_mini_profiler.rb.erb +1 -1
- data/lib/rails_mini_profiler/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68745f57dfbd4c05a60722a699c377ec8b5eb6f101edc3259bec8134f3b8078e
|
4
|
+
data.tar.gz: c28c669797fb80f92590a9b7574878c59bc0050c415b939d14936c2caf7127d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c2a6559821ce43c54dd30f1f8c396734b2f8d2559b81802553a31197f7a1cdafbd7ee25756f59ea51e3b6aa4685a6184a9b8972bdc3b761e7ac4b6261724ee2
|
7
|
+
data.tar.gz: 34af332d02f3e9a7de68e74a3f900b8c58c57bed9f7fcb37b4c7125e9086c57d446885d8778755d92bddcbb10cd8b5e3393c066877ca9844cffec9e712a82506
|
data/README.md
CHANGED
@@ -6,33 +6,42 @@
|
|
6
6
|
|
7
7
|
### Performance profiling for Rails, made simple.
|
8
8
|
|
9
|
-
[](https://badge.fury.io/rb/rails_mini_profiler)
|
10
10
|
[](https://github.com/hschne/rails-mini-profiler/actions/workflows/main.yml)
|
11
|
-
[](https://img.shields.io/github/license/hschne/rails-mini-profiler)
|
12
|
+
|
13
|
+
[](https://codeclimate.com/github/hschne/rails-mini-profiler/maintainability)
|
14
|
+
[](https://codeclimate.com/github/hschne/rails-mini-profiler/test_coverage)
|
12
15
|
|
13
16
|
</div>
|
14
17
|
|
15
18
|
## What's this?
|
16
19
|
|
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.
|
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:
|
23
|
+
|
24
|
+
<div align="center">
|
18
25
|
|
26
|
+
[](https://www.youtube.com/watch?v=fSR8fCcsO8Q)
|
19
27
|
|
28
|
+
</div>
|
20
29
|
|
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
|
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! ⭐
|
22
31
|
|
23
32
|
## Getting Started
|
24
33
|
|
25
34
|
Add Rails Mini Profiler to your Gemfile:
|
26
35
|
|
27
36
|
```ruby
|
28
|
-
gem '
|
37
|
+
gem 'rails_mini_profiler'
|
29
38
|
```
|
30
39
|
|
31
40
|
Install the gem and run the installer:
|
32
41
|
|
33
42
|
```bash
|
34
43
|
bundle install
|
35
|
-
rails
|
44
|
+
rails rails_mini_profiler:install
|
36
45
|
```
|
37
46
|
|
38
47
|
Inspect the generated migration in `db/migrate` and run it:
|
@@ -42,7 +51,7 @@ rails db:migrate
|
|
42
51
|
```
|
43
52
|
|
44
53
|
Start your Rails application and perform some requests. You can either click the little hedgehog 🦔 on the top
|
45
|
-
|
54
|
+
left or navigate to `/rails_mini_profiler` to view collected performance metrics.
|
46
55
|
|
47
56
|
## Usage
|
48
57
|
|
@@ -55,7 +64,7 @@ route:
|
|
55
64
|
# routes.rb
|
56
65
|
Rails.application.routes.draw do
|
57
66
|
...
|
58
|
-
|
67
|
+
|
59
68
|
mount RailsMiniProfiler::Engine => '/rails_mini_profiler'
|
60
69
|
end
|
61
70
|
```
|
@@ -95,7 +104,7 @@ you may have to amend your content security policy. See [Troubleshooting](#Troub
|
|
95
104
|
You can set the following configuration options in Rails Mini Profiler:
|
96
105
|
|
97
106
|
| Option | Default | Description |
|
98
|
-
|
107
|
+
| ------------------------ | ---------------------------- | ----------------------------------------------------------------------------------------------- |
|
99
108
|
| `enabled` | `true` (dev)/ `false` (prod) | Whether or not RMP is enabled |
|
100
109
|
| `badge_enabled` | `true` | Should the hedgehog 🦔 badge be injected into pages? |
|
101
110
|
| `badge_position` | `'top-left'` | Where to display the badge. Options are `'top-left', 'top-right', 'bottom-left, 'bottom-right'` |
|
@@ -110,7 +119,7 @@ You can set the following configuration options in Rails Mini Profiler:
|
|
110
119
|
You may override the configuration by sending request parameters. The following parameters are available:
|
111
120
|
|
112
121
|
| Option | Description |
|
113
|
-
|
122
|
+
| ---------------- | ------------------------------------------------------------------------------------------- |
|
114
123
|
| `rmp_flamegraph` | Overrides `flamegraph_enabled` If set to `true` will redirect to the flamegraph immediatly. |
|
115
124
|
|
116
125
|
### Storage
|
@@ -119,7 +128,7 @@ Rails Mini Profiler stores profiling information in your database per default. Y
|
|
119
128
|
traces and requests are stored.
|
120
129
|
|
121
130
|
| Configuration | Default | Description |
|
122
|
-
|
131
|
+
| ------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------- |
|
123
132
|
| `database` | `nil` | Set a custom database to be used for storing profiler information. Uses `connect_to` for profiler records |
|
124
133
|
| `profiled_requests_table` | `rmp_profiled_requests` | The table to be used to store profiled requests. |
|
125
134
|
| `flamegraphs_table` | `rmp_flamegraphs` | The table to be used to store flamegraphs. |
|
@@ -137,7 +146,7 @@ end
|
|
137
146
|
class ProfiledRequestCleanupJob < ApplicationJob
|
138
147
|
queue_as :default
|
139
148
|
|
140
|
-
def perform
|
149
|
+
def perform
|
141
150
|
RailsMiniProfiler::ProfiledRequest.where('created_at < ?', 1.month.ago).destroy_all
|
142
151
|
end
|
143
152
|
end
|
@@ -158,8 +167,8 @@ You may also explicitly set the user from the application itself:
|
|
158
167
|
```ruby
|
159
168
|
class ApplicationController < ActionController::Base
|
160
169
|
...
|
161
|
-
|
162
|
-
before_action do
|
170
|
+
|
171
|
+
before_action do
|
163
172
|
RailsMiniProfiler::User.authorize(current_user.id)
|
164
173
|
end
|
165
174
|
end
|
@@ -183,8 +192,35 @@ end
|
|
183
192
|
|
184
193
|
Only requests by explicitly set users will be stored. To configure how individual users are identified see [Users](#Users)
|
185
194
|
|
195
|
+
## Why Rails Mini Profiler?
|
196
|
+
|
197
|
+
Improving the performance of any application is a 3-step process. You have to answer these questions:
|
198
|
+
|
199
|
+
1. What is slow?
|
200
|
+
2. Why is it slow?
|
201
|
+
3. Did my solution fix the slowness?
|
202
|
+
|
203
|
+
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.
|
204
|
+
|
205
|
+
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.
|
206
|
+
|
207
|
+
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.
|
208
|
+
|
209
|
+
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.
|
210
|
+
|
186
211
|
## Troubleshooting
|
187
212
|
|
213
|
+
### Upgrading
|
214
|
+
|
215
|
+
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.
|
216
|
+
|
217
|
+
If an upgrade to Rails Mini Profiler breaks your application, we recommend that you drop the offending tables and re-run migrations for the latest version:
|
218
|
+
|
219
|
+
```
|
220
|
+
rails rails_mini_profiler:install:migrations
|
221
|
+
rails db:migrate
|
222
|
+
```
|
223
|
+
|
188
224
|
### Flamegraphs are not rendering?
|
189
225
|
|
190
226
|
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))
|
@@ -202,14 +238,14 @@ end
|
|
202
238
|
[StackProf](https://github.com/tmm1/stackprof), which is used for recording Flamegraphs, does not work on concurrent requests.
|
203
239
|
Because of this, concurrent requests may skip recording a Flamegraph.
|
204
240
|
|
205
|
-
It is recommended that you resend _only_ the request you wish to
|
241
|
+
It is recommended that you resend _only_ the request you wish to build a Flamegraph for.
|
206
242
|
|
207
243
|
## Credit
|
208
244
|
|
209
245
|
This project was heavily inspired by projects such as [rack-mini-profiler](https://github.com/MiniProfiler/rack-mini-profiler) and
|
210
246
|
[rack-profiler](https://github.com/dawanda/rack-profiler). [Skylight](https://www.skylight.io/) was also a huge influence.
|
211
247
|
|
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
|
248
|
+
[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 🙌
|
213
249
|
|
214
250
|
## Contributing
|
215
251
|
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class ControllerTrace < Trace
|
21
25
|
store :payload, accessors: %i[view_runtime db_runtime]
|
@@ -10,6 +10,10 @@
|
|
10
10
|
# created_at :datetime not null
|
11
11
|
# updated_at :datetime not null
|
12
12
|
#
|
13
|
+
# Indexes
|
14
|
+
#
|
15
|
+
# index_rmp_flamegraphs_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
16
|
+
#
|
13
17
|
module RailsMiniProfiler
|
14
18
|
class Flamegraph < RailsMiniProfiler::ApplicationRecord
|
15
19
|
self.table_name = RailsMiniProfiler.storage_configuration.flamegraphs_table
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class InstantiationTrace < Trace
|
21
25
|
store :payload, accessors: %i[record_count class_name]
|
@@ -4,21 +4,27 @@
|
|
4
4
|
#
|
5
5
|
# Table name: rmp_profiled_requests
|
6
6
|
#
|
7
|
-
# id
|
8
|
-
# user_id
|
9
|
-
# start
|
10
|
-
# finish
|
11
|
-
# duration
|
12
|
-
# allocations
|
13
|
-
# request_path
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
7
|
+
# id :integer not null, primary key
|
8
|
+
# user_id :string
|
9
|
+
# start :bigint
|
10
|
+
# finish :bigint
|
11
|
+
# duration :integer
|
12
|
+
# allocations :bigint
|
13
|
+
# request_path :string
|
14
|
+
# request_query_string :string
|
15
|
+
# request_method :string
|
16
|
+
# request_headers :json
|
17
|
+
# request_body :text
|
18
|
+
# response_status :integer
|
19
|
+
# response_body :text
|
20
|
+
# response_headers :json
|
21
|
+
# response_media_type :string
|
22
|
+
# created_at :datetime not null
|
23
|
+
# updated_at :datetime not null
|
24
|
+
#
|
25
|
+
# Indexes
|
26
|
+
#
|
27
|
+
# index_rmp_profiled_requests_on_created_at (created_at)
|
22
28
|
#
|
23
29
|
module RailsMiniProfiler
|
24
30
|
class ProfiledRequest < RailsMiniProfiler::ApplicationRecord
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class RenderPartialTrace < Trace
|
21
25
|
store :payload, accessors: %i[identifier]
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class RenderTemplateTrace < Trace
|
21
25
|
store :payload, accessors: %i[identifier]
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class RmpTrace < Trace
|
21
25
|
class << self
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class SequelTrace < Trace
|
21
25
|
store :payload, accessors: %i[name sql binds]
|
@@ -7,15 +7,19 @@
|
|
7
7
|
# id :integer not null, primary key
|
8
8
|
# rmp_profiled_request_id :bigint not null
|
9
9
|
# name :string
|
10
|
-
# start :
|
11
|
-
# finish :
|
10
|
+
# start :bigint
|
11
|
+
# finish :bigint
|
12
12
|
# duration :integer
|
13
|
-
# allocations :
|
13
|
+
# allocations :bigint
|
14
14
|
# payload :json
|
15
15
|
# backtrace :json
|
16
16
|
# created_at :datetime not null
|
17
17
|
# updated_at :datetime not null
|
18
18
|
#
|
19
|
+
# Indexes
|
20
|
+
#
|
21
|
+
# index_rmp_traces_on_rmp_profiled_request_id (rmp_profiled_request_id)
|
22
|
+
#
|
19
23
|
module RailsMiniProfiler
|
20
24
|
class Trace < RailsMiniProfiler::ApplicationRecord
|
21
25
|
self.table_name = RailsMiniProfiler.storage_configuration.traces_table
|
@@ -4,10 +4,10 @@ class CreateRmp < ActiveRecord::Migration[6.0]
|
|
4
4
|
def change
|
5
5
|
create_table :rmp_profiled_requests do |t|
|
6
6
|
t.string :user_id
|
7
|
-
t.
|
8
|
-
t.
|
7
|
+
t.bigint :start
|
8
|
+
t.bigint :finish
|
9
9
|
t.integer :duration
|
10
|
-
t.
|
10
|
+
t.bigint :allocations
|
11
11
|
t.string :request_path
|
12
12
|
t.string :request_query_string
|
13
13
|
t.string :request_method
|
@@ -19,15 +19,17 @@ class CreateRmp < ActiveRecord::Migration[6.0]
|
|
19
19
|
t.string :response_media_type
|
20
20
|
|
21
21
|
t.timestamps
|
22
|
+
|
23
|
+
t.index :created_at
|
22
24
|
end
|
23
25
|
|
24
26
|
create_table :rmp_traces do |t|
|
25
27
|
t.belongs_to :rmp_profiled_request, null: false, foreign_key: true
|
26
28
|
t.string :name
|
27
|
-
t.
|
28
|
-
t.
|
29
|
+
t.bigint :start
|
30
|
+
t.bigint :finish
|
29
31
|
t.integer :duration
|
30
|
-
t.
|
32
|
+
t.bigint :allocations
|
31
33
|
t.json :payload
|
32
34
|
t.json :backtrace
|
33
35
|
|
@@ -6,7 +6,7 @@ RailsMiniProfiler.configure do |config|
|
|
6
6
|
# config.flamegraph_enabled = false
|
7
7
|
|
8
8
|
# Use RailsMiniProfiler::Storage::ActiveRecord to store profiles in your Database
|
9
|
-
config.storage = RailsMiniProfiler::Storage
|
9
|
+
config.storage = RailsMiniProfiler::Storage
|
10
10
|
|
11
11
|
# Uncomment to customize how users are detected
|
12
12
|
# config.user_provider = proc { |env| Rack::Request.new(env).ip }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_mini_profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hschne
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: inline_svg
|