inner_performance 0.1.4 → 0.2.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 +13 -9
- data/Rakefile +5 -5
- data/app/controllers/inner_performance/dashboard_controller.rb +5 -5
- data/app/controllers/inner_performance/events_controller.rb +6 -1
- data/app/controllers/inner_performance/frontends_controller.rb +32 -0
- data/app/frontend/inner_performance/vendor/bootstrap.min.css +5 -0
- data/app/helpers/inner_performance/application_helper.rb +2 -2
- data/app/jobs/inner_performance/cleanup_job.rb +7 -2
- data/app/jobs/inner_performance/save_event_job.rb +13 -3
- data/app/mailers/inner_performance/application_mailer.rb +2 -2
- data/app/models/inner_performance/event.rb +3 -1
- data/app/models/inner_performance/trace.rb +7 -0
- data/app/models/inner_performance/traces/db.rb +22 -0
- data/app/models/inner_performance/traces/view.rb +22 -0
- data/app/services/inner_performance/trace_for_insert_initializer.rb +19 -0
- data/app/views/inner_performance/events/_event.html.erb +1 -1
- data/app/views/inner_performance/events/index.html.erb +15 -4
- data/app/views/inner_performance/events/show.html.erb +32 -0
- data/app/views/inner_performance/traces/dbs/_db.html.erb +10 -0
- data/app/views/inner_performance/traces/views/_view.html.erb +9 -0
- data/app/views/layouts/inner_performance/application.html.erb +1 -3
- data/config/routes.rb +6 -2
- data/db/migrate/20241123121600_create_inner_performance_events.rb +8 -8
- data/db/migrate/20241124111458_add_type_to_inner_performance_events.rb +1 -1
- data/db/migrate/20241218082041_remove_default_value_from_inner_performance_events_properties.rb +5 -0
- data/db/migrate/20250214162622_create_inner_performance_traces.rb +13 -0
- data/lib/inner_performance/configuration.rb +19 -5
- data/lib/inner_performance/current_request.rb +37 -0
- data/lib/inner_performance/engine.rb +7 -2
- data/lib/inner_performance/version.rb +1 -1
- data/lib/inner_performance.rb +47 -10
- metadata +16 -6
- data/app/assets/config/inner_performance_manifest.js +0 -1
- data/app/assets/stylesheets/inner_performance/application.css +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c96a8facfe3fbb37d213b6b2a4b4e2050b3f253c0ec18f2d4aff77f9faed5360
|
4
|
+
data.tar.gz: ddf1874585533fd13b73baa82ae7f7daa4546d5256f091914d37739856c28434
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b761eb747aab13b1b54701d84ac2ab8f68bc6cfebe38b6283dc2608ac3716788112b8434fda349650f806f151342b39c3b18ff2e7dd79fb9522e9de16df017b0
|
7
|
+
data.tar.gz: 7993f0d2013eee24b56e43e2c33e2ab123ed4efaff3cedc2db60cad4afa7c05e76d2c201a5070a777f636de799fac66f8551675d73eda24b3d0d7ad3cba70c1b
|
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# ☯️ InnerPerformance [](https://badge.fury.io/rb/inner_performance)
|
2
|
-
|
2
|
+
Simple database-backed performance monitoring for your Rails app.
|
3
3
|
|
4
4
|
<img width="1188" alt="image" src="https://github.com/user-attachments/assets/cb659c76-8139-4ee0-b683-d6acef227dc6">
|
5
|
+
<img width="1239" alt="image" src="https://github.com/user-attachments/assets/3d15f993-4575-4a5c-977c-5983d3af13c9" />
|
5
6
|
|
6
7
|
## Installation
|
7
8
|
Add `inner_performance` gem to your bundle
|
@@ -17,11 +18,6 @@ $ rails inner_performance:install:migrations
|
|
17
18
|
$ rails db:migrate
|
18
19
|
```
|
19
20
|
|
20
|
-
Add inner_performance to `app/assets/config/manifest.js`
|
21
|
-
```javascript
|
22
|
-
//= link inner_performance/application.css
|
23
|
-
```
|
24
|
-
|
25
21
|
Mount UI in `routes.rb` (don't forget to protect it!)
|
26
22
|
|
27
23
|
```ruby
|
@@ -42,7 +38,7 @@ InnerPerformance.configure do |config|
|
|
42
38
|
# your app's performance. As an example: In a Spree shop with
|
43
39
|
# approx. 170 requests per minute, keeping it at default 2%
|
44
40
|
# provides me more than enough data to analyze and locate the
|
45
|
-
# bottlenecks.
|
41
|
+
# bottlenecks. Value can be both decimal and integer.
|
46
42
|
'process_action.action_controller' => (Rails.env.production? ? 2 : 100),
|
47
43
|
|
48
44
|
# 100% of all the jobs will be stored and analyzed.
|
@@ -60,15 +56,21 @@ InnerPerformance.configure do |config|
|
|
60
56
|
# be considered slow.
|
61
57
|
config.medium_duration_range = [200, 999]
|
62
58
|
|
59
|
+
# Set it to true to enable tracing of SQL queries and views rendering
|
60
|
+
config.traces_enabled = false
|
61
|
+
|
63
62
|
# Rules for ignoring an event. There are two rules applied by default:
|
64
63
|
# * sample_rates - operates on configured sample rate and drops events
|
65
64
|
# which do not got lucky when drawing a random number
|
66
65
|
# * InnerPerformance job namespace - we don't want to save events for
|
67
66
|
# the job that saves the events because that leeds to infinite loop.
|
68
67
|
# Better not remove this rule as it will lead to stack overflow.
|
69
|
-
config.ignore_rules.
|
68
|
+
config.ignore_rules.unshift(
|
70
69
|
proc { |event| !event.is_a?(ActiveSupport::Notifications::Event) }
|
71
70
|
)
|
71
|
+
|
72
|
+
# Set it to true if you want to cleanup old events right after saving the event
|
73
|
+
config.cleanup_immediately = false
|
72
74
|
end
|
73
75
|
```
|
74
76
|
|
@@ -81,7 +83,9 @@ InnerPerformance::CleanupJob.perform_later
|
|
81
83
|
|
82
84
|
# Alternatives
|
83
85
|
|
84
|
-
* [rails_performance](https://github.com/igorkasyanchuk/rails_performance) - much
|
86
|
+
* [rails_performance](https://github.com/igorkasyanchuk/rails_performance) - much
|
87
|
+
more robust but depends on Redis. Operates on `ActiveSupport::LogSubscriber`
|
88
|
+
instead of `ActiveSupport::Notifications`
|
85
89
|
|
86
90
|
## License
|
87
91
|
The gem is available as open source under the terms of the
|
data/Rakefile
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "bundler/setup"
|
4
4
|
|
5
|
-
APP_RAKEFILE = File.expand_path(
|
6
|
-
load
|
5
|
+
APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
|
6
|
+
load "rails/tasks/engine.rake"
|
7
7
|
|
8
|
-
load
|
8
|
+
load "rails/tasks/statistics.rake"
|
9
9
|
|
10
|
-
require
|
10
|
+
require "bundler/gem_tasks"
|
@@ -6,11 +6,11 @@ module InnerPerformance
|
|
6
6
|
@recent_events = InnerPerformance::Event.all.order(id: :desc).limit(25)
|
7
7
|
@average_req_duration = InnerPerformance::Events::ProcessActionActionController.all.average(:duration)
|
8
8
|
@average_job_duration = InnerPerformance::Events::PerformActiveJob.average(:duration) || 0
|
9
|
-
@biggest_events =
|
10
|
-
InnerPerformance::Event.select(
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
@biggest_events =
|
10
|
+
InnerPerformance::Event.select("SUM(duration) as duration, name, COUNT(*) as count, AVG(duration) as avg_duration")
|
11
|
+
.group(:name)
|
12
|
+
.order("duration DESC")
|
13
|
+
.limit(10)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -6,8 +6,13 @@ module InnerPerformance
|
|
6
6
|
|
7
7
|
def index
|
8
8
|
@q = InnerPerformance::Event.all.ransack(params[:q])
|
9
|
-
@q.sorts =
|
9
|
+
@q.sorts = "created_at desc" if @q.sorts.empty?
|
10
10
|
@pagy, @events = pagy(@q.result)
|
11
11
|
end
|
12
|
+
|
13
|
+
def show
|
14
|
+
@event = InnerPerformance::Event.find(params[:id])
|
15
|
+
@traces = @event.traces.order(created_at: :asc)
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module InnerPerformance
|
4
|
+
class FrontendsController < ApplicationController
|
5
|
+
protect_from_forgery with: :exception
|
6
|
+
skip_after_action :verify_same_origin_request, raise: false
|
7
|
+
|
8
|
+
before_action do
|
9
|
+
expires_in 1.year, public: true
|
10
|
+
end
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def asset_path(path)
|
14
|
+
Engine.root.join("app/frontend/inner_performance", path)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
STATIC_ASSETS = {
|
19
|
+
css: {
|
20
|
+
bootstrap: asset_path("vendor/bootstrap.min.css"),
|
21
|
+
},
|
22
|
+
}.freeze
|
23
|
+
|
24
|
+
def static
|
25
|
+
file_stem = params[:stem]&.to_sym
|
26
|
+
file_format = params[:format]&.to_sym
|
27
|
+
|
28
|
+
file_path = STATIC_ASSETS.dig(file_format, file_stem) || raise(ActionController::RoutingError, "Not Found")
|
29
|
+
send_file(file_path, disposition: "inline")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|