rails_performance 1.4.0.alpha3 → 1.4.0.alpha4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +13 -1
- data/app/helpers/rails_performance/rails_performance_helper.rb +0 -4
- data/app/views/rails_performance/javascripts/app.js +6 -0
- data/app/views/rails_performance/layouts/rails_performance.html.erb +3 -0
- data/lib/rails_performance/data_source.rb +1 -1
- data/lib/rails_performance/extensions/resources_monitor.rb +1 -3
- data/lib/rails_performance/gems/custom_ext.rb +2 -2
- data/lib/rails_performance/gems/delayed_job_ext.rb +2 -2
- data/lib/rails_performance/gems/grape_ext.rb +1 -1
- data/lib/rails_performance/gems/rake_ext.rb +2 -2
- data/lib/rails_performance/gems/sidekiq_ext.rb +2 -2
- data/lib/rails_performance/instrument/metrics_collector.rb +2 -0
- data/lib/rails_performance/models/base_record.rb +1 -15
- data/lib/rails_performance/models/custom_record.rb +1 -1
- data/lib/rails_performance/models/delayed_job_record.rb +1 -1
- data/lib/rails_performance/models/grape_record.rb +1 -1
- data/lib/rails_performance/models/rake_record.rb +1 -1
- data/lib/rails_performance/models/request_record.rb +1 -1
- data/lib/rails_performance/models/resource_record.rb +1 -1
- data/lib/rails_performance/models/sidekiq_record.rb +1 -1
- data/lib/rails_performance/rails/middleware.rb +2 -2
- data/lib/rails_performance/reports/base_report.rb +8 -7
- data/lib/rails_performance/reports/resources_report.rb +0 -7
- data/lib/rails_performance/thread/current_request.rb +1 -1
- data/lib/rails_performance/utils.rb +9 -1
- data/lib/rails_performance/version.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ef083c7a88c7f7f263c3e5fe97049c589889e19494736b839de788c97e88aea
|
4
|
+
data.tar.gz: 361e9148f1ee28ebebb0e22a3c3dd6b9cf9ab440a4d2a594d534d6824ba300f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
###
|
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.
|
@@ -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 =
|
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 =
|
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 =
|
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: (
|
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 =
|
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: (
|
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 =
|
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 =
|
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: (
|
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 =
|
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 = (
|
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
|
@@ -94,7 +94,7 @@ module RailsPerformance
|
|
94
94
|
method: method,
|
95
95
|
path: path,
|
96
96
|
request_id: request_id,
|
97
|
-
datetime:
|
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:
|
34
|
+
datetimei: RailsPerformance::Utils.from_datetimei(datetimei.to_i),
|
35
35
|
cpu: value["cpu"],
|
36
36
|
memory: value["memory"],
|
37
37
|
disk: value["disk"]
|
@@ -41,7 +41,7 @@ module RailsPerformance
|
|
41
41
|
def call!(env)
|
42
42
|
@status, @headers, @response = @app.call(env)
|
43
43
|
|
44
|
-
# t =
|
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: #{(
|
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 =
|
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.
|
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 =
|
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 }
|
@@ -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 =
|
18
|
+
def self.field_key(now = RailsPerformance::Utils.time)
|
11
19
|
now.strftime("%H:%M")
|
12
20
|
end
|
13
21
|
|