sidekiq 3.4.1 → 7.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (235) hide show
  1. checksums.yaml +5 -5
  2. data/Changes.md +1118 -4
  3. data/LICENSE.txt +9 -0
  4. data/README.md +55 -47
  5. data/bin/multi_queue_bench +271 -0
  6. data/bin/sidekiq +26 -3
  7. data/bin/sidekiqload +247 -0
  8. data/bin/sidekiqmon +11 -0
  9. data/lib/generators/sidekiq/job_generator.rb +57 -0
  10. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  11. data/lib/generators/sidekiq/templates/job_spec.rb.erb +6 -0
  12. data/lib/generators/sidekiq/templates/job_test.rb.erb +8 -0
  13. data/lib/sidekiq/api.rb +714 -312
  14. data/lib/sidekiq/capsule.rb +130 -0
  15. data/lib/sidekiq/cli.rb +275 -241
  16. data/lib/sidekiq/client.rb +141 -110
  17. data/lib/sidekiq/component.rb +68 -0
  18. data/lib/sidekiq/config.rb +291 -0
  19. data/lib/sidekiq/deploy.rb +62 -0
  20. data/lib/sidekiq/embedded.rb +61 -0
  21. data/lib/sidekiq/fetch.rb +53 -121
  22. data/lib/sidekiq/iterable_job.rb +53 -0
  23. data/lib/sidekiq/job/interrupt_handler.rb +22 -0
  24. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  25. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  26. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  27. data/lib/sidekiq/job/iterable.rb +231 -0
  28. data/lib/sidekiq/job.rb +385 -0
  29. data/lib/sidekiq/job_logger.rb +64 -0
  30. data/lib/sidekiq/job_retry.rb +305 -0
  31. data/lib/sidekiq/job_util.rb +107 -0
  32. data/lib/sidekiq/launcher.rb +241 -66
  33. data/lib/sidekiq/logger.rb +131 -0
  34. data/lib/sidekiq/manager.rb +91 -192
  35. data/lib/sidekiq/metrics/query.rb +156 -0
  36. data/lib/sidekiq/metrics/shared.rb +95 -0
  37. data/lib/sidekiq/metrics/tracking.rb +140 -0
  38. data/lib/sidekiq/middleware/chain.rb +114 -56
  39. data/lib/sidekiq/middleware/current_attributes.rb +111 -0
  40. data/lib/sidekiq/middleware/i18n.rb +8 -7
  41. data/lib/sidekiq/middleware/modules.rb +21 -0
  42. data/lib/sidekiq/monitor.rb +146 -0
  43. data/lib/sidekiq/paginator.rb +29 -16
  44. data/lib/sidekiq/processor.rb +248 -112
  45. data/lib/sidekiq/rails.rb +61 -27
  46. data/lib/sidekiq/redis_client_adapter.rb +114 -0
  47. data/lib/sidekiq/redis_connection.rb +68 -48
  48. data/lib/sidekiq/ring_buffer.rb +29 -0
  49. data/lib/sidekiq/scheduled.rb +173 -52
  50. data/lib/sidekiq/sd_notify.rb +149 -0
  51. data/lib/sidekiq/systemd.rb +24 -0
  52. data/lib/sidekiq/testing/inline.rb +7 -5
  53. data/lib/sidekiq/testing.rb +206 -65
  54. data/lib/sidekiq/transaction_aware_client.rb +51 -0
  55. data/lib/sidekiq/version.rb +4 -1
  56. data/lib/sidekiq/web/action.rb +99 -0
  57. data/lib/sidekiq/web/application.rb +479 -0
  58. data/lib/sidekiq/web/csrf_protection.rb +183 -0
  59. data/lib/sidekiq/web/helpers.rb +415 -0
  60. data/lib/sidekiq/web/router.rb +104 -0
  61. data/lib/sidekiq/web.rb +158 -200
  62. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  63. data/lib/sidekiq.rb +100 -132
  64. data/sidekiq.gemspec +27 -23
  65. data/web/assets/images/apple-touch-icon.png +0 -0
  66. data/web/assets/images/favicon.ico +0 -0
  67. data/web/assets/javascripts/application.js +177 -72
  68. data/web/assets/javascripts/base-charts.js +106 -0
  69. data/web/assets/javascripts/chart.min.js +13 -0
  70. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  71. data/web/assets/javascripts/dashboard-charts.js +192 -0
  72. data/web/assets/javascripts/dashboard.js +37 -286
  73. data/web/assets/javascripts/metrics.js +298 -0
  74. data/web/assets/stylesheets/application-dark.css +147 -0
  75. data/web/assets/stylesheets/application-rtl.css +163 -0
  76. data/web/assets/stylesheets/application.css +228 -247
  77. data/web/assets/stylesheets/bootstrap-rtl.min.css +9 -0
  78. data/web/assets/stylesheets/bootstrap.css +4 -8
  79. data/web/locales/ar.yml +87 -0
  80. data/web/locales/cs.yml +62 -52
  81. data/web/locales/da.yml +60 -53
  82. data/web/locales/de.yml +65 -53
  83. data/web/locales/el.yml +43 -24
  84. data/web/locales/en.yml +86 -61
  85. data/web/locales/es.yml +70 -53
  86. data/web/locales/fa.yml +80 -0
  87. data/web/locales/fr.yml +86 -56
  88. data/web/locales/gd.yml +99 -0
  89. data/web/locales/he.yml +80 -0
  90. data/web/locales/hi.yml +59 -59
  91. data/web/locales/it.yml +53 -53
  92. data/web/locales/ja.yml +78 -56
  93. data/web/locales/ko.yml +52 -52
  94. data/web/locales/lt.yml +83 -0
  95. data/web/locales/{no.yml → nb.yml} +62 -54
  96. data/web/locales/nl.yml +52 -52
  97. data/web/locales/pl.yml +45 -45
  98. data/web/locales/pt-br.yml +83 -55
  99. data/web/locales/pt.yml +51 -51
  100. data/web/locales/ru.yml +68 -60
  101. data/web/locales/sv.yml +53 -53
  102. data/web/locales/ta.yml +60 -60
  103. data/web/locales/tr.yml +101 -0
  104. data/web/locales/uk.yml +77 -0
  105. data/web/locales/ur.yml +80 -0
  106. data/web/locales/vi.yml +83 -0
  107. data/web/locales/zh-cn.yml +43 -16
  108. data/web/locales/zh-tw.yml +42 -8
  109. data/web/views/_footer.erb +22 -9
  110. data/web/views/_job_info.erb +27 -6
  111. data/web/views/_metrics_period_select.erb +12 -0
  112. data/web/views/_nav.erb +8 -22
  113. data/web/views/_paging.erb +3 -1
  114. data/web/views/_poll_link.erb +4 -0
  115. data/web/views/_summary.erb +7 -7
  116. data/web/views/busy.erb +91 -31
  117. data/web/views/dashboard.erb +52 -22
  118. data/web/views/dead.erb +5 -4
  119. data/web/views/filtering.erb +7 -0
  120. data/web/views/layout.erb +19 -7
  121. data/web/views/metrics.erb +91 -0
  122. data/web/views/metrics_for_job.erb +59 -0
  123. data/web/views/morgue.erb +26 -20
  124. data/web/views/queue.erb +36 -25
  125. data/web/views/queues.erb +24 -7
  126. data/web/views/retries.erb +29 -21
  127. data/web/views/retry.erb +6 -5
  128. data/web/views/scheduled.erb +20 -17
  129. data/web/views/scheduled_job_info.erb +2 -1
  130. metadata +101 -232
  131. data/.gitignore +0 -12
  132. data/.travis.yml +0 -16
  133. data/3.0-Upgrade.md +0 -70
  134. data/COMM-LICENSE +0 -85
  135. data/Contributing.md +0 -32
  136. data/Gemfile +0 -22
  137. data/LICENSE +0 -9
  138. data/Pro-2.0-Upgrade.md +0 -138
  139. data/Pro-Changes.md +0 -412
  140. data/Rakefile +0 -9
  141. data/bin/sidekiqctl +0 -93
  142. data/lib/generators/sidekiq/templates/worker_spec.rb.erb +0 -6
  143. data/lib/generators/sidekiq/templates/worker_test.rb.erb +0 -8
  144. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  145. data/lib/sidekiq/actor.rb +0 -39
  146. data/lib/sidekiq/core_ext.rb +0 -105
  147. data/lib/sidekiq/exception_handler.rb +0 -30
  148. data/lib/sidekiq/extensions/action_mailer.rb +0 -56
  149. data/lib/sidekiq/extensions/active_record.rb +0 -39
  150. data/lib/sidekiq/extensions/class_methods.rb +0 -39
  151. data/lib/sidekiq/extensions/generic_proxy.rb +0 -24
  152. data/lib/sidekiq/logging.rb +0 -104
  153. data/lib/sidekiq/middleware/server/active_record.rb +0 -13
  154. data/lib/sidekiq/middleware/server/logging.rb +0 -35
  155. data/lib/sidekiq/middleware/server/retry_jobs.rb +0 -206
  156. data/lib/sidekiq/util.rb +0 -55
  157. data/lib/sidekiq/web_helpers.rb +0 -234
  158. data/lib/sidekiq/worker.rb +0 -89
  159. data/test/config.yml +0 -9
  160. data/test/env_based_config.yml +0 -11
  161. data/test/fake_env.rb +0 -0
  162. data/test/fixtures/en.yml +0 -2
  163. data/test/helper.rb +0 -39
  164. data/test/test_api.rb +0 -494
  165. data/test/test_cli.rb +0 -365
  166. data/test/test_client.rb +0 -269
  167. data/test/test_exception_handler.rb +0 -55
  168. data/test/test_extensions.rb +0 -120
  169. data/test/test_fetch.rb +0 -104
  170. data/test/test_logging.rb +0 -34
  171. data/test/test_manager.rb +0 -164
  172. data/test/test_middleware.rb +0 -159
  173. data/test/test_processor.rb +0 -166
  174. data/test/test_redis_connection.rb +0 -127
  175. data/test/test_retry.rb +0 -373
  176. data/test/test_scheduled.rb +0 -120
  177. data/test/test_scheduling.rb +0 -71
  178. data/test/test_sidekiq.rb +0 -69
  179. data/test/test_testing.rb +0 -82
  180. data/test/test_testing_fake.rb +0 -271
  181. data/test/test_testing_inline.rb +0 -93
  182. data/test/test_web.rb +0 -594
  183. data/test/test_web_helpers.rb +0 -52
  184. data/test/test_worker_generator.rb +0 -17
  185. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  186. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  187. data/web/assets/images/status/active.png +0 -0
  188. data/web/assets/images/status/idle.png +0 -0
  189. data/web/assets/javascripts/locales/README.md +0 -27
  190. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  191. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  192. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  193. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  194. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  195. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  196. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  197. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  198. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  199. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  200. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  201. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  202. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  203. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  204. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  205. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  206. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  207. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  208. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  209. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  210. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  211. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  212. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  213. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  214. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  215. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  216. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  217. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  218. data/web/assets/javascripts/locales/jquery.timeago.no.js +0 -18
  219. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  220. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  221. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  222. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  223. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  224. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  225. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  226. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  227. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  228. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  229. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  230. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  231. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  232. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  233. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  234. data/web/views/_poll.erb +0 -10
  235. /data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
data/bin/sidekiqctl DELETED
@@ -1,93 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'fileutils'
4
-
5
- class Sidekiqctl
6
- DEFAULT_KILL_TIMEOUT = 10
7
-
8
- attr_reader :stage, :pidfile, :kill_timeout
9
-
10
- def self.print_usage
11
- puts "#{File.basename($0)} - stop a Sidekiq process from the command line."
12
- puts
13
- puts "Usage: #{File.basename($0)} <command> <pidfile> <kill_timeout>"
14
- puts " where <command> is either 'quiet' or 'stop'"
15
- puts " <pidfile> is path to a pidfile"
16
- puts " <kill_timeout> is number of seconds to wait until Sidekiq exits"
17
- puts " (default: #{Sidekiqctl::DEFAULT_KILL_TIMEOUT}), after which Sidekiq will be KILL'd"
18
- puts
19
- puts "Be sure to set the kill_timeout LONGER than Sidekiq's -t timeout. If you want"
20
- puts "to wait 60 seconds for jobs to finish, use `sidekiq -t 60` and `sidekiqctl stop"
21
- puts " path_to_pidfile 61`"
22
- puts
23
- end
24
-
25
- def initialize(stage, pidfile, timeout)
26
- @stage = stage
27
- @pidfile = pidfile
28
- @kill_timeout = timeout
29
-
30
- done('No pidfile given', :error) if !pidfile
31
- done("Pidfile #{pidfile} does not exist", :warn) if !File.exist?(pidfile)
32
- done('Invalid pidfile content', :error) if pid == 0
33
-
34
- fetch_process
35
-
36
- begin
37
- send(stage)
38
- rescue NoMethodError
39
- done "Invalid command: #{stage}", :error
40
- end
41
- end
42
-
43
- def fetch_process
44
- Process.getpgid(pid)
45
- rescue Errno::ESRCH
46
- done "Process doesn't exist", :error
47
- end
48
-
49
- def done(msg, error = nil)
50
- puts msg
51
- exit(exit_signal(error))
52
- end
53
-
54
- def exit_signal(error)
55
- (error == :error) ? 1 : 0
56
- end
57
-
58
- def pid
59
- @pid ||= File.read(pidfile).to_i
60
- end
61
-
62
- def quiet
63
- `kill -USR1 #{pid}`
64
- end
65
-
66
- def stop
67
- `kill -TERM #{pid}`
68
- kill_timeout.times do
69
- begin
70
- Process.getpgid(pid)
71
- rescue Errno::ESRCH
72
- FileUtils.rm_f pidfile
73
- done 'Sidekiq shut down gracefully.'
74
- end
75
- sleep 1
76
- end
77
- `kill -9 #{pid}`
78
- FileUtils.rm_f pidfile
79
- done 'Sidekiq shut down forcefully.'
80
- end
81
- alias_method :shutdown, :stop
82
- end
83
-
84
- if ARGV.length < 2
85
- Sidekiqctl.print_usage
86
- else
87
- stage = ARGV[0]
88
- pidfile = ARGV[1]
89
- timeout = ARGV[2].to_i
90
- timeout = Sidekiqctl::DEFAULT_KILL_TIMEOUT if timeout == 0
91
-
92
- Sidekiqctl.new(stage, pidfile, timeout)
93
- end
@@ -1,6 +0,0 @@
1
- require 'rails_helper'
2
- <% module_namespacing do -%>
3
- RSpec.describe <%= class_name %>Worker, :type => :worker do
4
- pending "add some examples to (or delete) #{__FILE__}"
5
- end
6
- <% end -%>
@@ -1,8 +0,0 @@
1
- require_relative 'test_helper'
2
- <% module_namespacing do -%>
3
- class <%= class_name %>WorkerTest < MiniTest::Unit::TestCase
4
- def test_example
5
- skip "add some examples to (or delete) #{__FILE__}"
6
- end
7
- end
8
- <% end -%>
@@ -1,49 +0,0 @@
1
- require 'rails/generators/named_base'
2
-
3
- module Sidekiq
4
- module Generators # :nodoc:
5
- class WorkerGenerator < ::Rails::Generators::NamedBase # :nodoc:
6
- desc 'This generator creates a Sidekiq Worker in app/workers and a corresponding test'
7
-
8
- check_class_collision suffix: 'Worker'
9
-
10
- def self.default_generator_root
11
- File.dirname(__FILE__)
12
- end
13
-
14
- def create_worker_file
15
- template 'worker.rb.erb', File.join('app/workers', class_path, "#{file_name}_worker.rb")
16
- end
17
-
18
- def create_test_file
19
- if defined?(RSpec)
20
- create_worker_spec
21
- else
22
- create_worker_test
23
- end
24
- end
25
-
26
- private
27
-
28
- def create_worker_spec
29
- template_file = File.join(
30
- 'spec/workers',
31
- class_path,
32
- "#{file_name}_worker_spec.rb"
33
- )
34
- template 'worker_spec.rb.erb', template_file
35
- end
36
-
37
- def create_worker_test
38
- template_file = File.join(
39
- 'test/workers',
40
- class_path,
41
- "#{file_name}_worker_test.rb"
42
- )
43
- template 'worker_test.rb.erb', template_file
44
- end
45
-
46
-
47
- end
48
- end
49
- end
data/lib/sidekiq/actor.rb DELETED
@@ -1,39 +0,0 @@
1
- module Sidekiq
2
- module Actor
3
-
4
- module ClassMethods
5
- def trap_exit(*args)
6
- end
7
- def new_link(*args)
8
- new(*args)
9
- end
10
- end
11
-
12
- module InstanceMethods
13
- def current_actor
14
- self
15
- end
16
- def after(interval)
17
- end
18
- def alive?
19
- @dead = false unless defined?(@dead)
20
- !@dead
21
- end
22
- def terminate
23
- @dead = true
24
- end
25
- def defer
26
- yield
27
- end
28
- end
29
-
30
- def self.included(klass)
31
- if $TESTING
32
- klass.__send__(:include, InstanceMethods)
33
- klass.__send__(:extend, ClassMethods)
34
- else
35
- klass.__send__(:include, Celluloid)
36
- end
37
- end
38
- end
39
- end
@@ -1,105 +0,0 @@
1
- begin
2
- require 'active_support/core_ext/class/attribute'
3
- rescue LoadError
4
-
5
- # A dumbed down version of ActiveSupport's
6
- # Class#class_attribute helper.
7
- class Class
8
- def class_attribute(*attrs)
9
- instance_writer = true
10
-
11
- attrs.each do |name|
12
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
13
- def self.#{name}() nil end
14
- def self.#{name}?() !!#{name} end
15
-
16
- def self.#{name}=(val)
17
- singleton_class.class_eval do
18
- define_method(:#{name}) { val }
19
- end
20
-
21
- if singleton_class?
22
- class_eval do
23
- def #{name}
24
- defined?(@#{name}) ? @#{name} : singleton_class.#{name}
25
- end
26
- end
27
- end
28
- val
29
- end
30
-
31
- def #{name}
32
- defined?(@#{name}) ? @#{name} : self.class.#{name}
33
- end
34
-
35
- def #{name}?
36
- !!#{name}
37
- end
38
- RUBY
39
-
40
- attr_writer name if instance_writer
41
- end
42
- end
43
-
44
- private
45
- def singleton_class?
46
- ancestors.first != self
47
- end
48
- end
49
- end
50
-
51
- begin
52
- require 'active_support/core_ext/hash/keys'
53
- require 'active_support/core_ext/hash/deep_merge'
54
- rescue LoadError
55
- class Hash
56
- def stringify_keys
57
- keys.each do |key|
58
- self[key.to_s] = delete(key)
59
- end
60
- self
61
- end if !{}.respond_to?(:stringify_keys)
62
-
63
- def symbolize_keys
64
- keys.each do |key|
65
- self[(key.to_sym rescue key) || key] = delete(key)
66
- end
67
- self
68
- end if !{}.respond_to?(:symbolize_keys)
69
-
70
- def deep_merge(other_hash, &block)
71
- dup.deep_merge!(other_hash, &block)
72
- end if !{}.respond_to?(:deep_merge)
73
-
74
- def deep_merge!(other_hash, &block)
75
- other_hash.each_pair do |k,v|
76
- tv = self[k]
77
- if tv.is_a?(Hash) && v.is_a?(Hash)
78
- self[k] = tv.deep_merge(v, &block)
79
- else
80
- self[k] = block && tv ? block.call(k, tv, v) : v
81
- end
82
- end
83
- self
84
- end if !{}.respond_to?(:deep_merge!)
85
- end
86
- end
87
-
88
- begin
89
- require 'active_support/core_ext/string/inflections'
90
- rescue LoadError
91
- class String
92
- def constantize
93
- names = self.split('::')
94
- names.shift if names.empty? || names.first.empty?
95
-
96
- constant = Object
97
- names.each do |name|
98
- constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
99
- end
100
- constant
101
- end
102
- end if !"".respond_to?(:constantize)
103
- end
104
-
105
-
@@ -1,30 +0,0 @@
1
- require 'sidekiq'
2
-
3
- module Sidekiq
4
- module ExceptionHandler
5
-
6
- class Logger
7
- def call(ex, ctxHash)
8
- Sidekiq.logger.warn(ctxHash) if !ctxHash.empty?
9
- Sidekiq.logger.warn "#{ex.class.name}: #{ex.message}"
10
- Sidekiq.logger.warn ex.backtrace.join("\n") unless ex.backtrace.nil?
11
- end
12
-
13
- # Set up default handler which just logs the error
14
- Sidekiq.error_handlers << Sidekiq::ExceptionHandler::Logger.new
15
- end
16
-
17
- def handle_exception(ex, ctxHash={})
18
- Sidekiq.error_handlers.each do |handler|
19
- begin
20
- handler.call(ex, ctxHash)
21
- rescue => ex
22
- Sidekiq.logger.error "!!! ERROR HANDLER THREW AN ERROR !!!"
23
- Sidekiq.logger.error ex
24
- Sidekiq.logger.error ex.backtrace.join("\n") unless ex.backtrace.nil?
25
- end
26
- end
27
- end
28
-
29
- end
30
- end
@@ -1,56 +0,0 @@
1
- require 'sidekiq/extensions/generic_proxy'
2
-
3
- module Sidekiq
4
- module Extensions
5
- ##
6
- # Adds 'delay', 'delay_for' and `delay_until` methods to ActionMailer to offload arbitrary email
7
- # delivery to Sidekiq. Example:
8
- #
9
- # UserMailer.delay.send_welcome_email(new_user)
10
- # UserMailer.delay_for(5.days).send_welcome_email(new_user)
11
- # UserMailer.delay_until(5.days.from_now).send_welcome_email(new_user)
12
- class DelayedMailer
13
- include Sidekiq::Worker
14
-
15
- def perform(yml)
16
- (target, method_name, args) = YAML.load(yml)
17
- msg = target.public_send(method_name, *args)
18
- # The email method can return nil, which causes ActionMailer to return
19
- # an undeliverable empty message.
20
- if msg
21
- deliver(msg)
22
- else
23
- raise "#{target.name}##{method_name} returned an undeliverable mail object"
24
- end
25
- end
26
-
27
- private
28
-
29
- def deliver(msg)
30
- if msg.respond_to?(:deliver_now)
31
- # Rails 4.2/5.0
32
- msg.deliver_now
33
- else
34
- # Rails 3.2/4.0/4.1
35
- msg.deliver
36
- end
37
- end
38
- end
39
-
40
- module ActionMailer
41
- def sidekiq_delay(options={})
42
- Proxy.new(DelayedMailer, self, options)
43
- end
44
- def sidekiq_delay_for(interval, options={})
45
- Proxy.new(DelayedMailer, self, options.merge('at' => Time.now.to_f + interval.to_f))
46
- end
47
- def sidekiq_delay_until(timestamp, options={})
48
- Proxy.new(DelayedMailer, self, options.merge('at' => timestamp.to_f))
49
- end
50
- alias_method :delay, :sidekiq_delay
51
- alias_method :delay_for, :sidekiq_delay_for
52
- alias_method :delay_until, :sidekiq_delay_until
53
- end
54
-
55
- end
56
- end
@@ -1,39 +0,0 @@
1
- require 'sidekiq/extensions/generic_proxy'
2
-
3
- module Sidekiq
4
- module Extensions
5
- ##
6
- # Adds 'delay', 'delay_for' and `delay_until` methods to ActiveRecord to offload instance method
7
- # execution to Sidekiq. Examples:
8
- #
9
- # User.recent_signups.each { |user| user.delay.mark_as_awesome }
10
- #
11
- # Please note, this is not recommended as this will serialize the entire
12
- # object to Redis. Your Sidekiq jobs should pass IDs, not entire instances.
13
- # This is here for backwards compatibility with Delayed::Job only.
14
- class DelayedModel
15
- include Sidekiq::Worker
16
-
17
- def perform(yml)
18
- (target, method_name, args) = YAML.load(yml)
19
- target.__send__(method_name, *args)
20
- end
21
- end
22
-
23
- module ActiveRecord
24
- def sidekiq_delay(options={})
25
- Proxy.new(DelayedModel, self, options)
26
- end
27
- def sidekiq_delay_for(interval, options={})
28
- Proxy.new(DelayedModel, self, options.merge('at' => Time.now.to_f + interval.to_f))
29
- end
30
- def sidekiq_delay_until(timestamp, options={})
31
- Proxy.new(DelayedModel, self, options.merge('at' => timestamp.to_f))
32
- end
33
- alias_method :delay, :sidekiq_delay
34
- alias_method :delay_for, :sidekiq_delay_for
35
- alias_method :delay_until, :sidekiq_delay_until
36
- end
37
-
38
- end
39
- end
@@ -1,39 +0,0 @@
1
- require 'sidekiq/extensions/generic_proxy'
2
-
3
- module Sidekiq
4
- module Extensions
5
- ##
6
- # Adds 'delay', 'delay_for' and `delay_until` methods to all Classes to offload class method
7
- # execution to Sidekiq. Examples:
8
- #
9
- # User.delay.delete_inactive
10
- # Wikipedia.delay.download_changes_for(Date.today)
11
- #
12
- class DelayedClass
13
- include Sidekiq::Worker
14
-
15
- def perform(yml)
16
- (target, method_name, args) = YAML.load(yml)
17
- target.__send__(method_name, *args)
18
- end
19
- end
20
-
21
- module Klass
22
- def sidekiq_delay(options={})
23
- Proxy.new(DelayedClass, self, options)
24
- end
25
- def sidekiq_delay_for(interval, options={})
26
- Proxy.new(DelayedClass, self, options.merge('at' => Time.now.to_f + interval.to_f))
27
- end
28
- def sidekiq_delay_until(timestamp, options={})
29
- Proxy.new(DelayedClass, self, options.merge('at' => timestamp.to_f))
30
- end
31
- alias_method :delay, :sidekiq_delay
32
- alias_method :delay_for, :sidekiq_delay_for
33
- alias_method :delay_until, :sidekiq_delay_until
34
- end
35
-
36
- end
37
- end
38
-
39
- Module.__send__(:include, Sidekiq::Extensions::Klass) unless defined?(::Rails)
@@ -1,24 +0,0 @@
1
- require 'yaml'
2
-
3
- module Sidekiq
4
- module Extensions
5
- class Proxy < BasicObject
6
- def initialize(performable, target, options={})
7
- @performable = performable
8
- @target = target
9
- @opts = options
10
- end
11
-
12
- def method_missing(name, *args)
13
- # Sidekiq has a limitation in that its message must be JSON.
14
- # JSON can't round trip real Ruby objects so we use YAML to
15
- # serialize the objects to a String. The YAML will be converted
16
- # to JSON and then deserialized on the other side back into a
17
- # Ruby object.
18
- obj = [@target, name, args]
19
- @performable.client_push({ 'class' => @performable, 'args' => [::YAML.dump(obj)] }.merge(@opts))
20
- end
21
- end
22
-
23
- end
24
- end
@@ -1,104 +0,0 @@
1
- require 'time'
2
- require 'logger'
3
-
4
- module Sidekiq
5
- module Logging
6
-
7
- class Pretty < Logger::Formatter
8
- SPACE = " "
9
-
10
- # Provide a call() method that returns the formatted message.
11
- def call(severity, time, program_name, message)
12
- "#{time.utc.iso8601(3)} #{::Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{context} #{severity}: #{message}\n"
13
- end
14
-
15
- def context
16
- c = Thread.current[:sidekiq_context]
17
- " #{c.join(SPACE)}" if c && c.any?
18
- end
19
- end
20
-
21
- class WithoutTimestamp < Pretty
22
- def call(severity, time, program_name, message)
23
- "#{::Process.pid} TID-#{Thread.current.object_id.to_s(36)}#{context} #{severity}: #{message}\n"
24
- end
25
- end
26
-
27
- def self.with_context(msg)
28
- Thread.current[:sidekiq_context] ||= []
29
- Thread.current[:sidekiq_context] << msg
30
- yield
31
- ensure
32
- Thread.current[:sidekiq_context].pop
33
- end
34
-
35
- def self.initialize_logger(log_target = STDOUT)
36
- oldlogger = defined?(@logger) ? @logger : nil
37
- @logger = Logger.new(log_target)
38
- @logger.level = Logger::INFO
39
- @logger.formatter = ENV['DYNO'] ? WithoutTimestamp.new : Pretty.new
40
- oldlogger.close if oldlogger && !$TESTING # don't want to close testing's STDOUT logging
41
- @logger
42
- end
43
-
44
- def self.logger
45
- defined?(@logger) ? @logger : initialize_logger
46
- end
47
-
48
- def self.logger=(log)
49
- @logger = (log ? log : Logger.new('/dev/null'))
50
- end
51
-
52
- # This reopens ALL logfiles in the process that have been rotated
53
- # using logrotate(8) (without copytruncate) or similar tools.
54
- # A +File+ object is considered for reopening if it is:
55
- # 1) opened with the O_APPEND and O_WRONLY flags
56
- # 2) the current open file handle does not match its original open path
57
- # 3) unbuffered (as far as userspace buffering goes, not O_SYNC)
58
- # Returns the number of files reopened
59
- def self.reopen_logs
60
- to_reopen = []
61
- append_flags = File::WRONLY | File::APPEND
62
-
63
- ObjectSpace.each_object(File) do |fp|
64
- begin
65
- if !fp.closed? && fp.stat.file? && fp.sync && (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
66
- to_reopen << fp
67
- end
68
- rescue IOError, Errno::EBADF
69
- end
70
- end
71
-
72
- nr = 0
73
- to_reopen.each do |fp|
74
- orig_st = begin
75
- fp.stat
76
- rescue IOError, Errno::EBADF
77
- next
78
- end
79
-
80
- begin
81
- b = File.stat(fp.path)
82
- next if orig_st.ino == b.ino && orig_st.dev == b.dev
83
- rescue Errno::ENOENT
84
- end
85
-
86
- begin
87
- File.open(fp.path, 'a') { |tmpfp| fp.reopen(tmpfp) }
88
- fp.sync = true
89
- nr += 1
90
- rescue IOError, Errno::EBADF
91
- # not much we can do...
92
- end
93
- end
94
- nr
95
- rescue RuntimeError => ex
96
- # RuntimeError: ObjectSpace is disabled; each_object will only work with Class, pass -X+O to enable
97
- puts "Unable to reopen logs: #{ex.message}"
98
- end
99
-
100
- def logger
101
- Sidekiq::Logging.logger
102
- end
103
- end
104
- end
@@ -1,13 +0,0 @@
1
- module Sidekiq
2
- module Middleware
3
- module Server
4
- class ActiveRecord
5
- def call(*args)
6
- yield
7
- ensure
8
- ::ActiveRecord::Base.clear_active_connections!
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,35 +0,0 @@
1
- module Sidekiq
2
- module Middleware
3
- module Server
4
- class Logging
5
-
6
- def call(worker, item, queue)
7
- # If we're using a wrapper class, like ActiveJob, use the "wrapped"
8
- # attribute to expose the underlying thing.
9
- klass = item['wrapped'] || worker.class.to_s
10
-
11
- Sidekiq::Logging.with_context("#{klass} JID-#{item['jid']}#{" BID-#{item['bid']}" if item['bid']}") do
12
- begin
13
- start = Time.now
14
- logger.info { "start" }
15
- yield
16
- logger.info { "done: #{elapsed(start)} sec" }
17
- rescue Exception
18
- logger.info { "fail: #{elapsed(start)} sec" }
19
- raise
20
- end
21
- end
22
- end
23
-
24
- def elapsed(start)
25
- (Time.now - start).round(3)
26
- end
27
-
28
- def logger
29
- Sidekiq.logger
30
- end
31
- end
32
- end
33
- end
34
- end
35
-