rails_performance 0.9.6 → 1.0.0.beta2
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 +55 -8
- data/app/controllers/rails_performance/rails_performance_controller.rb +47 -35
- data/app/helpers/rails_performance/application_helper.rb +25 -7
- data/app/views/rails_performance/javascripts/app.js +2 -2
- data/app/views/rails_performance/rails_performance/_summary.html.erb +1 -1
- data/app/views/rails_performance/rails_performance/custom.html.erb +83 -0
- data/app/views/rails_performance/rails_performance/delayed_job.html.erb +74 -0
- data/app/views/rails_performance/rails_performance/grape.html.erb +64 -0
- data/app/views/rails_performance/rails_performance/rake.html.erb +55 -0
- data/app/views/rails_performance/rails_performance/recent.html.erb +3 -1
- data/app/views/rails_performance/rails_performance/{jobs.html.erb → sidekiq.html.erb} +5 -4
- data/app/views/rails_performance/rails_performance/summary.js.erb +1 -1
- data/app/views/rails_performance/rails_performance/trace.js.erb +1 -1
- data/app/views/rails_performance/shared/_header.html.erb +9 -1
- data/app/views/rails_performance/stylesheets/style.css +5 -0
- data/config/routes.rb +5 -1
- data/lib/generators/rails_performance/install/USAGE +8 -0
- data/lib/generators/rails_performance/install/install_generator.rb +8 -0
- data/lib/generators/rails_performance/install/templates/initializer.rb +23 -0
- data/lib/rails_performance.rb +36 -7
- data/lib/rails_performance/data_source.rb +52 -13
- data/lib/rails_performance/engine.rb +39 -18
- data/lib/rails_performance/extensions/{capture_everything.rb → trace.rb} +2 -2
- data/lib/rails_performance/gems/custom_ext.rb +33 -0
- data/lib/rails_performance/gems/delayed_job_ext.rb +54 -0
- data/lib/rails_performance/gems/grape_ext.rb +35 -0
- data/lib/rails_performance/gems/rake_ext.rb +40 -0
- data/lib/rails_performance/gems/{sidekiq.rb → sidekiq_ext.rb} +14 -12
- data/lib/rails_performance/instrument/metrics_collector.rb +5 -3
- data/lib/rails_performance/models/base_record.rb +12 -0
- data/lib/rails_performance/models/custom_record.rb +48 -0
- data/lib/rails_performance/models/delayed_job_record.rb +62 -0
- data/lib/rails_performance/models/grape_record.rb +61 -0
- data/lib/rails_performance/models/rake_record.rb +49 -0
- data/lib/rails_performance/models/request_record.rb +98 -0
- data/lib/rails_performance/models/sidekiq_record.rb +66 -0
- data/lib/rails_performance/models/trace_record.rb +19 -0
- data/lib/rails_performance/rails/middleware.rb +42 -16
- data/lib/rails_performance/rails/query_builder.rb +1 -1
- data/lib/rails_performance/reports/breakdown_report.rb +4 -16
- data/lib/rails_performance/reports/crash_report.rb +4 -15
- data/lib/rails_performance/reports/recent_requests_report.rb +7 -44
- data/lib/rails_performance/reports/trace_report.rb +1 -1
- data/lib/rails_performance/{models → thread}/current_request.rb +9 -4
- data/lib/rails_performance/utils.rb +15 -29
- data/lib/rails_performance/version.rb +2 -1
- metadata +97 -11
- data/lib/rails_performance/models/job_record.rb +0 -48
- data/lib/rails_performance/models/record.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 136a862da6c0d5b7d7d458e6c5389314cfe776d0437272d319d89a95eeaa8a11
|
4
|
+
data.tar.gz: 913394396bb6d45c8a9d12d8b2f115bc135cf9fe61eee19c79a3a88165c50551
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e07938ad437c12dfc911ca66d06717eded983694436b9936bc038876c685bcd9bc432c42ddc35279eb96e5511220781d790f3322f1f1acd6cfce4cce1fc27c2
|
7
|
+
data.tar.gz: 6fd601401eba7c250a31481df0f4bf1bf92c5d856ea9f5c454f3eefd45fbccc669fb1f088538a2a56a0a0decf5627eb87b2e1e93557b0515fd34ee0b575608df
|
data/README.md
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# Rails Performance
|
2
2
|
|
3
|
-
[](https://github.com/igorkasyanchuk/rails_performance/actions/workflows/ruby.yml)
|
4
|
+
[](https://www.railsjazz.com)
|
5
|
+
[](https://www.patreon.com/igorkasyanchuk)
|
4
6
|
|
5
7
|
A self-hosted tool to monitor the performance of your Ruby on Rails application.
|
6
8
|
|
@@ -16,14 +18,18 @@ It allows you to track:
|
|
16
18
|
- total duration of time spent per request, views rendering, DB
|
17
19
|
- SQL queries, rendering logs in "Recent Requests" section
|
18
20
|
- simple 500-crashes reports
|
19
|
-
-
|
21
|
+
- Sidekiq jobs
|
22
|
+
- Delayed Job jobs
|
23
|
+
- Grape API inside Rails app
|
24
|
+
- Rake tasks performance
|
25
|
+
- Custom events wrapped with `RailsPerformance.measure do .. end` block
|
20
26
|
- works with Rails 4.2+ (and probably 4.1, 4.0 too) and Ruby 2.2+
|
21
27
|
|
22
28
|
All data are stored in `local` Redis and not sent to any 3rd party servers.
|
23
29
|
|
24
30
|
## Production
|
25
31
|
|
26
|
-
Gem is production-ready. At least on my 2 applications with ~800 unique users per day it works perfectly.
|
32
|
+
Gem is production-ready. At least on my 2 applications with ~800 unique users per day it works perfectly.
|
27
33
|
|
28
34
|
Just don't forget to protect performance dashboard with http basic auth or check of current_user.
|
29
35
|
|
@@ -49,7 +55,8 @@ RailsPerformance.setup do |config|
|
|
49
55
|
config.debug = false # currently not used>
|
50
56
|
config.enabled = true
|
51
57
|
|
52
|
-
# default path where to mount gem
|
58
|
+
# default path where to mount gem,
|
59
|
+
# alternatively you can mount the RailsPerformance::Engine in your routes.rb
|
53
60
|
config.mount_at = '/rails/performance'
|
54
61
|
|
55
62
|
# protect your Performance Dashboard with HTTP BASIC password
|
@@ -65,6 +72,7 @@ end if defined?(RailsPerformance)
|
|
65
72
|
```
|
66
73
|
|
67
74
|
## Installation
|
75
|
+
|
68
76
|
Add this line to your application's Gemfile:
|
69
77
|
|
70
78
|
```ruby
|
@@ -78,18 +86,47 @@ end
|
|
78
86
|
```
|
79
87
|
|
80
88
|
And then execute:
|
89
|
+
|
81
90
|
```bash
|
82
91
|
$ bundle
|
83
92
|
```
|
84
93
|
|
94
|
+
Create default configuration file:
|
95
|
+
|
96
|
+
```bash
|
97
|
+
$ rails generate rails_performance:install
|
98
|
+
```
|
99
|
+
|
100
|
+
Have a look at `config/initializers/rails_performance.rb` and adjust the configuration to your needs.
|
101
|
+
|
85
102
|
You must also have installed Redis server, because this gem is storing data into it.
|
86
103
|
|
87
104
|
After installation and configuration, start your Rails application, make a few requests, and open `https://localhost:3000/rails/performance` URL.
|
88
105
|
|
106
|
+
### Alternative: Mounting the engine yourself
|
107
|
+
|
108
|
+
If you, for whatever reason (company policy, devise, ...) need to mount RailsPerformance yourself, feel free to do so by using the following snippet as inspiration.
|
109
|
+
You can skip the `mount_at` and `http_basic_authentication_*` configurations then, if you like.
|
110
|
+
|
111
|
+
```ruby
|
112
|
+
# config/routes.rb
|
113
|
+
Rails.application.routes.draw do
|
114
|
+
...
|
115
|
+
# example for usage with Devise
|
116
|
+
authenticate :user, -> (user) { user.admin? } do
|
117
|
+
mount RailsPerformance::Engine, at: 'rails/performance'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
```
|
121
|
+
|
122
|
+
|
123
|
+
|
89
124
|
## How it works
|
90
125
|
|
91
126
|

|
92
127
|
|
128
|
+
In addition it's wrapping gems internal methods and collecting performance information. See `./lib/rails_performance/gems/*` for more information.
|
129
|
+
|
93
130
|
## Limitations
|
94
131
|
|
95
132
|
- it doesn't track params of POST/PUT requests
|
@@ -124,10 +161,8 @@ The idea of this gem grew from curriosity how many RPM my app receiving per day.
|
|
124
161
|
|
125
162
|
## TODO
|
126
163
|
|
127
|
-
- documentation in Readme
|
164
|
+
- documentation in Readme?
|
128
165
|
- capture stacktrace of 500 errors and show in side panel
|
129
|
-
- generator for initial config
|
130
|
-
- CI for tests
|
131
166
|
- time/zone config?
|
132
167
|
- connected charts on dashboard, when zoom, when hover?
|
133
168
|
- ability to zoom to see requests withing specific datetime range
|
@@ -136,7 +171,7 @@ The idea of this gem grew from curriosity how many RPM my app receiving per day.
|
|
136
171
|
- better stats tooltip, do not show if nothing to show
|
137
172
|
- dark mode toggle? save to the cookies?
|
138
173
|
- integration with elastic search? or other?
|
139
|
-
- monitor active job
|
174
|
+
- monitor active job?
|
140
175
|
- better logo?
|
141
176
|
- number of requests last 24 hours, hour, etc.
|
142
177
|
- collect deprecation.rails
|
@@ -144,17 +179,29 @@ The idea of this gem grew from curriosity how many RPM my app receiving per day.
|
|
144
179
|
- show "loading banner" until jquery is loaded?
|
145
180
|
- better UI on smaller screens? Recent requests when URL's are long? Truncate with CSS?
|
146
181
|
- rules for highlighting durations? how many ms to show warning, alert
|
182
|
+
- elastic search
|
183
|
+
- searchkiq
|
184
|
+
- sinatra?
|
185
|
+
- tests to check what is actually stored in redis db after request
|
147
186
|
|
148
187
|
## Contributing
|
149
188
|
|
150
189
|
You are welcome to contribute. I've a big list of TODO.
|
151
190
|
|
191
|
+
If "schema" how records are stored i Redis is changed, and this is a breacking change, update: `RailsPerformance::SCHEMA` to a newer value.
|
192
|
+
|
152
193
|
## Big thanks to contributors
|
153
194
|
|
154
195
|
- https://github.com/synth
|
155
196
|
- https://github.com/alagos
|
156
197
|
- https://github.com/klondaiker
|
198
|
+
- https://github.com/jules2689
|
199
|
+
- https://github.com/PedroAugustoRamalhoDuarte
|
200
|
+
- https://github.com/haffla
|
157
201
|
|
158
202
|
## License
|
159
203
|
|
160
204
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
205
|
+
|
206
|
+
[<img src="https://github.com/igorkasyanchuk/rails_time_travel/blob/main/docs/more_gems.png?raw=true"
|
207
|
+
/>](https://www.railsjazz.com/)
|
@@ -6,28 +6,20 @@ module RailsPerformance
|
|
6
6
|
|
7
7
|
if RailsPerformance.enabled
|
8
8
|
def index
|
9
|
-
@datasource = RP::DataSource.new(**prepare_query, type: :requests
|
9
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :requests)
|
10
10
|
db = @datasource.db
|
11
11
|
|
12
|
-
@
|
13
|
-
@
|
14
|
-
|
15
|
-
@response_time_report = RP::Reports::ResponseTimeReport.new(db)
|
16
|
-
@response_time_report_data = @response_time_report.data
|
12
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
13
|
+
@response_time_report_data = RP::Reports::ResponseTimeReport.new(db).data
|
17
14
|
end
|
18
15
|
|
19
16
|
def summary
|
20
|
-
@datasource = RP::DataSource.new(**prepare_query, type: :requests
|
17
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :requests)
|
21
18
|
db = @datasource.db
|
22
19
|
|
23
|
-
@
|
24
|
-
@
|
25
|
-
|
26
|
-
@response_time_report = RP::Reports::ResponseTimeReport.new(db)
|
27
|
-
@response_time_report_data = @response_time_report.data
|
28
|
-
|
29
|
-
@report = RP::Reports::BreakdownReport.new(db, title: "Requests")
|
30
|
-
@data = @report.data
|
20
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
21
|
+
@response_time_report_data = RP::Reports::ResponseTimeReport.new(db).data
|
22
|
+
@data = RP::Reports::BreakdownReport.new(db, title: "Requests").data
|
31
23
|
|
32
24
|
respond_to do |format|
|
33
25
|
format.js {}
|
@@ -36,9 +28,8 @@ module RailsPerformance
|
|
36
28
|
end
|
37
29
|
|
38
30
|
def trace
|
39
|
-
@record = RP::Models::
|
40
|
-
@
|
41
|
-
@data = @report.data
|
31
|
+
@record = RP::Models::RequestRecord.find_by(request_id: params[:id])
|
32
|
+
@data = RP::Reports::TraceReport.new(request_id: params[:id]).data
|
42
33
|
respond_to do |format|
|
43
34
|
format.js {}
|
44
35
|
format.any { render plain: "Doesn't open in new window. Wait until full page load." }
|
@@ -46,38 +37,59 @@ module RailsPerformance
|
|
46
37
|
end
|
47
38
|
|
48
39
|
def crashes
|
49
|
-
@datasource = RP::DataSource.new(**prepare_query({status_eq: 500}), type: :requests
|
40
|
+
@datasource = RP::DataSource.new(**prepare_query({status_eq: 500}), type: :requests)
|
50
41
|
db = @datasource.db
|
51
|
-
@
|
52
|
-
@data = @report.data
|
42
|
+
@data = RP::Reports::CrashReport.new(db).data
|
53
43
|
end
|
54
44
|
|
55
45
|
def requests
|
56
|
-
@datasource = RP::DataSource.new(**prepare_query, type: :requests
|
46
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :requests)
|
57
47
|
db = @datasource.db
|
58
|
-
@
|
59
|
-
@data = @report.data
|
48
|
+
@data = RP::Reports::RequestsReport.new(db, group: :controller_action_format, sort: :count).data
|
60
49
|
end
|
61
50
|
|
62
51
|
def recent
|
63
|
-
@datasource = RP::DataSource.new(**prepare_query, type: :requests
|
52
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :requests)
|
64
53
|
db = @datasource.db
|
65
|
-
@
|
66
|
-
|
54
|
+
@data = RP::Reports::RecentRequestsReport.new(db).data
|
55
|
+
end
|
56
|
+
|
57
|
+
def sidekiq
|
58
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :sidekiq)
|
59
|
+
db = @datasource.db
|
60
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
61
|
+
@response_time_report_data = RP::Reports::ResponseTimeReport.new(db).data
|
62
|
+
@recent_report_data = RP::Reports::RecentRequestsReport.new(db).data
|
67
63
|
end
|
68
64
|
|
69
|
-
def
|
70
|
-
@datasource = RP::DataSource.new(**prepare_query, type: :
|
65
|
+
def delayed_job
|
66
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :delayed_job)
|
71
67
|
db = @datasource.db
|
68
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
69
|
+
@response_time_report_data = RP::Reports::ResponseTimeReport.new(db).data
|
70
|
+
@recent_report_data = RP::Reports::RecentRequestsReport.new(db).data
|
71
|
+
end
|
72
72
|
|
73
|
-
|
74
|
-
@
|
73
|
+
def custom
|
74
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :custom)
|
75
|
+
db = @datasource.db
|
76
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
77
|
+
@response_time_report_data = RP::Reports::ResponseTimeReport.new(db).data
|
78
|
+
@recent_report_data = RP::Reports::RecentRequestsReport.new(db).data
|
79
|
+
end
|
75
80
|
|
76
|
-
|
77
|
-
@
|
81
|
+
def grape
|
82
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :grape)
|
83
|
+
db = @datasource.db
|
84
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
85
|
+
@recent_report_data = RP::Reports::RecentRequestsReport.new(db).data
|
86
|
+
end
|
78
87
|
|
79
|
-
|
80
|
-
@
|
88
|
+
def rake
|
89
|
+
@datasource = RP::DataSource.new(**prepare_query, type: :rake)
|
90
|
+
db = @datasource.db
|
91
|
+
@throughput_report_data = RP::Reports::ThroughputReport.new(db).data
|
92
|
+
@recent_report_data = RP::Reports::RecentRequestsReport.new(db).data
|
81
93
|
end
|
82
94
|
|
83
95
|
private
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module RailsPerformance
|
2
2
|
module ApplicationHelper
|
3
|
-
def round_it(value)
|
3
|
+
def round_it(value, limit = 1)
|
4
4
|
return nil unless value
|
5
5
|
return value if value.is_a?(Integer)
|
6
6
|
|
7
|
-
value.nan? ? nil : value.round(
|
7
|
+
value.nan? ? nil : value.round(limit)
|
8
8
|
end
|
9
9
|
|
10
10
|
def duraction_alert_class(duration_str)
|
@@ -30,9 +30,15 @@ module RailsPerformance
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
|
35
|
-
|
33
|
+
def mss(value, limit = 1)
|
34
|
+
ms(value.to_f * 1000, limit)
|
35
|
+
end
|
36
|
+
|
37
|
+
def ms(value, limit = 1)
|
38
|
+
result = round_it(value, limit)
|
39
|
+
return '-' if result.nil?
|
40
|
+
|
41
|
+
result && result != 0 ? "#{result} ms" : '< 0 ms'
|
36
42
|
end
|
37
43
|
|
38
44
|
def short_path(path, length: 60)
|
@@ -65,6 +71,8 @@ module RailsPerformance
|
|
65
71
|
|
66
72
|
def status_tag(status)
|
67
73
|
klass = case status.to_s
|
74
|
+
when /error/
|
75
|
+
"tag is-danger"
|
68
76
|
when /^5/
|
69
77
|
"tag is-danger"
|
70
78
|
when /^4/
|
@@ -73,6 +81,8 @@ module RailsPerformance
|
|
73
81
|
"tag is-info"
|
74
82
|
when /^2/
|
75
83
|
"tag is-success"
|
84
|
+
when /success/
|
85
|
+
"tag is-success"
|
76
86
|
else
|
77
87
|
nil
|
78
88
|
end
|
@@ -108,8 +118,16 @@ module RailsPerformance
|
|
108
118
|
"is-active" if controller_name == "rails_performance" && action_name == "requests"
|
109
119
|
when :recent
|
110
120
|
"is-active" if controller_name == "rails_performance" && action_name == "recent"
|
111
|
-
when :
|
112
|
-
"is-active" if controller_name == "rails_performance" && action_name == "
|
121
|
+
when :sidekiq
|
122
|
+
"is-active" if controller_name == "rails_performance" && action_name == "sidekiq"
|
123
|
+
when :delayed_job
|
124
|
+
"is-active" if controller_name == "rails_performance" && action_name == "delayed_job"
|
125
|
+
when :grape
|
126
|
+
"is-active" if controller_name == "rails_performance" && action_name == "grape"
|
127
|
+
when :rake
|
128
|
+
"is-active" if controller_name == "rails_performance" && action_name == "rake"
|
129
|
+
when :custom
|
130
|
+
"is-active" if controller_name == "rails_performance" && action_name == "custom"
|
113
131
|
end
|
114
132
|
end
|
115
133
|
end
|
@@ -22,7 +22,7 @@ function showTIRChart(div, data, addon, name) {
|
|
22
22
|
},
|
23
23
|
formatter: function() {
|
24
24
|
if (this.y == 0) {
|
25
|
-
return '';
|
25
|
+
return 'n/a';
|
26
26
|
}
|
27
27
|
return this.y + addon;
|
28
28
|
}
|
@@ -107,7 +107,7 @@ function showRTChart(div, data) {
|
|
107
107
|
},
|
108
108
|
formatter: function() {
|
109
109
|
if (this.y == 0) {
|
110
|
-
return
|
110
|
+
return 'n/a';
|
111
111
|
}
|
112
112
|
return this.y + ' ms';
|
113
113
|
}
|
@@ -4,7 +4,7 @@
|
|
4
4
|
<h2 class="subtitle">Average Response Time</h2>
|
5
5
|
<div id="response_time_report_chart_mini" class="chart_mini"></div>
|
6
6
|
|
7
|
-
<h2 class="subtitle"><%=
|
7
|
+
<h2 class="subtitle"><%= title %></h2>
|
8
8
|
<table class="table is-fullwidth is-hoverable is-narrow is-size-7">
|
9
9
|
<thead>
|
10
10
|
<tr>
|
@@ -0,0 +1,83 @@
|
|
1
|
+
<title>Custom Events</title>
|
2
|
+
|
3
|
+
<% unless @datasource.default? %>
|
4
|
+
<%#= link_to raw("← Back"), rails_performance_path, class: "back_link" %>
|
5
|
+
<% end %>
|
6
|
+
|
7
|
+
<div class="card">
|
8
|
+
<div class="card-content">
|
9
|
+
<h2 class="subtitle">Recent Events (last <%= RailsPerformance::Reports::RecentRequestsReport::TIME_WINDOW / 60 %> minutes)<h2>
|
10
|
+
|
11
|
+
<table class="table is-fullwidth is-hoverable is-narrow">
|
12
|
+
<thead>
|
13
|
+
<tr>
|
14
|
+
<th data-sort="string">Datetime</th>
|
15
|
+
<th data-sort="string">Tag</th>
|
16
|
+
<th data-sort="string">Namespace</th>
|
17
|
+
<th data-sort="string">Status</th>
|
18
|
+
<th data-sort="float">Duration</th>
|
19
|
+
</tr>
|
20
|
+
</thead>
|
21
|
+
<tbody>
|
22
|
+
<% if @recent_report_data.empty? %>
|
23
|
+
<tr>
|
24
|
+
<td colspan="5">
|
25
|
+
Nothing to show here. Try to make a few requests in the main app.
|
26
|
+
|
27
|
+
<pre>
|
28
|
+
<code>
|
29
|
+
# in controller for example
|
30
|
+
def index
|
31
|
+
RailsPerformance.measure("stats calculation", "reports#index") do
|
32
|
+
stats = User.calculate_stats
|
33
|
+
end
|
34
|
+
end
|
35
|
+
</code>
|
36
|
+
</pre>
|
37
|
+
</td>
|
38
|
+
</tr>
|
39
|
+
<% end %>
|
40
|
+
<% @recent_report_data.each do |e| %>
|
41
|
+
<tr>
|
42
|
+
<td><%= format_datetime e[:datetime] %></td>
|
43
|
+
<td><%= e[:tag_name] %></td>
|
44
|
+
<td><%= e[:namespace_name] %></td>
|
45
|
+
<td><%= status_tag e[:status] %></td>
|
46
|
+
<td class="nowrap"><%= ms e[:duration] %></td>
|
47
|
+
</tr>
|
48
|
+
<% end %>
|
49
|
+
</tbody>
|
50
|
+
</table>
|
51
|
+
</div>
|
52
|
+
</div>
|
53
|
+
|
54
|
+
<br/>
|
55
|
+
|
56
|
+
<div class="card">
|
57
|
+
<div class="card-content">
|
58
|
+
<h2 class="subtitle">Custom Events Throughput Report</h2>
|
59
|
+
<div id="throughput_report_chart" class="chart"></div>
|
60
|
+
<p class="content is-small">All custom events in the application</p>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<br/>
|
65
|
+
|
66
|
+
<div class="card">
|
67
|
+
<div class="card-content">
|
68
|
+
<h2 class="subtitle">Average Execution Time</h2>
|
69
|
+
<div id="response_time_report_chart" class="chart"></div>
|
70
|
+
<p class="content is-small">All custom events in the application</p>
|
71
|
+
</div>
|
72
|
+
</div>
|
73
|
+
|
74
|
+
|
75
|
+
<% content_for :on_load do %>
|
76
|
+
<script>
|
77
|
+
var data1 = <%= raw @throughput_report_data.to_json %>;
|
78
|
+
showTIRChart('throughput_report_chart', data1, ' events / minute', 'Events');
|
79
|
+
|
80
|
+
var data2 = <%= raw @response_time_report_data.to_json %>;
|
81
|
+
showRTChart('response_time_report_chart', data2);
|
82
|
+
</script>
|
83
|
+
<% end %>
|