rails_performance 1.2.3 → 1.3.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -13
  3. data/Rakefile +14 -14
  4. data/app/assets/images/download.svg +3 -0
  5. data/app/controllers/rails_performance/base_controller.rb +21 -21
  6. data/app/controllers/rails_performance/concerns/csv_exportable.rb +29 -0
  7. data/app/controllers/rails_performance/rails_performance_controller.rb +96 -49
  8. data/app/helpers/rails_performance/rails_performance_helper.rb +152 -156
  9. data/app/views/rails_performance/javascripts/app.js +2 -2
  10. data/app/views/rails_performance/rails_performance/_export.html.erb +3 -0
  11. data/app/views/rails_performance/rails_performance/crashes.html.erb +8 -1
  12. data/app/views/rails_performance/rails_performance/index.html.erb +29 -0
  13. data/app/views/rails_performance/rails_performance/recent.html.erb +8 -6
  14. data/app/views/rails_performance/rails_performance/requests.html.erb +15 -1
  15. data/app/views/rails_performance/rails_performance/slow.html.erb +3 -0
  16. data/app/views/rails_performance/shared/_header.html.erb +0 -1
  17. data/app/views/rails_performance/stylesheets/style.css +10 -0
  18. data/config/routes.rb +16 -18
  19. data/lib/generators/rails_performance/install/install_generator.rb +1 -1
  20. data/lib/generators/rails_performance/install/templates/initializer.rb +56 -42
  21. data/lib/rails_performance/data_source.rb +120 -121
  22. data/lib/rails_performance/engine.rb +8 -8
  23. data/lib/rails_performance/extensions/trace.rb +32 -33
  24. data/lib/rails_performance/gems/custom_ext.rb +31 -34
  25. data/lib/rails_performance/gems/delayed_job_ext.rb +50 -54
  26. data/lib/rails_performance/gems/grape_ext.rb +33 -35
  27. data/lib/rails_performance/gems/rake_ext.rb +41 -44
  28. data/lib/rails_performance/gems/sidekiq_ext.rb +34 -37
  29. data/lib/rails_performance/instrument/metrics_collector.rb +50 -50
  30. data/lib/rails_performance/models/base_record.rb +33 -36
  31. data/lib/rails_performance/models/collection.rb +35 -36
  32. data/lib/rails_performance/models/custom_record.rb +47 -48
  33. data/lib/rails_performance/models/delayed_job_record.rb +61 -62
  34. data/lib/rails_performance/models/grape_record.rb +60 -61
  35. data/lib/rails_performance/models/rake_record.rb +48 -49
  36. data/lib/rails_performance/models/request_record.rb +128 -120
  37. data/lib/rails_performance/models/sidekiq_record.rb +65 -66
  38. data/lib/rails_performance/models/trace_record.rb +18 -19
  39. data/lib/rails_performance/rails/middleware.rb +75 -76
  40. data/lib/rails_performance/rails/query_builder.rb +18 -20
  41. data/lib/rails_performance/reports/base_report.rb +60 -60
  42. data/lib/rails_performance/reports/breakdown_report.rb +15 -18
  43. data/lib/rails_performance/reports/crash_report.rb +15 -17
  44. data/lib/rails_performance/reports/percentile_report.rb +14 -0
  45. data/lib/rails_performance/reports/recent_requests_report.rb +24 -24
  46. data/lib/rails_performance/reports/requests_report.rb +30 -27
  47. data/lib/rails_performance/reports/response_time_report.rb +17 -17
  48. data/lib/rails_performance/reports/slow_requests_report.rb +4 -4
  49. data/lib/rails_performance/reports/throughput_report.rb +15 -17
  50. data/lib/rails_performance/reports/trace_report.rb +16 -18
  51. data/lib/rails_performance/thread/current_request.rb +33 -34
  52. data/lib/rails_performance/utils.rb +64 -54
  53. data/lib/rails_performance/version.rb +2 -2
  54. data/lib/rails_performance.rb +35 -36
  55. metadata +21 -17
@@ -1,27 +1,30 @@
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
+ 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
+ p50_duration: RailsPerformance::Utils.percentile(durations, 50),
23
+ p95_duration: RailsPerformance::Utils.percentile(durations, 95),
24
+ p99_duration: RailsPerformance::Utils.percentile(durations, 99),
25
+ }
26
+ end.sort_by { |e| -e[sort].to_f } # to_f because could ne NaN or nil
27
+ end
28
+ end
29
+ end
30
+ 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
- def set_defaults
6
- @group ||= :datetime
7
- end
8
-
9
- def data
10
- calculate_data do |all, k, v|
11
- all[k] = v.count
12
- end
13
- end
14
-
15
- end
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 = "trace|#{request_id}|END|#{RailsPerformance::SCHEMA}"
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
@@ -1,34 +1,33 @@
1
- module RailsPerformance
2
- class CurrentRequest
3
- attr_reader :request_id, :tracings, :ignore
4
- attr_accessor :data
5
- attr_accessor :record
6
-
7
- def CurrentRequest.init
8
- Thread.current[:rp_current_request] ||= CurrentRequest.new(SecureRandom.hex(16))
9
- end
10
-
11
- def CurrentRequest.current
12
- CurrentRequest.init
13
- end
14
-
15
- def CurrentRequest.cleanup
16
- RailsPerformance.log "----------------------------------------------------> CurrentRequest.cleanup !!!!!!!!!!!! -------------------------\n\n"
17
- RailsPerformance.skip = false
18
- Thread.current[:rp_current_request] = nil
19
- end
20
-
21
- def initialize(request_id)
22
- @request_id = request_id
23
- @tracings = []
24
- @ignore = Set.new
25
- @data = nil
26
- @record = nil
27
- end
28
-
29
- def trace(options = {})
30
- @tracings << options.merge(time: Time.current.to_i)
31
- end
32
-
33
- end
34
- end
1
+ module RailsPerformance
2
+ class CurrentRequest
3
+ attr_reader :request_id, :tracings, :ignore
4
+ attr_accessor :data
5
+ attr_accessor :record
6
+
7
+ def self.init
8
+ Thread.current[:rp_current_request] ||= CurrentRequest.new(SecureRandom.hex(16))
9
+ end
10
+
11
+ def self.current
12
+ CurrentRequest.init
13
+ end
14
+
15
+ def self.cleanup
16
+ RailsPerformance.log "----------------------------------------------------> CurrentRequest.cleanup !!!!!!!!!!!! -------------------------\n\n"
17
+ RailsPerformance.skip = false
18
+ Thread.current[:rp_current_request] = nil
19
+ end
20
+
21
+ def initialize(request_id)
22
+ @request_id = request_id
23
+ @tracings = []
24
+ @ignore = Set.new
25
+ @data = nil
26
+ @record = nil
27
+ end
28
+
29
+ def trace(options = {})
30
+ @tracings << options.merge(time: Time.current.to_i)
31
+ end
32
+ end
33
+ end
@@ -1,54 +1,64 @@
1
- module RailsPerformance
2
-
3
- class Utils
4
- # date key in redis store
5
- def Utils.cache_key(now = Date.today)
6
- "date-#{now}"
7
- end
8
-
9
- # write to current slot
10
- # time - date -minute
11
- def Utils.field_key(now = Time.current)
12
- now.strftime("%H:%M")
13
- end
14
-
15
- def Utils.fetch_from_redis(query)
16
- RailsPerformance.log "\n\n [REDIS QUERY] --> #{query}\n\n"
17
-
18
- keys = RailsPerformance.redis.keys(query)
19
- return [] if keys.blank?
20
- values = RailsPerformance.redis.mget(keys)
21
-
22
- RailsPerformance.log "\n\n [FOUND] --> #{values.size}\n\n"
23
-
24
- [keys, values]
25
- end
26
-
27
- def Utils.save_to_redis(key, value, expire = RailsPerformance.duration.to_i)
28
- # TODO think here if add return
29
- #return if value.empty?
30
-
31
- RailsPerformance.log " [SAVE] key ---> #{key}\n"
32
- RailsPerformance.log " [SAVE] value ---> #{value.to_json}\n\n"
33
- RailsPerformance.redis.set(key, value.to_json, ex: expire.to_i)
34
- end
35
-
36
- def Utils.days
37
- (RailsPerformance.duration / 1.day) + 1
38
- end
39
-
40
- def Utils.median(array)
41
- sorted = array.sort
42
- size = sorted.size
43
- center = size / 2
44
-
45
- if size == 0
46
- nil
47
- elsif size.even?
48
- (sorted[center - 1] + sorted[center]) / 2.0
49
- else
50
- sorted[center]
51
- end
52
- end
53
- end
54
- end
1
+ module RailsPerformance
2
+ class Utils
3
+ # date key in redis store
4
+ def self.cache_key(now = Date.today)
5
+ "date-#{now}"
6
+ end
7
+
8
+ # write to current slot
9
+ # time - date -minute
10
+ def self.field_key(now = Time.current)
11
+ now.strftime("%H:%M")
12
+ end
13
+
14
+ def self.fetch_from_redis(query)
15
+ RailsPerformance.log "\n\n [REDIS QUERY] --> #{query}\n\n"
16
+
17
+ keys = RailsPerformance.redis.keys(query)
18
+ return [] if keys.blank?
19
+ values = RailsPerformance.redis.mget(keys)
20
+
21
+ RailsPerformance.log "\n\n [FOUND] --> #{values.size}\n\n"
22
+
23
+ [keys, values]
24
+ end
25
+
26
+ def self.save_to_redis(key, value, expire = RailsPerformance.duration.to_i)
27
+ # TODO think here if add return
28
+ # return if value.empty?
29
+
30
+ RailsPerformance.log " [SAVE] key ---> #{key}\n"
31
+ RailsPerformance.log " [SAVE] value ---> #{value.to_json}\n\n"
32
+ RailsPerformance.redis.set(key, value.to_json, ex: expire.to_i)
33
+ end
34
+
35
+ def self.days
36
+ (RailsPerformance.duration / 1.day) + 1
37
+ end
38
+
39
+ def self.median(array)
40
+ sorted = array.sort
41
+ size = sorted.size
42
+ center = size / 2
43
+
44
+ if size == 0
45
+ nil
46
+ elsif size.even?
47
+ (sorted[center - 1] + sorted[center]) / 2.0
48
+ else
49
+ sorted[center]
50
+ end
51
+ end
52
+
53
+ def self.percentile(values, percentile)
54
+ return nil if values.empty?
55
+
56
+ sorted = values.sort
57
+ rank = (percentile.to_f / 100) * (sorted.size - 1)
58
+
59
+ lower = sorted[rank.floor]
60
+ upper = sorted[rank.ceil]
61
+ lower + (upper - lower) * (rank - rank.floor)
62
+ end
63
+ end
64
+ end
@@ -1,4 +1,4 @@
1
1
  module RailsPerformance
2
- VERSION = '1.2.3'
3
- SCHEMA = '1.0.1'
2
+ VERSION = "1.3.1"
3
+ SCHEMA = "1.0.1"
4
4
  end
@@ -1,37 +1,37 @@
1
1
  require "redis"
2
- require "redis-namespace"
3
2
  require "browser"
4
- require 'active_support/core_ext/integer'
5
- require_relative "./rails_performance/version.rb"
6
- require_relative "rails_performance/rails/query_builder.rb"
7
- require_relative "rails_performance/rails/middleware.rb"
8
- require_relative "rails_performance/models/base_record.rb"
9
- require_relative "rails_performance/models/request_record.rb"
10
- require_relative "rails_performance/models/sidekiq_record.rb"
11
- require_relative "rails_performance/models/delayed_job_record.rb"
12
- require_relative "rails_performance/models/grape_record.rb"
13
- require_relative "rails_performance/models/trace_record.rb"
14
- require_relative "rails_performance/models/rake_record.rb"
15
- require_relative "rails_performance/models/custom_record.rb"
16
- require_relative "rails_performance/data_source.rb"
17
- require_relative "rails_performance/utils.rb"
18
- require_relative "rails_performance/reports/base_report.rb"
19
- require_relative "rails_performance/reports/requests_report.rb"
20
- require_relative "rails_performance/reports/crash_report.rb"
21
- require_relative "rails_performance/reports/response_time_report.rb"
22
- require_relative "rails_performance/reports/throughput_report.rb"
23
- require_relative "rails_performance/reports/recent_requests_report.rb"
24
- require_relative "rails_performance/reports/slow_requests_report.rb"
25
- require_relative "rails_performance/reports/breakdown_report.rb"
26
- require_relative "rails_performance/reports/trace_report.rb"
27
- require_relative "rails_performance/extensions/trace.rb"
28
- require_relative "rails_performance/thread/current_request.rb"
3
+ require "active_support/core_ext/integer"
4
+ require_relative "rails_performance/version"
5
+ require_relative "rails_performance/rails/query_builder"
6
+ require_relative "rails_performance/rails/middleware"
7
+ require_relative "rails_performance/models/base_record"
8
+ require_relative "rails_performance/models/request_record"
9
+ require_relative "rails_performance/models/sidekiq_record"
10
+ require_relative "rails_performance/models/delayed_job_record"
11
+ require_relative "rails_performance/models/grape_record"
12
+ require_relative "rails_performance/models/trace_record"
13
+ require_relative "rails_performance/models/rake_record"
14
+ require_relative "rails_performance/models/custom_record"
15
+ require_relative "rails_performance/data_source"
16
+ require_relative "rails_performance/utils"
17
+ require_relative "rails_performance/reports/base_report"
18
+ require_relative "rails_performance/reports/requests_report"
19
+ require_relative "rails_performance/reports/crash_report"
20
+ require_relative "rails_performance/reports/response_time_report"
21
+ require_relative "rails_performance/reports/throughput_report"
22
+ require_relative "rails_performance/reports/recent_requests_report"
23
+ require_relative "rails_performance/reports/slow_requests_report"
24
+ require_relative "rails_performance/reports/breakdown_report"
25
+ require_relative "rails_performance/reports/trace_report"
26
+ require_relative "rails_performance/reports/percentile_report"
27
+ require_relative "rails_performance/extensions/trace"
28
+ require_relative "rails_performance/thread/current_request"
29
29
 
30
30
  module RailsPerformance
31
31
  FORMAT = "%Y%m%dT%H%M"
32
32
 
33
33
  mattr_accessor :redis
34
- @@redis = Redis::Namespace.new("{#{::Rails.env}-rails-performance}", redis: Redis.new)
34
+ @@redis = Redis.new
35
35
 
36
36
  mattr_accessor :duration
37
37
  @@duration = 4.hours
@@ -67,24 +67,24 @@ module RailsPerformance
67
67
 
68
68
  # Enable http basic authentication
69
69
  mattr_accessor :http_basic_authentication_user_name
70
- @@http_basic_authentication_user_name = 'rails_performance'
70
+ @@http_basic_authentication_user_name = "rails_performance"
71
71
 
72
72
  # Enable http basic authentication
73
73
  mattr_accessor :http_basic_authentication_password
74
- @@http_basic_authentication_password = 'password12'
74
+ @@http_basic_authentication_password = "password12"
75
75
 
76
76
  # If you want to enable access by specific conditions
77
77
  mattr_accessor :verify_access_proc
78
78
  @@verify_access_proc = proc { |controller| true }
79
79
 
80
80
  mattr_reader :ignored_endpoints
81
- def RailsPerformance.ignored_endpoints=(endpoints)
81
+ def self.ignored_endpoints=(endpoints)
82
82
  @@ignored_endpoints = Set.new(endpoints)
83
83
  end
84
84
  @@ignored_endpoints = []
85
85
 
86
86
  mattr_reader :ignored_paths
87
- def RailsPerformance.ignored_paths=(paths)
87
+ def self.ignored_paths=(paths)
88
88
  @@ignored_paths = Set.new(paths)
89
89
  end
90
90
  @@ignored_paths = []
@@ -95,7 +95,7 @@ module RailsPerformance
95
95
 
96
96
  # config home button link
97
97
  mattr_accessor :home_link
98
- @@home_link = '/'
98
+ @@home_link = "/"
99
99
 
100
100
  # skip performance tracking for these rake tasks
101
101
  mattr_accessor :skipable_rake_tasks
@@ -113,11 +113,11 @@ module RailsPerformance
113
113
  mattr_accessor :include_custom_events
114
114
  @@include_custom_events = true
115
115
 
116
- def RailsPerformance.setup
116
+ def self.setup
117
117
  yield(self)
118
118
  end
119
119
 
120
- def RailsPerformance.log(message)
120
+ def self.log(message)
121
121
  return unless RailsPerformance.debug
122
122
 
123
123
  if ::Rails.logger
@@ -127,10 +127,9 @@ module RailsPerformance
127
127
  puts(message)
128
128
  end
129
129
  end
130
-
131
130
  end
132
131
 
133
132
  require "rails_performance/engine"
134
133
 
135
- require_relative './rails_performance/gems/custom_ext.rb'
134
+ require_relative "rails_performance/gems/custom_ext"
136
135
  RailsPerformance.send :extend, RailsPerformance::Gems::CustomExtension
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_performance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-25 00:00:00.000000000 Z
11
+ date: 2024-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: redis-namespace
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: browser
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -248,6 +234,20 @@ dependencies:
248
234
  - - ">="
249
235
  - !ruby/object:Gem::Version
250
236
  version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: standardrb
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
251
  description: 3rd party dependency-free solution how to monitor performance of your
252
252
  Rails applications.
253
253
  email:
@@ -263,6 +263,7 @@ files:
263
263
  - app/assets/images/activity.svg
264
264
  - app/assets/images/bot.svg
265
265
  - app/assets/images/close.svg
266
+ - app/assets/images/download.svg
266
267
  - app/assets/images/export.svg
267
268
  - app/assets/images/git.svg
268
269
  - app/assets/images/github.svg
@@ -272,6 +273,7 @@ files:
272
273
  - app/assets/images/stat.svg
273
274
  - app/assets/images/user.svg
274
275
  - app/controllers/rails_performance/base_controller.rb
276
+ - app/controllers/rails_performance/concerns/csv_exportable.rb
275
277
  - app/controllers/rails_performance/rails_performance_controller.rb
276
278
  - app/helpers/rails_performance/rails_performance_helper.rb
277
279
  - app/views/rails_performance/_panel.html.erb
@@ -284,6 +286,7 @@ files:
284
286
  - app/views/rails_performance/javascripts/stupidtable.min.js
285
287
  - app/views/rails_performance/javascripts/table.js
286
288
  - app/views/rails_performance/layouts/rails_performance.html.erb
289
+ - app/views/rails_performance/rails_performance/_export.html.erb
287
290
  - app/views/rails_performance/rails_performance/_recent_row.html.erb
288
291
  - app/views/rails_performance/rails_performance/_summary.html.erb
289
292
  - app/views/rails_performance/rails_performance/_trace.html.erb
@@ -334,6 +337,7 @@ files:
334
337
  - lib/rails_performance/reports/base_report.rb
335
338
  - lib/rails_performance/reports/breakdown_report.rb
336
339
  - lib/rails_performance/reports/crash_report.rb
340
+ - lib/rails_performance/reports/percentile_report.rb
337
341
  - lib/rails_performance/reports/recent_requests_report.rb
338
342
  - lib/rails_performance/reports/requests_report.rb
339
343
  - lib/rails_performance/reports/response_time_report.rb
@@ -362,7 +366,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
362
366
  - !ruby/object:Gem::Version
363
367
  version: '0'
364
368
  requirements: []
365
- rubygems_version: 3.5.11
369
+ rubygems_version: 3.3.7
366
370
  signing_key:
367
371
  specification_version: 4
368
372
  summary: Simple Rails Performance tracker. Alternative to the NewRelic, Datadog or