mirror of
https://github.com/endofunky/sidetiq.git
synced 2022-11-09 13:53:30 -05:00
Track worker execution history.
This commit is contained in:
parent
e3fb989b74
commit
4e009089ac
8 changed files with 128 additions and 2 deletions
|
@ -5,6 +5,7 @@ require 'sidekiq/web'
|
||||||
require 'sidetiq/web'
|
require 'sidetiq/web'
|
||||||
|
|
||||||
require './workers/simple.rb'
|
require './workers/simple.rb'
|
||||||
|
require './workers/failing.rb'
|
||||||
|
|
||||||
Sidekiq.configure_client do |config|
|
Sidekiq.configure_client do |config|
|
||||||
config.redis = { :size => 1 }
|
config.redis = { :size => 1 }
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
require 'sidekiq'
|
require 'sidekiq'
|
||||||
require 'sidetiq'
|
require 'sidetiq'
|
||||||
|
|
||||||
require_relative 'workers/simple'
|
require_relative 'workers/simple'
|
||||||
|
require_relative 'workers/failing'
|
||||||
|
|
||||||
Sidekiq.logger.level = Logger::DEBUG
|
Sidekiq.logger.level = Logger::DEBUG
|
||||||
|
|
||||||
|
|
13
examples/workers/failing.rb
Normal file
13
examples/workers/failing.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
class Failing
|
||||||
|
include Sidekiq::Worker
|
||||||
|
include Sidetiq::Schedulable
|
||||||
|
|
||||||
|
recurrence { secondly }
|
||||||
|
|
||||||
|
def perform(*args)
|
||||||
|
if rand(5) == 0
|
||||||
|
raise "This didn't go well."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
|
@ -5,7 +5,6 @@ class Simple
|
||||||
recurrence { secondly }
|
recurrence { secondly }
|
||||||
|
|
||||||
def perform(*args)
|
def perform(*args)
|
||||||
Sidekiq.logger.info "#perform"
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,9 @@ require 'sidetiq/schedule'
|
||||||
require 'sidetiq/schedulable'
|
require 'sidetiq/schedulable'
|
||||||
require 'sidetiq/version'
|
require 'sidetiq/version'
|
||||||
|
|
||||||
|
# middleware
|
||||||
|
require 'sidetiq/middleware/history'
|
||||||
|
|
||||||
# actor topology
|
# actor topology
|
||||||
require 'sidetiq/actor/clock'
|
require 'sidetiq/actor/clock'
|
||||||
require 'sidetiq/actor/handler'
|
require 'sidetiq/actor/handler'
|
||||||
|
|
|
@ -24,7 +24,7 @@ module Sidetiq
|
||||||
end
|
end
|
||||||
|
|
||||||
configure do |config|
|
configure do |config|
|
||||||
config.priority = Thread.main.priority
|
config.worker_history = 100
|
||||||
config.resolution = 1
|
config.resolution = 1
|
||||||
config.lock_expire = 1000
|
config.lock_expire = 1000
|
||||||
config.utc = false
|
config.utc = false
|
||||||
|
|
48
lib/sidetiq/middleware/history.rb
Normal file
48
lib/sidetiq/middleware/history.rb
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
module Sidetiq
|
||||||
|
module Middleware
|
||||||
|
class History
|
||||||
|
def call(worker, msg, queue, &block)
|
||||||
|
if worker.kind_of?(Sidetiq::Schedulable)
|
||||||
|
call_with_sidetiq_history(worker, msg, queue, &block)
|
||||||
|
else
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def call_with_sidetiq_history(worker, msg, queue)
|
||||||
|
entry = {
|
||||||
|
status: :success,
|
||||||
|
error: "",
|
||||||
|
exception: "",
|
||||||
|
backtrace: "",
|
||||||
|
processor: "#{Socket.gethostname}:#{Process.pid}-#{Thread.current.object_id}",
|
||||||
|
processed: Time.now.iso8601
|
||||||
|
}
|
||||||
|
|
||||||
|
yield
|
||||||
|
rescue StandardError => e
|
||||||
|
entry[:status] = :failure
|
||||||
|
entry[:exception] = e.class.to_s
|
||||||
|
entry[:error] = e.message
|
||||||
|
entry[:backtrace] = e.backtrace
|
||||||
|
|
||||||
|
raise e
|
||||||
|
ensure
|
||||||
|
Sidekiq.redis do |redis|
|
||||||
|
redis.pipelined do |pipe|
|
||||||
|
list_name = "sidetiq:#{worker.class.name}:history"
|
||||||
|
|
||||||
|
pipe.lpush(list_name, JSON.dump(entry))
|
||||||
|
pipe.ltrim(list_name, 0, Sidetiq.config.worker_history - 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
Sidekiq.configure_server do |config|
|
||||||
|
config.server_middleware do |chain|
|
||||||
|
chain.add Sidetiq::Middleware::History
|
||||||
|
end
|
||||||
|
end
|
60
test/test_history.rb
Normal file
60
test/test_history.rb
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
require_relative 'helper'
|
||||||
|
|
||||||
|
class TestHistory < Sidetiq::TestCase
|
||||||
|
class HistoryWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
include Sidetiq::Schedulable
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_success
|
||||||
|
middlewared do; end
|
||||||
|
|
||||||
|
entry = Sidekiq.redis do |redis|
|
||||||
|
redis.lrange('sidetiq:TestHistory::HistoryWorker:history', 0, -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
actual = JSON.parse(entry[0], symbolize_names: true)
|
||||||
|
|
||||||
|
assert_equal 'success', actual[:status]
|
||||||
|
|
||||||
|
assert_empty actual[:error]
|
||||||
|
assert_empty actual[:backtrace]
|
||||||
|
assert_empty actual[:exception]
|
||||||
|
|
||||||
|
refute_empty actual[:processor]
|
||||||
|
refute_empty actual[:processed]
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_failure
|
||||||
|
begin
|
||||||
|
middlewared do
|
||||||
|
raise StandardError.new("failed")
|
||||||
|
end
|
||||||
|
rescue
|
||||||
|
end
|
||||||
|
|
||||||
|
entry = Sidekiq.redis do |redis|
|
||||||
|
redis.lrange('sidetiq:TestHistory::HistoryWorker:history', 0, -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
actual = JSON.parse(entry[0], symbolize_names: true)
|
||||||
|
|
||||||
|
assert_equal 'failure', actual[:status]
|
||||||
|
|
||||||
|
assert_equal "failed", actual[:error]
|
||||||
|
assert_equal "StandardError", actual[:exception]
|
||||||
|
refute_empty actual[:backtrace]
|
||||||
|
|
||||||
|
refute_empty actual[:processor]
|
||||||
|
refute_empty actual[:processed]
|
||||||
|
end
|
||||||
|
|
||||||
|
def middlewared
|
||||||
|
middleware = Sidetiq::Middleware::History.new
|
||||||
|
|
||||||
|
middleware.call(HistoryWorker.new, {}, 'default') do
|
||||||
|
yield
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue