rails_performance 1.4.0.alpha3 → 1.4.0.alpha4

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 (28) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -1
  3. data/app/helpers/rails_performance/rails_performance_helper.rb +0 -4
  4. data/app/views/rails_performance/javascripts/app.js +6 -0
  5. data/app/views/rails_performance/layouts/rails_performance.html.erb +3 -0
  6. data/lib/rails_performance/data_source.rb +1 -1
  7. data/lib/rails_performance/extensions/resources_monitor.rb +1 -3
  8. data/lib/rails_performance/gems/custom_ext.rb +2 -2
  9. data/lib/rails_performance/gems/delayed_job_ext.rb +2 -2
  10. data/lib/rails_performance/gems/grape_ext.rb +1 -1
  11. data/lib/rails_performance/gems/rake_ext.rb +2 -2
  12. data/lib/rails_performance/gems/sidekiq_ext.rb +2 -2
  13. data/lib/rails_performance/instrument/metrics_collector.rb +2 -0
  14. data/lib/rails_performance/models/base_record.rb +1 -15
  15. data/lib/rails_performance/models/custom_record.rb +1 -1
  16. data/lib/rails_performance/models/delayed_job_record.rb +1 -1
  17. data/lib/rails_performance/models/grape_record.rb +1 -1
  18. data/lib/rails_performance/models/rake_record.rb +1 -1
  19. data/lib/rails_performance/models/request_record.rb +1 -1
  20. data/lib/rails_performance/models/resource_record.rb +1 -1
  21. data/lib/rails_performance/models/sidekiq_record.rb +1 -1
  22. data/lib/rails_performance/rails/middleware.rb +2 -2
  23. data/lib/rails_performance/reports/base_report.rb +8 -7
  24. data/lib/rails_performance/reports/resources_report.rb +0 -7
  25. data/lib/rails_performance/thread/current_request.rb +1 -1
  26. data/lib/rails_performance/utils.rb +9 -1
  27. data/lib/rails_performance/version.rb +2 -2
  28. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 05d2e2b2c1b69d3c41d7208b746af12d1ae6e8ae2c305c35e066636f9fc6946f
4
- data.tar.gz: 3b6611e09e42154d80151466badef9b98060e6215d959ffccc6f271023193c45
3
+ metadata.gz: 9ef083c7a88c7f7f263c3e5fe97049c589889e19494736b839de788c97e88aea
4
+ data.tar.gz: 361e9148f1ee28ebebb0e22a3c3dd6b9cf9ab440a4d2a594d534d6824ba300f3
5
5
  SHA512:
6
- metadata.gz: 054226e9584b58d19ab43773da49cbf7d1d4ee7c2358808ed7f749d786efb8f95a10aa6cfa4976b2b6fadfa143828dcd98f5408b209d89dd3855fa4bd5e4352e
7
- data.tar.gz: fc7e826a68e0ed7d17ab48bd391a97daa2e06a8b12aac47000dfc29c4217acd59118e0b5fe0ce65111dff5ce6b6b31838f98736855994b2a3b69cae9e6f2cef7
6
+ metadata.gz: d5d56892de5cc66ce1b324b4cc00f021bd582b4cda43d11e36e1a0506ff38f82448ade9785a17662d575867236b424a5a165506753b872012514895370f58c72
7
+ data.tar.gz: 7fa77548d06a0c157fd5f7ceb46578e91e6d3a6ce239df3701c5abb74dab25eb5aaa53e849fc8fcae2aca6a013d5e83eda80d3d70289f99f6450331d58e6e984
data/README.md CHANGED
@@ -175,7 +175,9 @@ You need to configure `config.custom_data_proc`. And you can capture current_use
175
175
  ![Custom Data](docs/custom_data.png)
176
176
 
177
177
 
178
- ### System Monitoring
178
+ ### Server Monitoring
179
+
180
+ ![Server Monitoring](docs/rails_performance_cpu_memory_storage.png)
179
181
 
180
182
  You can monitor system resources (CPU, memory, disk) by adding a gem to your Gemfile:
181
183
 
@@ -197,6 +199,14 @@ Basically using this code:
197
199
  end
198
200
  ```
199
201
 
202
+ For Kamal for example:
203
+
204
+ ```yaml
205
+ env:
206
+ clear:
207
+ RAILS_PERFORMANCE_SERVER_ID: "server"
208
+ ```
209
+
200
210
  You can also specifify custom "context" and "role" for monitoring, by changing the env variables:
201
211
 
202
212
  ```ruby
@@ -260,6 +270,8 @@ After this:
260
270
  - rails s
261
271
  - rake test
262
272
 
273
+ If you need quickly clear Redis data, you can use `rails runner 'RailsPerformance.redis.flushdb'`.
274
+
263
275
  Like a regular web development.
264
276
 
265
277
  Please note that to simplify integration with other apps all CSS/JS are bundled inside, and delivered in body of the request. This is to avoid integration with assets pipeline or webpacker.
@@ -30,10 +30,6 @@ module RailsPerformance
30
30
  end
31
31
  end
32
32
 
33
- def mss(value, limit = 1)
34
- ms(value.to_f * 1000, limit)
35
- end
36
-
37
33
  def ms(value, limit = 1)
38
34
  result = round_it(value, limit)
39
35
  return "-" if result.nil?
@@ -1,3 +1,9 @@
1
+ Highcharts.setOptions({
2
+ time: {
3
+ timezone: window.APP_TIME_ZONE
4
+ }
5
+ });
6
+
1
7
  function showTIRChart(div, data, addon, name) {
2
8
  Highcharts.chart(div, {
3
9
  chart: {
@@ -6,6 +6,9 @@
6
6
  <title>Rails Performance</title>
7
7
  <%= csrf_meta_tags %>
8
8
  <%= csp_meta_tag if ::Rails::VERSION::STRING.to_f >= 5.2 %>
9
+ <script>
10
+ window.APP_TIME_ZONE = '<%= Rails.application.config.time_zone.presence || 'UTC' %>';
11
+ </script>
9
12
  <%= render '/rails_performance/stylesheets/stylesheets' %>
10
13
  <link rel="shortcut icon" href="/favicon.ico">
11
14
  </head>
@@ -21,7 +21,7 @@ module RailsPerformance
21
21
 
22
22
  def db
23
23
  result = RailsPerformance::Models::Collection.new
24
- now = Time.current
24
+ now = RailsPerformance::Utils.time
25
25
  (0..(RailsPerformance::Utils.days)).to_a.reverse_each do |e|
26
26
  RailsPerformance::DataSource.new(q: q.merge({on: (now - e.days).to_date}), type: type).add_to(result)
27
27
  end
@@ -18,7 +18,6 @@ module RailsPerformance
18
18
  @mutex.synchronize do
19
19
  return if @thread
20
20
 
21
- # puts "Starting monitoring for #{context} - #{role}"
22
21
  @thread = Thread.new do
23
22
  loop do
24
23
  run
@@ -35,7 +34,6 @@ module RailsPerformance
35
34
  @mutex.synchronize do
36
35
  return unless @thread
37
36
 
38
- # puts "Stopping monitoring"
39
37
  @thread.kill
40
38
  @thread = nil
41
39
  end
@@ -83,7 +81,7 @@ module RailsPerformance
83
81
  def store_data(data)
84
82
  ::Rails.logger.info("Server: #{server_id}, Context: #{context}, Role: #{role}, data: #{data}")
85
83
 
86
- now = Time.current
84
+ now = RailsPerformance::Utils.time
87
85
  now = now.change(sec: 0, usec: 0)
88
86
  RailsPerformance::Models::ResourceRecord.new(
89
87
  server: server_id,
@@ -8,7 +8,7 @@ module RailsPerformance
8
8
  return yield unless RailsPerformance.include_custom_events
9
9
 
10
10
  begin
11
- now = Time.current
11
+ now = RailsPerformance::Utils.time
12
12
  status = "success"
13
13
  result = yield
14
14
  result
@@ -20,7 +20,7 @@ module RailsPerformance
20
20
  tag_name: tag_name,
21
21
  namespace_name: namespace_name,
22
22
  status: status,
23
- duration: (Time.current - now) * 1000,
23
+ duration: (RailsPerformance::Utils.time - now) * 1000,
24
24
  datetime: now.strftime(RailsPerformance::FORMAT),
25
25
  datetimei: now.to_i
26
26
  ).save
@@ -4,7 +4,7 @@ module RailsPerformance
4
4
  class Plugin < ::Delayed::Plugin
5
5
  callbacks do |lifecycle|
6
6
  lifecycle.around(:invoke_job) do |job, *args, &block|
7
- now = Time.current
7
+ now = RailsPerformance::Utils.time
8
8
  block.call(job, *args)
9
9
  status = "success"
10
10
  rescue Exception => error # rubocop:disable Lint/RescueException
@@ -14,7 +14,7 @@ module RailsPerformance
14
14
  meta_data = RailsPerformance::Gems::DelayedJobExt::Plugin.meta(job.payload_object)
15
15
  record = RailsPerformance::Models::DelayedJobRecord.new(
16
16
  jid: job.id,
17
- duration: (Time.current - now) * 1000,
17
+ duration: (RailsPerformance::Utils.time - now) * 1000,
18
18
  datetime: now.strftime(RailsPerformance::FORMAT),
19
19
  datetimei: now.to_i,
20
20
  source_type: meta_data[0],
@@ -6,7 +6,7 @@ module RailsPerformance
6
6
  # TODO change to set
7
7
  CurrentRequest.current.ignore.add(:performance)
8
8
 
9
- now = Time.current
9
+ now = RailsPerformance::Utils.time
10
10
  CurrentRequest.current.data ||= {}
11
11
  CurrentRequest.current.record ||= RailsPerformance::Models::GrapeRecord.new(request_id: CurrentRequest.current.request_id)
12
12
  CurrentRequest.current.record.datetimei ||= now.to_i
@@ -4,7 +4,7 @@ module RailsPerformance
4
4
  def self.init
5
5
  ::Rake::Task.class_eval do
6
6
  def invoke_with_rails_performance(*args)
7
- now = Time.current
7
+ now = RailsPerformance::Utils.time
8
8
  status = "success"
9
9
  invoke_without_new_rails_performance(*args)
10
10
  rescue Exception => ex # rubocop:disable Lint/RescueException
@@ -18,7 +18,7 @@ module RailsPerformance
18
18
  task: task_info,
19
19
  datetime: now.strftime(RailsPerformance::FORMAT),
20
20
  datetimei: now.to_i,
21
- duration: (Time.current - now) * 1000,
21
+ duration: (RailsPerformance::Utils.time - now) * 1000,
22
22
  status: status
23
23
  ).save
24
24
  end
@@ -5,7 +5,7 @@ module RailsPerformance
5
5
  end
6
6
 
7
7
  def call(worker, msg, queue)
8
- now = Time.current
8
+ now = RailsPerformance::Utils.time
9
9
  record = RailsPerformance::Models::SidekiqRecord.new(
10
10
  enqueued_ati: msg["enqueued_at"].to_i,
11
11
  datetimei: msg["created_at"].to_i,
@@ -25,7 +25,7 @@ module RailsPerformance
25
25
  raise ex
26
26
  ensure
27
27
  # store in ms instead of seconds
28
- record.duration = (Time.current - now) * 1000
28
+ record.duration = (RailsPerformance::Utils.time - now) * 1000
29
29
  record.save
30
30
  end
31
31
  end
@@ -25,6 +25,8 @@ module RailsPerformance
25
25
  return if RailsPerformance.ignored_endpoints.include? "#{event.payload[:controller]}##{event.payload[:action]}"
26
26
  return if RailsPerformance.ignored_paths.any? { |p| event.payload[:path].start_with?(p) }
27
27
 
28
+ finished = finished.utc
29
+
28
30
  record = {
29
31
  controller: event.payload[:controller],
30
32
  action: event.payload[:action],
@@ -1,18 +1,6 @@
1
1
  module RailsPerformance
2
2
  module Models
3
3
  class BaseRecord
4
- def self.from_db(key, value)
5
- raise "implement me"
6
- end
7
-
8
- def save
9
- raise "implement me"
10
- end
11
-
12
- def record_hash
13
- raise "implement me"
14
- end
15
-
16
4
  def value
17
5
  @value ||= JSON.parse(@json || "{}")
18
6
  end
@@ -24,9 +12,7 @@ module RailsPerformance
24
12
  private
25
13
 
26
14
  def ms(e)
27
- if e
28
- e.to_f.round(1).to_s + " ms"
29
- end
15
+ e.to_f.round(1).to_s + " ms" if e
30
16
  end
31
17
  end
32
18
  end
@@ -32,7 +32,7 @@ module RailsPerformance
32
32
  namespace_name: namespace_name,
33
33
  status: status,
34
34
  datetimei: datetimei,
35
- datetime: Time.at(datetimei.to_i),
35
+ datetime: RailsPerformance::Utils.from_datetimei(datetimei.to_i),
36
36
  duration: value["duration"]
37
37
  }
38
38
  end
@@ -41,7 +41,7 @@ module RailsPerformance
41
41
  def record_hash
42
42
  {
43
43
  jid: jid,
44
- datetime: Time.at(datetimei),
44
+ datetime: RailsPerformance::Utils.from_datetimei(datetimei),
45
45
  datetimei: datetimei,
46
46
  duration: value["duration"],
47
47
  status: status,
@@ -43,7 +43,7 @@ module RailsPerformance
43
43
  status: status,
44
44
  method: method,
45
45
  path: path,
46
- datetime: Time.at(datetimei.to_i),
46
+ datetime: RailsPerformance::Utils.from_datetimei(datetimei.to_i),
47
47
  datetimei: datetimei.to_i,
48
48
  request_id: request_id
49
49
  }.merge(value)
@@ -31,7 +31,7 @@ module RailsPerformance
31
31
  def record_hash
32
32
  {
33
33
  task: task,
34
- datetime: Time.at(datetimei),
34
+ datetime: RailsPerformance::Utils.from_datetimei(datetimei),
35
35
  datetimei: datetimei,
36
36
  duration: duration,
37
37
  status: status
@@ -94,7 +94,7 @@ module RailsPerformance
94
94
  method: method,
95
95
  path: path,
96
96
  request_id: request_id,
97
- datetime: Time.at(datetimei.to_i),
97
+ datetime: RailsPerformance::Utils.from_datetimei(datetimei.to_i),
98
98
  datetimei: datetimei,
99
99
  duration: value["duration"],
100
100
  db_runtime: value["db_runtime"],
@@ -31,7 +31,7 @@ module RailsPerformance
31
31
  role: role,
32
32
  context: context,
33
33
  datetime: datetime,
34
- datetimei: Time.at(datetimei.to_i),
34
+ datetimei: RailsPerformance::Utils.from_datetimei(datetimei.to_i),
35
35
  cpu: value["cpu"],
36
36
  memory: value["memory"],
37
37
  disk: value["disk"]
@@ -49,7 +49,7 @@ module RailsPerformance
49
49
  jid: jid,
50
50
  status: status,
51
51
  datetimei: datetimei,
52
- datetime: Time.at(start_timei.to_i),
52
+ datetime: RailsPerformance::Utils.from_datetimei(start_timei.to_i),
53
53
  duration: value["duration"],
54
54
  message: value["message"]
55
55
  }
@@ -41,7 +41,7 @@ module RailsPerformance
41
41
  def call!(env)
42
42
  @status, @headers, @response = @app.call(env)
43
43
 
44
- # t = Time.current
44
+ # t = RailsPerformance::Utils.time
45
45
  if !RailsPerformance.skip
46
46
  if !CurrentRequest.current.ignore.include?(:performance) # grape is executed first, and than ignore regular future storage of "controller"-like request
47
47
  if (data = CurrentRequest.current.data)
@@ -66,7 +66,7 @@ module RailsPerformance
66
66
  end
67
67
  end
68
68
  end
69
- # puts "==> store performance data: #{(Time.current - t).round(3)}ms"
69
+ # puts "==> store performance data: #{(RailsPerformance::Utils.time - t).round(3)}ms"
70
70
 
71
71
  [@status, @headers, @response]
72
72
  end
@@ -30,11 +30,12 @@ module RailsPerformance
30
30
  end
31
31
  end
32
32
 
33
+ # TODO: simplify this method, and combine with nullify_data
33
34
  def calculate_data
34
- now = Time.current
35
+ now = RailsPerformance::Utils.time
35
36
  now = now.change(sec: 0, usec: 0)
36
- stop = Time.at(60 * (now.to_i / 60))
37
- offset = RailsPerformance::Reports::BaseReport.time_in_app_time_zone(now).utc_offset
37
+ stop = now # Time.at(60 * (now.to_i / 60), in:)
38
+ offset = 0 # RailsPerformance::Reports::BaseReport.time_in_app_time_zone(now).utc_offset
38
39
  current = stop - RailsPerformance.duration
39
40
 
40
41
  @data = []
@@ -48,7 +49,7 @@ module RailsPerformance
48
49
  while current <= stop
49
50
  key = current.strftime(RailsPerformance::FORMAT)
50
51
  views = all[key].presence || 0
51
- @data << [(current.to_i + offset) * 1000, views.is_a?(Numeric) ? views.round(2) : views]
52
+ @data << [(current.to_i + offset) * 1000, views.round(2)]
52
53
  current += 1.minute
53
54
  end
54
55
 
@@ -65,10 +66,10 @@ module RailsPerformance
65
66
  def nil_data
66
67
  @nil_data ||= begin
67
68
  result = {}
68
- now = Time.current
69
+ now = RailsPerformance::Utils.time
69
70
  now = now.change(sec: 0, usec: 0)
70
- stop = Time.at(60 * (now.to_i / 60))
71
- offset = RailsPerformance::Reports::BaseReport.time_in_app_time_zone(now).utc_offset
71
+ stop = now # Time.at(60 * (now.to_i / 60))
72
+ offset = 0 # RailsPerformance::Reports::BaseReport.time_in_app_time_zone(now).utc_offset
72
73
  current = stop - RailsPerformance.duration
73
74
 
74
75
  while current <= stop
@@ -1,13 +1,6 @@
1
1
  module RailsPerformance
2
2
  module Reports
3
3
  class ResourcesReport < BaseReport
4
- def self.x
5
- @datasource = RailsPerformance::DataSource.new(type: :resources)
6
- db = @datasource.db
7
- @data = RailsPerformance::Reports::ResourcesReport.new(db)
8
- # RailsPerformance::Reports::ResourcesReport.x
9
- end
10
-
11
4
  def data
12
5
  @data ||= db.data
13
6
  .collect { |e| e.record_hash }
@@ -27,7 +27,7 @@ module RailsPerformance
27
27
  end
28
28
 
29
29
  def trace(options = {})
30
- @tracings << options.merge(time: Time.current.to_i)
30
+ @tracings << options.merge(time: RailsPerformance::Utils.time.to_i)
31
31
  end
32
32
  end
33
33
  end
@@ -1,5 +1,13 @@
1
1
  module RailsPerformance
2
2
  class Utils
3
+ def self.time
4
+ Time.now.utc
5
+ end
6
+
7
+ def self.from_datetimei(datetimei)
8
+ Time.at(datetimei, in: "+00:00")
9
+ end
10
+
3
11
  # date key in redis store
4
12
  def self.cache_key(now = Date.today)
5
13
  "date-#{now}"
@@ -7,7 +15,7 @@ module RailsPerformance
7
15
 
8
16
  # write to current slot
9
17
  # time - date -minute
10
- def self.field_key(now = Time.current)
18
+ def self.field_key(now = RailsPerformance::Utils.time)
11
19
  now.strftime("%H:%M")
12
20
  end
13
21
 
@@ -1,4 +1,4 @@
1
1
  module RailsPerformance
2
- VERSION = "1.4.0.alpha3"
3
- SCHEMA = "1.0.1"
2
+ VERSION = "1.4.0.alpha4"
3
+ SCHEMA = "1.0.2"
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_performance
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0.alpha3
4
+ version: 1.4.0.alpha4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk