rails_performance 1.2.3 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
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