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,42 +1,56 @@
1
- RailsPerformance.setup do |config|
2
- config.redis = Redis::Namespace.new("#{Rails.env}-rails-performance", redis: Redis.new)
3
- config.duration = 4.hours
4
-
5
- config.debug = false # currently not used>
6
- config.enabled = true
7
-
8
- # default path where to mount gem
9
- config.mount_at = '/rails/performance'
10
-
11
- # protect your Performance Dashboard with HTTP BASIC password
12
- config.http_basic_authentication_enabled = false
13
- config.http_basic_authentication_user_name = 'rails_performance'
14
- config.http_basic_authentication_password = 'password12'
15
-
16
- # if you need an additional rules to check user permissions
17
- config.verify_access_proc = proc { |controller| true }
18
- # for example when you have `current_user`
19
- # config.verify_access_proc = proc { |controller| controller.current_user && controller.current_user.admin? }
20
-
21
- # You can ignore endpoints with Rails standard notation controller#action
22
- # config.ignored_endpoints = ['HomeController#contact']
23
-
24
- # You can ignore request paths by specifying the beginning of the path.
25
- # For example, all routes starting with '/admin' can be ignored:
26
- # config.ignored_paths = ['/admin']
27
-
28
- # store custom data for the request
29
- # config.custom_data_proc = proc do |env|
30
- # request = Rack::Request.new(env)
31
- # {
32
- # email: request.env['warden'].user&.email, # if you are using Devise for example
33
- # user_agent: request.env['HTTP_USER_AGENT']
34
- # }
35
- # end
36
-
37
- # config home button link
38
- config.home_link = '/'
39
- config.skipable_rake_tasks = ['webpacker:compile']
40
- config.include_rake_tasks = false
41
- config.include_custom_events = true
42
- end if defined?(RailsPerformance)
1
+ if defined?(RailsPerformance)
2
+ RailsPerformance.setup do |config|
3
+ # Redis configuration
4
+ config.redis = Redis::Namespace.new("#{Rails.env}-rails-performance", redis: Redis.new(url: ENV["REDIS_URL"].presence || "redis://127.0.0.1:6379/0"))
5
+
6
+ # All data we collect
7
+ config.duration = 4.hours
8
+
9
+ # Recent Requests configuration
10
+ config.recent_requests_time_window = 60.minutes
11
+ # confog.recent_requests_limit = nil # numnber of recent requests
12
+
13
+ # Slow Requests configuration
14
+ config.slow_requests_time_window = 4.hours
15
+ # config.slow_requests_limit = 500 # numnber of slow requests
16
+ config.slow_requests_threshold = 500 # ms
17
+
18
+ config.debug = false # currently not used>
19
+ config.enabled = true
20
+
21
+ # default path where to mount gem
22
+ config.mount_at = "/rails/performance"
23
+
24
+ # protect your Performance Dashboard with HTTP BASIC password
25
+ config.http_basic_authentication_enabled = false
26
+ config.http_basic_authentication_user_name = "rails_performance"
27
+ config.http_basic_authentication_password = "password12"
28
+
29
+ # if you need an additional rules to check user permissions
30
+ config.verify_access_proc = proc { |controller| true }
31
+ # for example when you have `current_user`
32
+ # config.verify_access_proc = proc { |controller| controller.current_user && controller.current_user.admin? }
33
+
34
+ # You can ignore endpoints with Rails standard notation controller#action
35
+ # config.ignored_endpoints = ['HomeController#contact']
36
+
37
+ # You can ignore request paths by specifying the beginning of the path.
38
+ # For example, all routes starting with '/admin' can be ignored:
39
+ config.ignored_paths = ['/rails/performance']
40
+
41
+ # store custom data for the request
42
+ # config.custom_data_proc = proc do |env|
43
+ # request = Rack::Request.new(env)
44
+ # {
45
+ # email: request.env['warden'].user&.email, # if you are using Devise for example
46
+ # user_agent: request.env['HTTP_USER_AGENT']
47
+ # }
48
+ # end
49
+
50
+ # config home button link
51
+ config.home_link = "/"
52
+ config.skipable_rake_tasks = ["webpacker:compile"]
53
+ config.include_rake_tasks = false
54
+ config.include_custom_events = true
55
+ end
56
+ end
@@ -1,121 +1,120 @@
1
- module RailsPerformance
2
- class DataSource
3
- KLASSES = {
4
- requests: RailsPerformance::Models::RequestRecord,
5
- sidekiq: RailsPerformance::Models::SidekiqRecord,
6
- delayed_job: RailsPerformance::Models::DelayedJobRecord,
7
- grape: RailsPerformance::Models::GrapeRecord,
8
- rake: RailsPerformance::Models::RakeRecord,
9
- custom: RailsPerformance::Models::CustomRecord,
10
- }
11
-
12
- attr_reader :q, :klass, :type
13
-
14
- def initialize(q: {}, type:)
15
- @type = type
16
- @klass = KLASSES[type]
17
- q[:on] ||= Date.today
18
- @q = q
19
- end
20
-
21
- def db
22
- result = RailsPerformance::Models::Collection.new
23
- (0..(RailsPerformance::Utils.days + 1)).to_a.reverse.each do |e|
24
- RailsPerformance::DataSource.new(q: self.q.merge({ on: (Time.current - e.days).to_date }), type: type).add_to(result)
25
- end
26
- result
27
- end
28
-
29
- def default?
30
- @q.keys == [:on]
31
- end
32
-
33
- def add_to(storage = RailsPerformance::Models::Collection.new)
34
- store do |record|
35
- storage.add(record)
36
- end
37
- storage
38
- end
39
-
40
- def store
41
- keys, values = Utils.fetch_from_redis(query)
42
-
43
- return [] if keys.blank?
44
-
45
- keys.each_with_index do |key, index|
46
- yield klass.from_db(key, values[index])
47
- end
48
- end
49
-
50
- private
51
-
52
- def query
53
- case type
54
- when :requests
55
- "performance|*#{compile_requests_query}*|END|#{RailsPerformance::SCHEMA}"
56
- when :sidekiq
57
- "sidekiq|*#{compile_sidekiq_query}*|END|#{RailsPerformance::SCHEMA}"
58
- when :delayed_job
59
- "delayed_job|*#{compile_delayed_job_query}*|END|#{RailsPerformance::SCHEMA}"
60
- when :grape
61
- "grape|*#{compile_grape_query}*|END|#{RailsPerformance::SCHEMA}"
62
- when :rake
63
- "rake|*#{compile_rake_query}*|END|#{RailsPerformance::SCHEMA}"
64
- when :custom
65
- "custom|*#{compile_custom_query}*|END|#{RailsPerformance::SCHEMA}"
66
- else
67
- raise "wrong type for datasource query builder"
68
- end
69
- end
70
-
71
- def compile_requests_query
72
- str = []
73
- str << "controller|#{q[:controller]}|" if q[:controller].present?
74
- str << "action|#{q[:action]}|" if q[:action].present?
75
- str << "format|#{q[:format]}|" if q[:format].present?
76
- str << "status|#{q[:status]}|" if q[:status].present?
77
- str << "datetime|#{q[:on].strftime('%Y%m%d')}*|" if q[:on].present?
78
- str << "method|#{q[:method]}|" if q[:method].present?
79
- str << "path|#{q[:path]}|" if q[:path].present?
80
- str.join("*")
81
- end
82
-
83
- def compile_sidekiq_query
84
- str = []
85
- str << "queue|#{q[:queue]}|" if q[:queue].present?
86
- str << "worker|#{q[:worker]}|" if q[:worker].present?
87
- str << "datetime|#{q[:on].strftime('%Y%m%d')}*|" if q[:on].present?
88
- str << "status|#{q[:status]}|" if q[:status].present?
89
- str.join("*")
90
- end
91
-
92
- def compile_delayed_job_query
93
- str = []
94
- str << "datetime|#{q[:on].strftime('%Y%m%d')}*|" if q[:on].present?
95
- str << "status|#{q[:status]}|" if q[:status].present?
96
- str.join("*")
97
- end
98
-
99
- def compile_rake_query
100
- str = []
101
- str << "datetime|#{q[:on].strftime('%Y%m%d')}*|" if q[:on].present?
102
- str << "status|#{q[:status]}|" if q[:status].present?
103
- str.join("*")
104
- end
105
-
106
- def compile_custom_query
107
- str = []
108
- str << "datetime|#{q[:on].strftime('%Y%m%d')}*|" if q[:on].present?
109
- str << "status|#{q[:status]}|" if q[:status].present?
110
- str.join("*")
111
- end
112
-
113
- def compile_grape_query
114
- str = []
115
- str << "datetime|#{q[:on].strftime('%Y%m%d')}*|" if q[:on].present?
116
- str << "status|#{q[:status]}|" if q[:status].present?
117
- str.join("*")
118
- end
119
-
120
- end
121
- end
1
+ module RailsPerformance
2
+ class DataSource
3
+ KLASSES = {
4
+ requests: RailsPerformance::Models::RequestRecord,
5
+ sidekiq: RailsPerformance::Models::SidekiqRecord,
6
+ delayed_job: RailsPerformance::Models::DelayedJobRecord,
7
+ grape: RailsPerformance::Models::GrapeRecord,
8
+ rake: RailsPerformance::Models::RakeRecord,
9
+ custom: RailsPerformance::Models::CustomRecord
10
+ }
11
+
12
+ attr_reader :q, :klass, :type
13
+
14
+ def initialize(type:, q: {})
15
+ @type = type
16
+ @klass = KLASSES[type]
17
+ q[:on] ||= Date.today
18
+ @q = q
19
+ end
20
+
21
+ def db
22
+ result = RailsPerformance::Models::Collection.new
23
+ (0..(RailsPerformance::Utils.days + 1)).to_a.reverse_each do |e|
24
+ RailsPerformance::DataSource.new(q: q.merge({on: (Time.current - e.days).to_date}), type: type).add_to(result)
25
+ end
26
+ result
27
+ end
28
+
29
+ def default?
30
+ @q.keys == [:on]
31
+ end
32
+
33
+ def add_to(storage = RailsPerformance::Models::Collection.new)
34
+ store do |record|
35
+ storage.add(record)
36
+ end
37
+ storage
38
+ end
39
+
40
+ def store
41
+ keys, values = Utils.fetch_from_redis(query)
42
+
43
+ return [] if keys.blank?
44
+
45
+ keys.each_with_index do |key, index|
46
+ yield klass.from_db(key, values[index])
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def query
53
+ case type
54
+ when :requests
55
+ "performance|*#{compile_requests_query}*|END|#{RailsPerformance::SCHEMA}"
56
+ when :sidekiq
57
+ "sidekiq|*#{compile_sidekiq_query}*|END|#{RailsPerformance::SCHEMA}"
58
+ when :delayed_job
59
+ "delayed_job|*#{compile_delayed_job_query}*|END|#{RailsPerformance::SCHEMA}"
60
+ when :grape
61
+ "grape|*#{compile_grape_query}*|END|#{RailsPerformance::SCHEMA}"
62
+ when :rake
63
+ "rake|*#{compile_rake_query}*|END|#{RailsPerformance::SCHEMA}"
64
+ when :custom
65
+ "custom|*#{compile_custom_query}*|END|#{RailsPerformance::SCHEMA}"
66
+ else
67
+ raise "wrong type for datasource query builder"
68
+ end
69
+ end
70
+
71
+ def compile_requests_query
72
+ str = []
73
+ str << "controller|#{q[:controller]}|" if q[:controller].present?
74
+ str << "action|#{q[:action]}|" if q[:action].present?
75
+ str << "format|#{q[:format]}|" if q[:format].present?
76
+ str << "status|#{q[:status]}|" if q[:status].present?
77
+ str << "datetime|#{q[:on].strftime("%Y%m%d")}*|" if q[:on].present?
78
+ str << "method|#{q[:method]}|" if q[:method].present?
79
+ str << "path|#{q[:path]}|" if q[:path].present?
80
+ str.join("*")
81
+ end
82
+
83
+ def compile_sidekiq_query
84
+ str = []
85
+ str << "queue|#{q[:queue]}|" if q[:queue].present?
86
+ str << "worker|#{q[:worker]}|" if q[:worker].present?
87
+ str << "datetime|#{q[:on].strftime("%Y%m%d")}*|" if q[:on].present?
88
+ str << "status|#{q[:status]}|" if q[:status].present?
89
+ str.join("*")
90
+ end
91
+
92
+ def compile_delayed_job_query
93
+ str = []
94
+ str << "datetime|#{q[:on].strftime("%Y%m%d")}*|" if q[:on].present?
95
+ str << "status|#{q[:status]}|" if q[:status].present?
96
+ str.join("*")
97
+ end
98
+
99
+ def compile_rake_query
100
+ str = []
101
+ str << "datetime|#{q[:on].strftime("%Y%m%d")}*|" if q[:on].present?
102
+ str << "status|#{q[:status]}|" if q[:status].present?
103
+ str.join("*")
104
+ end
105
+
106
+ def compile_custom_query
107
+ str = []
108
+ str << "datetime|#{q[:on].strftime("%Y%m%d")}*|" if q[:on].present?
109
+ str << "status|#{q[:status]}|" if q[:status].present?
110
+ str.join("*")
111
+ end
112
+
113
+ def compile_grape_query
114
+ str = []
115
+ str << "datetime|#{q[:on].strftime("%Y%m%d")}*|" if q[:on].present?
116
+ str << "status|#{q[:status]}|" if q[:status].present?
117
+ str.join("*")
118
+ end
119
+ end
120
+ end
@@ -1,7 +1,7 @@
1
- require 'action_view/log_subscriber'
2
- require_relative './rails/middleware.rb'
3
- require_relative './models/collection.rb'
4
- require_relative './instrument/metrics_collector.rb'
1
+ require "action_view/log_subscriber"
2
+ require_relative "rails/middleware"
3
+ require_relative "models/collection"
4
+ require_relative "instrument/metrics_collector"
5
5
 
6
6
  module RailsPerformance
7
7
  class Engine < ::Rails::Engine
@@ -23,7 +23,7 @@ module RailsPerformance
23
23
  app.middleware.insert_before RailsPerformance::Rails::Middleware, RailsPerformance::Rails::MiddlewareTraceStorerAndCleanup
24
24
 
25
25
  if defined?(::Sidekiq)
26
- require_relative './gems/sidekiq_ext.rb'
26
+ require_relative "gems/sidekiq_ext"
27
27
  Sidekiq.configure_server do |config|
28
28
  config.server_middleware do |chain|
29
29
  chain.add RailsPerformance::Gems::SidekiqExt
@@ -32,12 +32,12 @@ module RailsPerformance
32
32
  end
33
33
 
34
34
  if defined?(::Grape)
35
- require_relative './gems/grape_ext.rb'
35
+ require_relative "gems/grape_ext"
36
36
  RailsPerformance::Gems::GrapeExt.init
37
37
  end
38
38
 
39
39
  if defined?(::Delayed::Job)
40
- require_relative './gems/delayed_job_ext.rb'
40
+ require_relative "gems/delayed_job_ext"
41
41
  RailsPerformance::Gems::DelayedJobExt.init
42
42
  end
43
43
  end
@@ -58,7 +58,7 @@ module RailsPerformance
58
58
  ActiveRecord::LogSubscriber.send :prepend, RailsPerformance::Extensions::Db if defined?(ActiveRecord)
59
59
 
60
60
  if defined?(::Rake::Task) && RailsPerformance.include_rake_tasks
61
- require_relative './gems/rake_ext.rb'
61
+ require_relative "gems/rake_ext"
62
62
  RailsPerformance::Gems::RakeExt.init
63
63
  end
64
64
  end
@@ -1,33 +1,32 @@
1
- module RailsPerformance
2
- module Extensions
3
- module View
4
-
5
- def info(&block)
6
- CurrentRequest.current.trace({
7
- group: :view,
8
- message: block.call
9
- })
10
- super(&block)
11
- end
12
-
13
- end
14
- end
15
- end
16
-
17
- module RailsPerformance
18
- module Extensions
19
- module Db
20
-
21
- def sql(event)
22
- CurrentRequest.current.trace({
23
- group: :db,
24
- duration: event.duration.round(2),
25
- sql: event.payload[:sql]
26
- })
27
- super(event)
28
- end
29
-
30
- end
31
- end
32
- end
33
-
1
+ module RailsPerformance
2
+ module Extensions
3
+ module View
4
+ # in env
5
+ # this works if config.log_level = :info
6
+ def info(&block)
7
+ CurrentRequest.current.trace({
8
+ group: :view,
9
+ message: block.call
10
+ })
11
+ super
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ module RailsPerformance
18
+ module Extensions
19
+ module Db
20
+ # in env
21
+ # this works if config.log_level = :debug
22
+ def sql(event)
23
+ CurrentRequest.current.trace({
24
+ group: :db,
25
+ duration: event.duration.round(2),
26
+ sql: event.payload[:sql]
27
+ })
28
+ super
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,34 +1,31 @@
1
- module RailsPerformance
2
- module Gems
3
- module CustomExtension
4
- extend self
5
-
6
- def measure(tag_name, namespace_name = nil)
7
- return yield unless RailsPerformance.enabled
8
- return yield unless RailsPerformance.include_custom_events
9
-
10
- begin
11
- now = Time.current
12
- status = 'success'
13
- result = yield
14
- result
15
- rescue Exception => ex
16
- status = 'error'
17
- raise(ex)
18
- ensure
19
- RailsPerformance::Models::CustomRecord.new(
20
- tag_name: tag_name,
21
- namespace_name: namespace_name,
22
- status: status,
23
- duration: (Time.current - now) * 1000,
24
- datetime: now.strftime(RailsPerformance::FORMAT),
25
- datetimei: now.to_i,
26
- ).save
27
-
28
- result
29
- end
30
- end
31
-
32
- end
33
- end
34
- end
1
+ module RailsPerformance
2
+ module Gems
3
+ module CustomExtension
4
+ extend self
5
+
6
+ def measure(tag_name, namespace_name = nil)
7
+ return yield unless RailsPerformance.enabled
8
+ return yield unless RailsPerformance.include_custom_events
9
+
10
+ begin
11
+ now = Time.current
12
+ status = "success"
13
+ result = yield
14
+ result
15
+ rescue Exception => ex # rubocop:disable Lint/RescueException
16
+ status = "error"
17
+ raise(ex)
18
+ ensure
19
+ RailsPerformance::Models::CustomRecord.new(
20
+ tag_name: tag_name,
21
+ namespace_name: namespace_name,
22
+ status: status,
23
+ duration: (Time.current - now) * 1000,
24
+ datetime: now.strftime(RailsPerformance::FORMAT),
25
+ datetimei: now.to_i
26
+ ).save
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -1,54 +1,50 @@
1
- module RailsPerformance
2
- module Gems
3
- class DelayedJobExt
4
-
5
- class Plugin < ::Delayed::Plugin
6
- callbacks do |lifecycle|
7
- lifecycle.around(:invoke_job) do |job, *args, &block|
8
- begin
9
- now = Time.current
10
- block.call(job, *args)
11
- status = 'success'
12
- rescue Exception => error
13
- status = 'error'
14
- raise error
15
- ensure
16
- meta_data = RailsPerformance::Gems::DelayedJobExt::Plugin.meta(job.payload_object)
17
- record = RailsPerformance::Models::DelayedJobRecord.new(
18
- jid: job.id,
19
- duration: (Time.current - now) * 1000,
20
- datetime: now.strftime(RailsPerformance::FORMAT),
21
- datetimei: now.to_i,
22
- source_type: meta_data[0],
23
- class_name: meta_data[1],
24
- method_name: meta_data[2],
25
- status: status
26
- )
27
- record.save
28
- end
29
- end
30
- end
31
-
32
- # [source_type, class_name, method_name, duration]
33
- def self.meta(payload_object)
34
- if payload_object.is_a?(::Delayed::PerformableMethod)
35
- if payload_object.object.is_a?(Module)
36
- [:class_method, payload_object.object.name, payload_object.method_name.to_s]
37
- else
38
- [:instance_method, payload_object.object.class.name, payload_object.method_name.to_s]
39
- end
40
- else
41
- [:instance_method, payload_object.class.name, "perform"]
42
- end
43
- rescue
44
- [:unknown, :unknown, :unknown]
45
- end
46
- end
47
-
48
- def self.init
49
- ::Delayed::Worker.plugins += [::RailsPerformance::Gems::DelayedJobExt::Plugin]
50
- end
51
-
52
- end
53
- end
54
- end
1
+ module RailsPerformance
2
+ module Gems
3
+ class DelayedJobExt
4
+ class Plugin < ::Delayed::Plugin
5
+ callbacks do |lifecycle|
6
+ lifecycle.around(:invoke_job) do |job, *args, &block|
7
+ now = Time.current
8
+ block.call(job, *args)
9
+ status = "success"
10
+ rescue Exception => error # rubocop:disable Lint/RescueException
11
+ status = "error"
12
+ raise error
13
+ ensure
14
+ meta_data = RailsPerformance::Gems::DelayedJobExt::Plugin.meta(job.payload_object)
15
+ record = RailsPerformance::Models::DelayedJobRecord.new(
16
+ jid: job.id,
17
+ duration: (Time.current - now) * 1000,
18
+ datetime: now.strftime(RailsPerformance::FORMAT),
19
+ datetimei: now.to_i,
20
+ source_type: meta_data[0],
21
+ class_name: meta_data[1],
22
+ method_name: meta_data[2],
23
+ status: status
24
+ )
25
+ record.save
26
+ end
27
+ end
28
+
29
+ # [source_type, class_name, method_name, duration]
30
+ def self.meta(payload_object)
31
+ if payload_object.is_a?(::Delayed::PerformableMethod)
32
+ if payload_object.object.is_a?(Module)
33
+ [:class_method, payload_object.object.name, payload_object.method_name.to_s]
34
+ else
35
+ [:instance_method, payload_object.object.class.name, payload_object.method_name.to_s]
36
+ end
37
+ else
38
+ [:instance_method, payload_object.class.name, "perform"]
39
+ end
40
+ rescue
41
+ [:unknown, :unknown, :unknown]
42
+ end
43
+ end
44
+
45
+ def self.init
46
+ ::Delayed::Worker.plugins += [::RailsPerformance::Gems::DelayedJobExt::Plugin]
47
+ end
48
+ end
49
+ end
50
+ end