rails_performance 0.9.8 → 1.0.0.beta4

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -5
  3. data/app/controllers/rails_performance/rails_performance_controller.rb +48 -36
  4. data/app/helpers/rails_performance/application_helper.rb +25 -7
  5. data/app/views/rails_performance/javascripts/app.js +2 -2
  6. data/app/views/rails_performance/layouts/rails_performance.html.erb +1 -1
  7. data/app/views/rails_performance/rails_performance/_summary.html.erb +1 -1
  8. data/app/views/rails_performance/rails_performance/crashes.html.erb +6 -0
  9. data/app/views/rails_performance/rails_performance/custom.html.erb +83 -0
  10. data/app/views/rails_performance/rails_performance/delayed_job.html.erb +74 -0
  11. data/app/views/rails_performance/rails_performance/grape.html.erb +64 -0
  12. data/app/views/rails_performance/rails_performance/rake.html.erb +55 -0
  13. data/app/views/rails_performance/rails_performance/recent.html.erb +3 -1
  14. data/app/views/rails_performance/rails_performance/{jobs.html.erb → sidekiq.html.erb} +5 -4
  15. data/app/views/rails_performance/rails_performance/summary.js.erb +1 -1
  16. data/app/views/rails_performance/rails_performance/trace.js.erb +1 -1
  17. data/app/views/rails_performance/shared/_header.html.erb +9 -1
  18. data/app/views/rails_performance/stylesheets/style.css +9 -0
  19. data/config/routes.rb +5 -1
  20. data/lib/rails_performance.rb +30 -9
  21. data/lib/rails_performance/data_source.rb +55 -16
  22. data/lib/rails_performance/engine.rb +38 -18
  23. data/lib/rails_performance/extensions/{capture_everything.rb → trace.rb} +2 -2
  24. data/lib/rails_performance/gems/custom_ext.rb +33 -0
  25. data/lib/rails_performance/gems/delayed_job_ext.rb +54 -0
  26. data/lib/rails_performance/gems/grape_ext.rb +35 -0
  27. data/lib/rails_performance/gems/rake_ext.rb +40 -0
  28. data/lib/rails_performance/gems/{sidekiq.rb → sidekiq_ext.rb} +13 -12
  29. data/lib/rails_performance/instrument/metrics_collector.rb +10 -3
  30. data/lib/rails_performance/models/base_record.rb +12 -0
  31. data/lib/rails_performance/models/custom_record.rb +48 -0
  32. data/lib/rails_performance/models/delayed_job_record.rb +62 -0
  33. data/lib/rails_performance/models/grape_record.rb +61 -0
  34. data/lib/rails_performance/models/rake_record.rb +49 -0
  35. data/lib/rails_performance/models/request_record.rb +111 -0
  36. data/lib/rails_performance/models/sidekiq_record.rb +66 -0
  37. data/lib/rails_performance/models/trace_record.rb +19 -0
  38. data/lib/rails_performance/rails/middleware.rb +42 -16
  39. data/lib/rails_performance/rails/query_builder.rb +1 -1
  40. data/lib/rails_performance/reports/breakdown_report.rb +4 -16
  41. data/lib/rails_performance/reports/crash_report.rb +4 -15
  42. data/lib/rails_performance/reports/recent_requests_report.rb +7 -44
  43. data/lib/rails_performance/reports/trace_report.rb +2 -2
  44. data/lib/rails_performance/{models → thread}/current_request.rb +9 -4
  45. data/lib/rails_performance/utils.rb +15 -28
  46. data/lib/rails_performance/version.rb +2 -1
  47. metadata +93 -10
  48. data/lib/rails_performance/models/job_record.rb +0 -48
  49. data/lib/rails_performance/models/record.rb +0 -68
@@ -4,53 +4,16 @@ module RailsPerformance
4
4
  TIME_WINDOW = 60.minutes
5
5
 
6
6
  def set_defaults
7
- @sort ||= :datetime
7
+ @sort ||= :datetimei
8
8
  end
9
9
 
10
- def data(type = :requests) # most popular type
11
- db.data.collect do |record|
12
- case type
13
- when :requests
14
- record_hash(record)
15
- when :jobs
16
- job_hash(record)
17
- end
18
- end
19
- .select{|e| e if e[:datetime] >= TIME_WINDOW.ago}
20
- .sort{|a, b| b[sort] <=> a[sort]}
21
- end
22
-
23
- private
24
-
25
- def record_hash(record)
26
- {
27
- controller: record.controller,
28
- action: record.action,
29
- format: record.format,
30
- status: record.status,
31
- method: record.method,
32
- path: record.path,
33
- request_id: record.request_id,
34
- datetime: Time.at(record.datetimei.to_i),
35
- duration: record.value['duration'],
36
- db_runtime: record.value['db_runtime'],
37
- view_runtime: record.value['view_runtime'],
38
- }
39
- end
40
-
41
- def job_hash(record)
42
- {
43
- worker: record.worker,
44
- queue: record.queue,
45
-
46
- jid: record.jid,
47
- status: record.status,
48
- datetime: Time.at(record.start_timei.to_i),
49
- duration: record.value['duration'],
50
- }
10
+ def data
11
+ time_agoi = TIME_WINDOW.ago.to_i
12
+ db.data
13
+ .collect{|e| e.record_hash}
14
+ .select{|e| e if e[sort] >= time_agoi}
15
+ .sort{|a, b| b[sort] <=> a[sort]}
51
16
  end
52
17
  end
53
-
54
-
55
18
  end
56
19
  end
@@ -8,8 +8,8 @@ module RailsPerformance
8
8
  end
9
9
 
10
10
  def data
11
- key = "trace|#{request_id}"
12
- JSON.parse(RP.redis.get(key).presence || '[]')
11
+ key = "trace|#{request_id}|END|#{RailsPerformance::SCHEMA}"
12
+ JSON.parse(RailsPerformance.redis.get(key).presence || '[]')
13
13
  end
14
14
  end
15
15
 
@@ -1,6 +1,7 @@
1
1
  module RailsPerformance
2
2
  class CurrentRequest
3
- attr_reader :request_id, :storage
3
+ attr_reader :request_id, :tracings, :ignore
4
+ attr_accessor :data
4
5
  attr_accessor :record
5
6
 
6
7
  def CurrentRequest.init
@@ -12,17 +13,21 @@ module RailsPerformance
12
13
  end
13
14
 
14
15
  def CurrentRequest.cleanup
16
+ RailsPerformance.log "----------------------------------------------------> CurrentRequest.cleanup !!!!!!!!!!!! -------------------------\n\n"
17
+ RailsPerformance.skip = false
15
18
  Thread.current[:rp_current_request] = nil
16
19
  end
17
20
 
18
21
  def initialize(request_id)
19
22
  @request_id = request_id
20
- @storage = []
23
+ @tracings = []
24
+ @ignore = Set.new
25
+ @data = nil
21
26
  @record = nil
22
27
  end
23
28
 
24
- def store(options = {})
25
- @storage << options.merge(time: Time.now.to_i)
29
+ def trace(options = {})
30
+ @tracings << options.merge(time: Time.now.to_i)
26
31
  end
27
32
 
28
33
  end
@@ -12,35 +12,29 @@ module RailsPerformance
12
12
  now.strftime("%H:%M")
13
13
  end
14
14
 
15
- def Utils.log_job_in_redis(e)
16
- key = "jobs|queue|#{e[:queue]}|worker|#{e[:worker]}|jid|#{e[:jid]}|datetime|#{e[:datetime]}|created_ati|#{e[:created_ati]}|enqueued_ati|#{e[:enqueued_ati]}|start_timei|#{e[:start_timei]}|status|#{e[:status]}|END"
17
- value = { message: e[:message], duration: e[:duration] }
18
- Utils.save_to_redis(key, value)
19
- end
20
-
21
- def Utils.log_request_in_redis(e)
22
- value = e.slice(:view_runtime, :db_runtime, :duration, :HTTP_REFERER)
23
- key = "performance|controller|#{e[:controller]}|action|#{e[:action]}|format|#{e[:format]}|status|#{e[:status]}|datetime|#{e[:datetime]}|datetimei|#{e[:datetimei]}|method|#{e[:method]}|path|#{e[:path]}|request_id|#{e[:request_id]}|END"
24
- Utils.save_to_redis(key, value)
25
- end
26
-
27
- def Utils.log_trace_in_redis(request_id, value)
28
- key = "trace|#{request_id}"
29
- Utils.save_to_redis(key, value, RailsPerformance::Reports::RecentRequestsReport::TIME_WINDOW.to_i)
30
- end
31
-
32
15
  def Utils.fetch_from_redis(query)
33
- #puts "\n\n [REDIS QUERY] --> #{query}\n\n"
16
+ RailsPerformance.log "\n\n [REDIS QUERY] --> #{query}\n\n"
34
17
 
35
- keys = RP.redis.keys(query)
18
+ keys = RailsPerformance.redis.keys(query)
36
19
  return [] if keys.blank?
37
- values = RP.redis.mget(keys)
20
+ values = RailsPerformance.redis.mget(keys)
21
+
22
+ RailsPerformance.log "\n\n [FOUND] --> #{values.size}\n\n"
38
23
 
39
24
  [keys, values]
40
25
  end
41
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
+
42
36
  def Utils.days
43
- (RP.duration / 1.day) + 1
37
+ (RailsPerformance.duration / 1.day) + 1
44
38
  end
45
39
 
46
40
  def Utils.median(array)
@@ -56,12 +50,5 @@ module RailsPerformance
56
50
  sorted[center]
57
51
  end
58
52
  end
59
-
60
- def Utils.save_to_redis(key, value, expire = RP.duration.to_i)
61
- # puts " [SAVE] key ---> #{key}\n"
62
- # puts " value ---> #{value.to_json}\n\n"
63
- RP.redis.set(key, value.to_json, ex: expire.to_i)
64
- end
65
-
66
53
  end
67
54
  end
@@ -1,3 +1,4 @@
1
1
  module RailsPerformance
2
- VERSION = '0.9.8'
2
+ VERSION = '1.0.0.beta4'
3
+ SCHEMA = '1.0.1'
3
4
  end
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: 0.9.8
4
+ version: 1.0.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-02 00:00:00.000000000 Z
11
+ date: 2021-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -80,6 +80,34 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: grape
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: otr-activerecord
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
83
111
  - !ruby/object:Gem::Dependency
84
112
  name: sidekiq
85
113
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +122,48 @@ dependencies:
94
122
  - - ">="
95
123
  - !ruby/object:Gem::Version
96
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mimemagic
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: delayed_job_active_record
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: daemons
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
97
167
  description: 3rd party dependency-free solution how to monitor performance of your
98
168
  Rails applications.
99
169
  email:
@@ -130,10 +200,14 @@ files:
130
200
  - app/views/rails_performance/rails_performance/_summary.html.erb
131
201
  - app/views/rails_performance/rails_performance/_trace.html.erb
132
202
  - app/views/rails_performance/rails_performance/crashes.html.erb
203
+ - app/views/rails_performance/rails_performance/custom.html.erb
204
+ - app/views/rails_performance/rails_performance/delayed_job.html.erb
205
+ - app/views/rails_performance/rails_performance/grape.html.erb
133
206
  - app/views/rails_performance/rails_performance/index.html.erb
134
- - app/views/rails_performance/rails_performance/jobs.html.erb
207
+ - app/views/rails_performance/rails_performance/rake.html.erb
135
208
  - app/views/rails_performance/rails_performance/recent.html.erb
136
209
  - app/views/rails_performance/rails_performance/requests.html.erb
210
+ - app/views/rails_performance/rails_performance/sidekiq.html.erb
137
211
  - app/views/rails_performance/rails_performance/summary.js.erb
138
212
  - app/views/rails_performance/rails_performance/trace.js.erb
139
213
  - app/views/rails_performance/shared/_header.html.erb
@@ -148,14 +222,22 @@ files:
148
222
  - lib/rails_performance.rb
149
223
  - lib/rails_performance/data_source.rb
150
224
  - lib/rails_performance/engine.rb
151
- - lib/rails_performance/extensions/capture_everything.rb
152
- - lib/rails_performance/gems/sidekiq.rb
225
+ - lib/rails_performance/extensions/trace.rb
226
+ - lib/rails_performance/gems/custom_ext.rb
227
+ - lib/rails_performance/gems/delayed_job_ext.rb
228
+ - lib/rails_performance/gems/grape_ext.rb
229
+ - lib/rails_performance/gems/rake_ext.rb
230
+ - lib/rails_performance/gems/sidekiq_ext.rb
153
231
  - lib/rails_performance/instrument/metrics_collector.rb
154
232
  - lib/rails_performance/models/base_record.rb
155
233
  - lib/rails_performance/models/collection.rb
156
- - lib/rails_performance/models/current_request.rb
157
- - lib/rails_performance/models/job_record.rb
158
- - lib/rails_performance/models/record.rb
234
+ - lib/rails_performance/models/custom_record.rb
235
+ - lib/rails_performance/models/delayed_job_record.rb
236
+ - lib/rails_performance/models/grape_record.rb
237
+ - lib/rails_performance/models/rake_record.rb
238
+ - lib/rails_performance/models/request_record.rb
239
+ - lib/rails_performance/models/sidekiq_record.rb
240
+ - lib/rails_performance/models/trace_record.rb
159
241
  - lib/rails_performance/rails/middleware.rb
160
242
  - lib/rails_performance/rails/query_builder.rb
161
243
  - lib/rails_performance/reports/base_report.rb
@@ -166,6 +248,7 @@ files:
166
248
  - lib/rails_performance/reports/response_time_report.rb
167
249
  - lib/rails_performance/reports/throughput_report.rb
168
250
  - lib/rails_performance/reports/trace_report.rb
251
+ - lib/rails_performance/thread/current_request.rb
169
252
  - lib/rails_performance/utils.rb
170
253
  - lib/rails_performance/version.rb
171
254
  homepage: https://github.com/igorkasyanchuk/rails_performance
@@ -183,9 +266,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
183
266
  version: '0'
184
267
  required_rubygems_version: !ruby/object:Gem::Requirement
185
268
  requirements:
186
- - - ">="
269
+ - - ">"
187
270
  - !ruby/object:Gem::Version
188
- version: '0'
271
+ version: 1.3.1
189
272
  requirements: []
190
273
  rubygems_version: 3.0.3
191
274
  signing_key:
@@ -1,48 +0,0 @@
1
- module RailsPerformance
2
- module Models
3
- class JobRecord < BaseRecord
4
- attr_reader :queue, :worker, :jid, :created_ati, :enqueued_ati, :datetime, :start_timei, :status
5
-
6
- # key = job-performance
7
- # |queue|default
8
- # |worker|SimpleWorker
9
- # |jid|7d48fbf20976c224510dbc60
10
- # |datetime|20200124T0523
11
- # |created_ati|1583146613
12
- # |enqueued_ati|1583146613
13
- # |start_timei|1583146614
14
- # |status|success|END
15
- # value = JSON
16
- def initialize(key, value)
17
- @json = value
18
-
19
- items = key.split("|")
20
-
21
- @queue = items[2]
22
- @worker = items[4]
23
- @jid = items[6]
24
- @datetime = items[8]
25
- @created_ati = items[10]
26
- @enqueued_ati = items[12]
27
- @start_timei = items[14]
28
- @status = items[16]
29
- end
30
-
31
- def to_h
32
- {
33
- queue: queue,
34
- worker: worker,
35
- jid: jid,
36
- datetime: datetime,
37
- created_ati: created_ati,
38
- enqueued_ati: enqueued_ati,
39
- start_timei: start_timei,
40
- duration: duration,
41
- status: status,
42
- message: value['message']
43
- }
44
- end
45
-
46
- end
47
- end
48
- end
@@ -1,68 +0,0 @@
1
- module RailsPerformance
2
- module Models
3
- class Record < BaseRecord
4
- attr_reader :controller, :action, :format, :status, :datetime, :datetimei, :method, :path, :request_id
5
-
6
- def Record.find_by(request_id:)
7
- keys, values = RP::Utils.fetch_from_redis("performance|*|request_id|#{request_id}|*")
8
-
9
- return nil if keys.blank?
10
- return nil if values.blank?
11
-
12
- RP::Models::Record.new(keys[0], values[0])
13
- end
14
-
15
- # key = performance|
16
- # controller|HomeController|
17
- # action|index|
18
- # format|html|
19
- # status|200|
20
- # datetime|20200124T0523|
21
- # datetimei|1579861423|
22
- # method|GET|
23
- # path|/|
24
- # request_id|454545454545454545|
25
- # END
26
- # = {"view_runtime":8.444603008683771,"db_runtime":0,"duration":9.216095000000001}
27
- # value = JSON
28
- def initialize(key, value)
29
- @json = value
30
-
31
- items = key.split("|")
32
-
33
- @controller = items[2]
34
- @action = items[4]
35
- @format = items[6]
36
- @status = items[8]
37
- @datetime = items[10]
38
- @datetimei = items[12]
39
- @method = items[14]
40
- @path = items[16]
41
- @request_id = items[18]
42
- end
43
-
44
- def controller_action
45
- "#{controller}##{action}"
46
- end
47
-
48
- def controller_action_format
49
- "#{controller}##{action}|#{format}"
50
- end
51
-
52
- def to_h
53
- {
54
- controller: controller,
55
- action: action,
56
- format: format,
57
- method: method,
58
- path: path,
59
- duration: ms(duration),
60
- view_runtime: ms(value['view_runtime']),
61
- db_runtime: ms(value['db_runtime']),
62
- HTTP_REFERER: value['HTTP_REFERER']
63
- }
64
- end
65
-
66
- end
67
- end
68
- end