rails_performance 1.2.3 → 1.3.0
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 +5 -13
- data/Rakefile +14 -14
- data/app/assets/images/download.svg +3 -0
- data/app/controllers/rails_performance/base_controller.rb +21 -21
- data/app/controllers/rails_performance/concerns/csv_exportable.rb +29 -0
- data/app/controllers/rails_performance/rails_performance_controller.rb +95 -49
- data/app/helpers/rails_performance/rails_performance_helper.rb +152 -156
- data/app/views/rails_performance/javascripts/app.js +2 -2
- data/app/views/rails_performance/rails_performance/_export.html.erb +3 -0
- data/app/views/rails_performance/rails_performance/crashes.html.erb +8 -1
- data/app/views/rails_performance/rails_performance/recent.html.erb +8 -6
- data/app/views/rails_performance/rails_performance/requests.html.erb +8 -1
- data/app/views/rails_performance/rails_performance/slow.html.erb +3 -0
- data/app/views/rails_performance/shared/_header.html.erb +0 -1
- data/app/views/rails_performance/stylesheets/style.css +6 -0
- data/config/routes.rb +16 -18
- data/lib/generators/rails_performance/install/install_generator.rb +1 -1
- data/lib/generators/rails_performance/install/templates/initializer.rb +56 -42
- data/lib/rails_performance/data_source.rb +120 -121
- data/lib/rails_performance/engine.rb +8 -8
- data/lib/rails_performance/extensions/trace.rb +32 -33
- data/lib/rails_performance/gems/custom_ext.rb +31 -34
- data/lib/rails_performance/gems/delayed_job_ext.rb +50 -54
- data/lib/rails_performance/gems/grape_ext.rb +33 -35
- data/lib/rails_performance/gems/rake_ext.rb +41 -44
- data/lib/rails_performance/gems/sidekiq_ext.rb +34 -37
- data/lib/rails_performance/instrument/metrics_collector.rb +50 -50
- data/lib/rails_performance/models/base_record.rb +33 -36
- data/lib/rails_performance/models/collection.rb +35 -36
- data/lib/rails_performance/models/custom_record.rb +47 -48
- data/lib/rails_performance/models/delayed_job_record.rb +61 -62
- data/lib/rails_performance/models/grape_record.rb +60 -61
- data/lib/rails_performance/models/rake_record.rb +48 -49
- data/lib/rails_performance/models/request_record.rb +123 -120
- data/lib/rails_performance/models/sidekiq_record.rb +65 -66
- data/lib/rails_performance/models/trace_record.rb +18 -19
- data/lib/rails_performance/rails/middleware.rb +75 -76
- data/lib/rails_performance/rails/query_builder.rb +18 -20
- data/lib/rails_performance/reports/base_report.rb +60 -60
- data/lib/rails_performance/reports/breakdown_report.rb +15 -18
- data/lib/rails_performance/reports/crash_report.rb +15 -17
- data/lib/rails_performance/reports/recent_requests_report.rb +24 -24
- data/lib/rails_performance/reports/requests_report.rb +27 -27
- data/lib/rails_performance/reports/response_time_report.rb +17 -17
- data/lib/rails_performance/reports/slow_requests_report.rb +4 -4
- data/lib/rails_performance/reports/throughput_report.rb +15 -17
- data/lib/rails_performance/reports/trace_report.rb +16 -18
- data/lib/rails_performance/thread/current_request.rb +33 -34
- data/lib/rails_performance/utils.rb +53 -54
- data/lib/rails_performance/version.rb +2 -2
- data/lib/rails_performance.rb +33 -34
- metadata +20 -3
@@ -1,76 +1,75 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Rails
|
3
|
-
class MiddlewareTraceStorerAndCleanup
|
4
|
-
def initialize(app)
|
5
|
-
@app = app
|
6
|
-
end
|
7
|
-
|
8
|
-
def call(env)
|
9
|
-
dup.call!(env)
|
10
|
-
end
|
11
|
-
|
12
|
-
def call!(env)
|
13
|
-
if %r{#{RailsPerformance.mount_at}}.match?(env["PATH_INFO"])
|
14
|
-
RailsPerformance.skip = true
|
15
|
-
end
|
16
|
-
|
17
|
-
@status, @headers, @response = @app.call(env)
|
18
|
-
|
19
|
-
if !RailsPerformance.skip
|
20
|
-
RailsPerformance::Models::TraceRecord.new(
|
21
|
-
request_id: CurrentRequest.current.request_id,
|
22
|
-
value: CurrentRequest.current.tracings
|
23
|
-
).save
|
24
|
-
end
|
25
|
-
|
26
|
-
CurrentRequest.cleanup
|
27
|
-
|
28
|
-
[@status, @headers, @response]
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
class Middleware
|
33
|
-
def initialize(app)
|
34
|
-
@app = app
|
35
|
-
end
|
36
|
-
|
37
|
-
def call(env)
|
38
|
-
dup.call!(env)
|
39
|
-
end
|
40
|
-
|
41
|
-
def call!(env)
|
42
|
-
@status, @headers, @response = @app.call(env)
|
43
|
-
|
44
|
-
#t = Time.current
|
45
|
-
if !RailsPerformance.skip
|
46
|
-
if !CurrentRequest.current.ignore.include?(:performance) # grape is executed first, and than ignore regular future storage of "controller"-like request
|
47
|
-
if data = CurrentRequest.current.data
|
48
|
-
record = RailsPerformance::Models::RequestRecord.new(**data.merge({request_id: CurrentRequest.current.request_id}))
|
49
|
-
|
50
|
-
# for 500 errors
|
51
|
-
record.status ||= @status
|
52
|
-
|
53
|
-
# capture referer from where this page was opened
|
54
|
-
record.http_referer = env["HTTP_REFERER"] if record.status == 404
|
55
|
-
|
56
|
-
# we can add custom data, for example Http User-Agent
|
57
|
-
# or even devise current_user
|
58
|
-
if RailsPerformance.custom_data_proc
|
59
|
-
# just to be sure it won't break format how we store in redis
|
60
|
-
record.custom_data = RailsPerformance.custom_data_proc.call(env)
|
61
|
-
end
|
62
|
-
|
63
|
-
# store for section "recent requests"
|
64
|
-
# store request information (regular rails request)
|
65
|
-
record.save
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
#puts "==> store performance data: #{(Time.current - t).round(3)}ms"
|
70
|
-
|
71
|
-
[@status, @headers, @response]
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Rails
|
3
|
+
class MiddlewareTraceStorerAndCleanup
|
4
|
+
def initialize(app)
|
5
|
+
@app = app
|
6
|
+
end
|
7
|
+
|
8
|
+
def call(env)
|
9
|
+
dup.call!(env)
|
10
|
+
end
|
11
|
+
|
12
|
+
def call!(env)
|
13
|
+
if %r{#{RailsPerformance.mount_at}}.match?(env["PATH_INFO"])
|
14
|
+
RailsPerformance.skip = true
|
15
|
+
end
|
16
|
+
|
17
|
+
@status, @headers, @response = @app.call(env)
|
18
|
+
|
19
|
+
if !RailsPerformance.skip
|
20
|
+
RailsPerformance::Models::TraceRecord.new(
|
21
|
+
request_id: CurrentRequest.current.request_id,
|
22
|
+
value: CurrentRequest.current.tracings
|
23
|
+
).save
|
24
|
+
end
|
25
|
+
|
26
|
+
CurrentRequest.cleanup
|
27
|
+
|
28
|
+
[@status, @headers, @response]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Middleware
|
33
|
+
def initialize(app)
|
34
|
+
@app = app
|
35
|
+
end
|
36
|
+
|
37
|
+
def call(env)
|
38
|
+
dup.call!(env)
|
39
|
+
end
|
40
|
+
|
41
|
+
def call!(env)
|
42
|
+
@status, @headers, @response = @app.call(env)
|
43
|
+
|
44
|
+
# t = Time.current
|
45
|
+
if !RailsPerformance.skip
|
46
|
+
if !CurrentRequest.current.ignore.include?(:performance) # grape is executed first, and than ignore regular future storage of "controller"-like request
|
47
|
+
if (data = CurrentRequest.current.data)
|
48
|
+
record = RailsPerformance::Models::RequestRecord.new(**data.merge({request_id: CurrentRequest.current.request_id}))
|
49
|
+
|
50
|
+
# for 500 errors
|
51
|
+
record.status ||= @status
|
52
|
+
|
53
|
+
# capture referer from where this page was opened
|
54
|
+
record.http_referer = env["HTTP_REFERER"] if record.status == 404
|
55
|
+
|
56
|
+
# we can add custom data, for example Http User-Agent
|
57
|
+
# or even devise current_user
|
58
|
+
if RailsPerformance.custom_data_proc
|
59
|
+
# just to be sure it won't break format how we store in redis
|
60
|
+
record.custom_data = RailsPerformance.custom_data_proc.call(env)
|
61
|
+
end
|
62
|
+
|
63
|
+
# store for section "recent requests"
|
64
|
+
# store request information (regular rails request)
|
65
|
+
record.save
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
# puts "==> store performance data: #{(Time.current - t).round(3)}ms"
|
70
|
+
|
71
|
+
[@status, @headers, @response]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -1,20 +1,18 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Rails
|
3
|
-
class QueryBuilder
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
result[:
|
9
|
-
result[:
|
10
|
-
result[:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Rails
|
3
|
+
class QueryBuilder
|
4
|
+
def self.compose_from(params)
|
5
|
+
result = {}
|
6
|
+
|
7
|
+
result[:controller] = params[:controller_eq]
|
8
|
+
result[:action] = params[:action_eq]
|
9
|
+
result[:format] = params[:format_eq]
|
10
|
+
result[:status] = params[:status_eq]
|
11
|
+
|
12
|
+
result.delete_if { |k, v| v.nil? }
|
13
|
+
|
14
|
+
{q: result}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,60 +1,60 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class BaseReport
|
4
|
-
attr_reader :db, :group, :sort, :title
|
5
|
-
|
6
|
-
def initialize(db, group: nil, sort: nil, title: nil)
|
7
|
-
@db
|
8
|
-
@group
|
9
|
-
@sort
|
10
|
-
@title
|
11
|
-
|
12
|
-
set_defaults
|
13
|
-
end
|
14
|
-
|
15
|
-
def collect
|
16
|
-
db.group_by(group).
|
17
|
-
res << yield(k, v)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
def self.time_in_app_time_zone(time)
|
25
|
-
app_time_zone = ::Rails.application.config.time_zone
|
26
|
-
if app_time_zone.present?
|
27
|
-
time.in_time_zone(app_time_zone)
|
28
|
-
else
|
29
|
-
time
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def calculate_data
|
34
|
-
now
|
35
|
-
stop
|
36
|
-
offset
|
37
|
-
current
|
38
|
-
|
39
|
-
@data
|
40
|
-
all
|
41
|
-
|
42
|
-
# read current values
|
43
|
-
db.group_by(group).each do |(k, v)|
|
44
|
-
yield(all, k, v)
|
45
|
-
end
|
46
|
-
|
47
|
-
# add blank columns
|
48
|
-
while current <= stop
|
49
|
-
key
|
50
|
-
views = all[key].presence || 0
|
51
|
-
@data << [(current.to_i + offset) * 1000, views.round(2)]
|
52
|
-
current += 1.minute
|
53
|
-
end
|
54
|
-
|
55
|
-
# sort by time
|
56
|
-
@data.sort!
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class BaseReport
|
4
|
+
attr_reader :db, :group, :sort, :title
|
5
|
+
|
6
|
+
def initialize(db, group: nil, sort: nil, title: nil)
|
7
|
+
@db = db
|
8
|
+
@group = group
|
9
|
+
@sort = sort
|
10
|
+
@title = title
|
11
|
+
|
12
|
+
set_defaults
|
13
|
+
end
|
14
|
+
|
15
|
+
def collect
|
16
|
+
db.group_by(group).each_with_object([]) do |(k, v), res|
|
17
|
+
res << yield(k, v)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def set_defaults
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.time_in_app_time_zone(time)
|
25
|
+
app_time_zone = ::Rails.application.config.time_zone
|
26
|
+
if app_time_zone.present?
|
27
|
+
time.in_time_zone(app_time_zone)
|
28
|
+
else
|
29
|
+
time
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def calculate_data
|
34
|
+
now = Time.current
|
35
|
+
stop = Time.at(60 * (now.to_i / 60))
|
36
|
+
offset = RailsPerformance::Reports::BaseReport.time_in_app_time_zone(now).utc_offset
|
37
|
+
current = stop - RailsPerformance.duration
|
38
|
+
|
39
|
+
@data = []
|
40
|
+
all = {}
|
41
|
+
|
42
|
+
# read current values
|
43
|
+
db.group_by(group).each do |(k, v)|
|
44
|
+
yield(all, k, v)
|
45
|
+
end
|
46
|
+
|
47
|
+
# add blank columns
|
48
|
+
while current <= stop
|
49
|
+
key = current.strftime(RailsPerformance::FORMAT)
|
50
|
+
views = all[key].presence || 0
|
51
|
+
@data << [(current.to_i + offset) * 1000, views.round(2)]
|
52
|
+
current += 1.minute
|
53
|
+
end
|
54
|
+
|
55
|
+
# sort by time
|
56
|
+
@data.sort!
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -1,18 +1,15 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class BreakdownReport < BaseReport
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
.
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class BreakdownReport < BaseReport
|
4
|
+
def set_defaults
|
5
|
+
@sort ||= :datetimei
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
db.data
|
10
|
+
.collect { |e| e.record_hash }
|
11
|
+
.sort { |a, b| b[sort] <=> a[sort] }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,17 +1,15 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class CrashReport < BaseReport
|
4
|
-
def set_defaults
|
5
|
-
@sort ||= :datetimei
|
6
|
-
end
|
7
|
-
|
8
|
-
def data
|
9
|
-
db.data
|
10
|
-
.collect{|e| e.record_hash}
|
11
|
-
.sort{|a, b| b[sort] <=> a[sort]}
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class CrashReport < BaseReport
|
4
|
+
def set_defaults
|
5
|
+
@sort ||= :datetimei
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
db.data
|
10
|
+
.collect { |e| e.record_hash }
|
11
|
+
.sort { |a, b| b[sort] <=> a[sort] }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,24 +1,24 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class RecentRequestsReport < BaseReport
|
4
|
-
def set_defaults
|
5
|
-
@sort ||= :datetimei
|
6
|
-
end
|
7
|
-
|
8
|
-
def data(from_timei = nil)
|
9
|
-
time_agoi = [RailsPerformance.recent_requests_time_window.ago.to_i, from_timei.to_i].reject(&:blank?).max
|
10
|
-
db.data
|
11
|
-
.collect{|e| e.record_hash}
|
12
|
-
.select{|e| e if e[sort] > time_agoi}
|
13
|
-
.sort{|a, b| b[sort] <=> a[sort]}
|
14
|
-
.first(limit)
|
15
|
-
end
|
16
|
-
|
17
|
-
private
|
18
|
-
|
19
|
-
def limit
|
20
|
-
RailsPerformance.recent_requests_limit ? RailsPerformance.recent_requests_limit.to_i : 100_000
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class RecentRequestsReport < BaseReport
|
4
|
+
def set_defaults
|
5
|
+
@sort ||= :datetimei
|
6
|
+
end
|
7
|
+
|
8
|
+
def data(from_timei = nil)
|
9
|
+
time_agoi = [RailsPerformance.recent_requests_time_window.ago.to_i, from_timei.to_i].reject(&:blank?).max
|
10
|
+
db.data
|
11
|
+
.collect { |e| e.record_hash }
|
12
|
+
.select { |e| e if e[sort] > time_agoi }
|
13
|
+
.sort { |a, b| b[sort] <=> a[sort] }
|
14
|
+
.first(limit)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def limit
|
20
|
+
RailsPerformance.recent_requests_limit ? RailsPerformance.recent_requests_limit.to_i : 100_000
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,27 +1,27 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class RequestsReport < BaseReport
|
4
|
-
def set_defaults
|
5
|
-
@sort ||= :count
|
6
|
-
end
|
7
|
-
|
8
|
-
def data
|
9
|
-
collect do |k, v|
|
10
|
-
durations
|
11
|
-
view_runtimes = v.collect{|e| e["view_runtime"]}.compact
|
12
|
-
db_runtimes
|
13
|
-
{
|
14
|
-
group:
|
15
|
-
count:
|
16
|
-
duration_average:
|
17
|
-
view_runtime_average: view_runtimes.sum.to_f / view_runtimes.size,
|
18
|
-
db_runtime_average:
|
19
|
-
duration_slowest:
|
20
|
-
view_runtime_slowest: view_runtimes.max,
|
21
|
-
db_runtime_slowest:
|
22
|
-
}
|
23
|
-
end.sort_by{|e| -e[sort].to_f} # to_f because could ne NaN or nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class RequestsReport < BaseReport
|
4
|
+
def set_defaults
|
5
|
+
@sort ||= :count
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
collect do |k, v|
|
10
|
+
durations = v.collect { |e| e["duration"] }.compact
|
11
|
+
view_runtimes = v.collect { |e| e["view_runtime"] }.compact
|
12
|
+
db_runtimes = v.collect { |e| e["db_runtime"] }.compact
|
13
|
+
{
|
14
|
+
group: k,
|
15
|
+
count: v.size,
|
16
|
+
duration_average: durations.sum.to_f / durations.size,
|
17
|
+
view_runtime_average: view_runtimes.sum.to_f / view_runtimes.size,
|
18
|
+
db_runtime_average: db_runtimes.sum.to_f / db_runtimes.size,
|
19
|
+
duration_slowest: durations.max,
|
20
|
+
view_runtime_slowest: view_runtimes.max,
|
21
|
+
db_runtime_slowest: db_runtimes.max
|
22
|
+
}
|
23
|
+
end.sort_by { |e| -e[sort].to_f } # to_f because could ne NaN or nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,17 +1,17 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class ResponseTimeReport < BaseReport
|
4
|
-
def set_defaults
|
5
|
-
@group ||= :datetime
|
6
|
-
end
|
7
|
-
|
8
|
-
def data
|
9
|
-
calculate_data do |all, k, v|
|
10
|
-
durations = v.collect{|e| e["duration"]}.compact
|
11
|
-
next if durations.empty?
|
12
|
-
all[k] = durations.sum.to_f / durations.count
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class ResponseTimeReport < BaseReport
|
4
|
+
def set_defaults
|
5
|
+
@group ||= :datetime
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
calculate_data do |all, k, v|
|
10
|
+
durations = v.collect { |e| e["duration"] }.compact
|
11
|
+
next if durations.empty?
|
12
|
+
all[k] = durations.sum.to_f / durations.count
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -7,10 +7,10 @@ module RailsPerformance
|
|
7
7
|
|
8
8
|
def data
|
9
9
|
db.data
|
10
|
-
.collect{|e| e.record_hash}
|
11
|
-
.select{|e| e if e[sort] > RailsPerformance.slow_requests_time_window.ago.to_i}
|
12
|
-
.sort{|a, b| b[sort] <=> a[sort]}
|
13
|
-
.filter{|e| e[:duration] > RailsPerformance.slow_requests_threshold.to_i}
|
10
|
+
.collect { |e| e.record_hash }
|
11
|
+
.select { |e| e if e[sort] > RailsPerformance.slow_requests_time_window.ago.to_i }
|
12
|
+
.sort { |a, b| b[sort] <=> a[sort] }
|
13
|
+
.filter { |e| e[:duration] > RailsPerformance.slow_requests_threshold.to_i }
|
14
14
|
.first(limit)
|
15
15
|
end
|
16
16
|
|
@@ -1,17 +1,15 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class ThroughputReport < BaseReport
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class ThroughputReport < BaseReport
|
4
|
+
def set_defaults
|
5
|
+
@group ||= :datetime
|
6
|
+
end
|
7
|
+
|
8
|
+
def data
|
9
|
+
calculate_data do |all, k, v|
|
10
|
+
all[k] = v.count
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,18 +1,16 @@
|
|
1
|
-
module RailsPerformance
|
2
|
-
module Reports
|
3
|
-
class TraceReport
|
4
|
-
attr_reader :request_id
|
5
|
-
|
6
|
-
def initialize(request_id:)
|
7
|
-
@request_id = request_id
|
8
|
-
end
|
9
|
-
|
10
|
-
def data
|
11
|
-
key
|
12
|
-
JSON.parse(RailsPerformance.redis.get(key).presence ||
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
1
|
+
module RailsPerformance
|
2
|
+
module Reports
|
3
|
+
class TraceReport
|
4
|
+
attr_reader :request_id
|
5
|
+
|
6
|
+
def initialize(request_id:)
|
7
|
+
@request_id = request_id
|
8
|
+
end
|
9
|
+
|
10
|
+
def data
|
11
|
+
key = "trace|#{request_id}|END|#{RailsPerformance::SCHEMA}"
|
12
|
+
JSON.parse(RailsPerformance.redis.get(key).presence || "[]")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|