sidekiq-status 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/sidekiq-status.rb +8 -1
- data/lib/sidekiq-status/client_middleware.rb +3 -3
- data/lib/sidekiq-status/server_middleware.rb +5 -6
- data/lib/sidekiq-status/storage.rb +10 -1
- data/lib/sidekiq-status/version.rb +1 -1
- data/lib/sidekiq-status/worker.rb +1 -22
- data/sidekiq-status.gemspec +1 -1
- data/spec/lib/sidekiq-status/client_middleware_spec.rb +3 -3
- data/spec/lib/sidekiq-status/server_middleware_spec.rb +4 -4
- data/spec/lib/sidekiq-status/worker_spec.rb +2 -2
- data/spec/lib/sidekiq-status_spec.rb +22 -6
- data/spec/spec_helper.rb +3 -1
- metadata +4 -4
data/lib/sidekiq-status.rb
CHANGED
@@ -8,7 +8,7 @@ module Sidekiq
|
|
8
8
|
module Status
|
9
9
|
extend Storage
|
10
10
|
DEFAULT_EXPIRY = 60 * 30
|
11
|
-
UUID_REGEXP = /[
|
11
|
+
UUID_REGEXP = /[0-9A-F]{24}/i #RegEx for SecureRandom.hex(12) which is the format Sidekiq uses for its jid
|
12
12
|
|
13
13
|
# Job status by id
|
14
14
|
# @param [String] id job id returned by async_perform
|
@@ -16,5 +16,12 @@ module Sidekiq
|
|
16
16
|
def self.get(id)
|
17
17
|
read_field_for_id(id, :status)
|
18
18
|
end
|
19
|
+
|
20
|
+
# Get all status fields for a job
|
21
|
+
# @params [String] id job id returned by async_perform
|
22
|
+
# @return [Hash] hash of all fields stored for the job
|
23
|
+
def self.get_all(id)
|
24
|
+
read_hash_for_id(id)
|
25
|
+
end
|
19
26
|
end
|
20
27
|
end
|
@@ -2,13 +2,13 @@ module Sidekiq::Status
|
|
2
2
|
# Should be in the client middleware chain
|
3
3
|
class ClientMiddleware
|
4
4
|
include Storage
|
5
|
-
# Uses
|
5
|
+
# Uses msg['jid'] id and puts :queued status in the job's Redis hash
|
6
6
|
# @param [Class] worker_class if includes Sidekiq::Status::Worker, the job gets processed with the plugin
|
7
|
-
# @param [Array] msg job arguments
|
7
|
+
# @param [Array] msg job arguments
|
8
8
|
# @param [String] queue the queue's name
|
9
9
|
def call(worker_class, msg, queue)
|
10
10
|
if worker_class.include? Worker
|
11
|
-
store_for_id(msg['
|
11
|
+
store_for_id(msg['jid'], :status => :queued)
|
12
12
|
end
|
13
13
|
yield
|
14
14
|
end
|
@@ -9,21 +9,21 @@ module Sidekiq::Status
|
|
9
9
|
@expiration = opts[:expiration]
|
10
10
|
end
|
11
11
|
|
12
|
-
#
|
12
|
+
# Uses sidekiq's internal jid as id
|
13
13
|
# puts :working status into Redis hash
|
14
14
|
# initializes worker instance with id
|
15
15
|
#
|
16
|
-
# Exception handler sets :failed status, re-inserts worker
|
16
|
+
# Exception handler sets :failed status, re-inserts worker and re-throws the exception
|
17
17
|
# Worker::Stopped exception type are processed separately - :stopped status is set, no re-throwing
|
18
18
|
#
|
19
19
|
# @param [Worker] worker worker instance, processed here if its class includes Status::Worker
|
20
|
-
# @param [Array] msg job args,
|
20
|
+
# @param [Array] msg job args, should have jid format
|
21
21
|
# @param [String] queue queue name
|
22
22
|
def call(worker, msg, queue)
|
23
23
|
if worker.is_a? Worker
|
24
|
-
worker.id = msg['
|
24
|
+
worker.id = msg['jid']
|
25
25
|
unless worker.id.is_a?(String) && UUID_REGEXP.match(worker.id)
|
26
|
-
raise ArgumentError, "First job argument for a #{worker.class.name} should have
|
26
|
+
raise ArgumentError, "First job argument for a #{worker.class.name} should have jid format"
|
27
27
|
end
|
28
28
|
worker.store 'status' => 'working'
|
29
29
|
yield
|
@@ -36,7 +36,6 @@ module Sidekiq::Status
|
|
36
36
|
rescue
|
37
37
|
if worker.is_a? Worker
|
38
38
|
worker.store 'status' => 'failed'
|
39
|
-
msg['args'].unshift worker.id
|
40
39
|
end
|
41
40
|
raise
|
42
41
|
ensure
|
@@ -28,4 +28,13 @@ module Sidekiq::Status::Storage
|
|
28
28
|
conn.hmget(uuid, field)[0]
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
|
+
# Gets the whole status hash from the job status
|
33
|
+
# @param [String] id job id
|
34
|
+
# @return [Hash] Hash stored in redis
|
35
|
+
def read_hash_for_id(id)
|
36
|
+
Sidekiq.redis do |conn|
|
37
|
+
conn.hgetall id
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -1,26 +1,5 @@
|
|
1
|
-
require "active_support"
|
2
|
-
|
3
1
|
module Sidekiq::Status::Worker
|
4
2
|
include Sidekiq::Status::Storage
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
# Adding ID generation to .perform_async
|
8
|
-
module ClassMethods
|
9
|
-
# :nodoc:
|
10
|
-
def self.extended(base)
|
11
|
-
class << base
|
12
|
-
alias_method_chain :perform_async, :uuid
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
# Add an id to job arguments
|
17
|
-
def perform_async_with_uuid(*args)
|
18
|
-
id = SecureRandom.uuid
|
19
|
-
args.unshift id
|
20
|
-
perform_async_without_uuid(*args)
|
21
|
-
id
|
22
|
-
end
|
23
|
-
end
|
24
3
|
|
25
4
|
class Stopped < StandardError
|
26
5
|
end
|
@@ -32,7 +11,7 @@ module Sidekiq::Status::Worker
|
|
32
11
|
# @raise [RuntimeError] raised in case of second id initialization attempt
|
33
12
|
# @return [String] id
|
34
13
|
def id=(id)
|
35
|
-
raise RuntimeError("Worker ID is already set :
|
14
|
+
raise RuntimeError("Worker ID is already set : #{@id}") if @id
|
36
15
|
@id=id
|
37
16
|
end
|
38
17
|
|
data/sidekiq-status.gemspec
CHANGED
@@ -3,20 +3,20 @@ require 'spec_helper'
|
|
3
3
|
describe Sidekiq::Status::ClientMiddleware do
|
4
4
|
|
5
5
|
let!(:redis) { Sidekiq.redis { |conn| conn } }
|
6
|
-
let!(:job_id) { SecureRandom.
|
6
|
+
let!(:job_id) { SecureRandom.hex(12) }
|
7
7
|
|
8
8
|
# Clean Redis before each test
|
9
9
|
before { redis.flushall }
|
10
10
|
|
11
11
|
describe "#call" do
|
12
12
|
it "sets queued status" do
|
13
|
-
SecureRandom.should_receive(:
|
13
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
14
14
|
StubJob.perform_async(:arg1 => 'val1').should == job_id
|
15
15
|
redis.hget(job_id, :status).should == 'queued'
|
16
16
|
end
|
17
17
|
|
18
18
|
it "sets status hash ttl" do
|
19
|
-
SecureRandom.should_receive(:
|
19
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
20
20
|
StubJob.perform_async(:arg1 => 'val1').should == job_id
|
21
21
|
(1..Sidekiq::Status::DEFAULT_EXPIRY).should cover redis.ttl(job_id)
|
22
22
|
end
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Sidekiq::Status::ServerMiddleware do
|
4
4
|
|
5
5
|
let!(:redis) { Sidekiq.redis { |conn| conn } }
|
6
|
-
let!(:job_id) { SecureRandom.
|
6
|
+
let!(:job_id) { SecureRandom.hex(12) }
|
7
7
|
|
8
8
|
# Clean Redis before each test
|
9
9
|
# Seems like flushall has no effect on recently published messages,
|
@@ -13,7 +13,7 @@ describe Sidekiq::Status::ServerMiddleware do
|
|
13
13
|
describe "#call" do
|
14
14
|
it "sets working/complete status" do
|
15
15
|
thread = confirmations_thread 4, "status_updates", "job_messages_#{job_id}"
|
16
|
-
SecureRandom.should_receive(:
|
16
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
17
17
|
start_server do
|
18
18
|
ConfirmationJob.perform_async(:arg1 => 'val1').should == job_id
|
19
19
|
thread.value.should == [job_id, job_id,
|
@@ -24,7 +24,7 @@ describe Sidekiq::Status::ServerMiddleware do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "sets failed status" do
|
27
|
-
SecureRandom.should_receive(:
|
27
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
28
28
|
start_server do
|
29
29
|
capture_status_updates(3) {
|
30
30
|
FailingJob.perform_async.should == job_id
|
@@ -34,7 +34,7 @@ describe Sidekiq::Status::ServerMiddleware do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
it "sets status hash ttl" do
|
37
|
-
SecureRandom.should_receive(:
|
37
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
38
38
|
StubJob.perform_async(:arg1 => 'val1').should == job_id
|
39
39
|
(1..Sidekiq::Status::DEFAULT_EXPIRY).should cover redis.ttl(job_id)
|
40
40
|
end
|
@@ -2,11 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Sidekiq::Status::Worker do
|
4
4
|
|
5
|
-
let!(:job_id) { SecureRandom.
|
5
|
+
let!(:job_id) { SecureRandom.hex(12) }
|
6
6
|
|
7
7
|
describe ".perform_async" do
|
8
8
|
it "generates and returns job id" do
|
9
|
-
SecureRandom.should_receive(:
|
9
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
10
10
|
StubJob.perform_async().should == job_id
|
11
11
|
end
|
12
12
|
end
|
@@ -3,8 +3,8 @@ require 'spec_helper'
|
|
3
3
|
describe Sidekiq::Status do
|
4
4
|
|
5
5
|
let!(:redis) { Sidekiq.redis { |conn| conn } }
|
6
|
-
let!(:job_id) { SecureRandom.
|
7
|
-
let!(:job_id_1) { SecureRandom.
|
6
|
+
let!(:job_id) { SecureRandom.hex(12) }
|
7
|
+
let!(:job_id_1) { SecureRandom.hex(12) }
|
8
8
|
|
9
9
|
# Clean Redis before each test
|
10
10
|
# Seems like flushall has no effect on recently published messages,
|
@@ -13,7 +13,7 @@ describe Sidekiq::Status do
|
|
13
13
|
|
14
14
|
describe ".get" do
|
15
15
|
it "gets job status by id" do
|
16
|
-
SecureRandom.should_receive(:
|
16
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
17
17
|
|
18
18
|
start_server do
|
19
19
|
capture_status_updates(2) {
|
@@ -25,9 +25,25 @@ describe Sidekiq::Status do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
describe ".get_all" do
|
29
|
+
it "gets the job hash by id" do
|
30
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
31
|
+
|
32
|
+
start_server do
|
33
|
+
capture_status_updates(2) {
|
34
|
+
LongJob.perform_async(1).should == job_id
|
35
|
+
}.should == [job_id]*2
|
36
|
+
(hash = Sidekiq::Status.get_all(job_id)).should include 'status' => 'working'
|
37
|
+
hash.should include 'update_time'
|
38
|
+
end
|
39
|
+
(hash = Sidekiq::Status.get_all(job_id)).should include 'status' => 'complete'
|
40
|
+
hash.should include 'update_time'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
28
44
|
context "keeps normal Sidekiq functionality" do
|
29
45
|
it "does jobs with and without status processing" do
|
30
|
-
SecureRandom.should_receive(:
|
46
|
+
SecureRandom.should_receive(:hex).exactly(4).times.and_return(job_id, job_id_1)
|
31
47
|
start_server do
|
32
48
|
capture_status_updates(6) {
|
33
49
|
StubJob.perform_async.should == job_id
|
@@ -42,7 +58,7 @@ describe Sidekiq::Status do
|
|
42
58
|
end
|
43
59
|
|
44
60
|
it "retries failed jobs" do
|
45
|
-
SecureRandom.should_receive(:
|
61
|
+
SecureRandom.should_receive(:hex).once.and_return(job_id)
|
46
62
|
start_server do
|
47
63
|
capture_status_updates(5) {
|
48
64
|
RetriedJob.perform_async().should == job_id
|
@@ -52,4 +68,4 @@ describe Sidekiq::Status do
|
|
52
68
|
end
|
53
69
|
end
|
54
70
|
|
55
|
-
end
|
71
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require "rspec"
|
2
2
|
|
3
3
|
require 'sidekiq'
|
4
|
+
require 'sidekiq/processor'
|
5
|
+
require 'sidekiq/manager'
|
4
6
|
require 'sidekiq-status'
|
5
7
|
|
6
8
|
|
@@ -48,7 +50,7 @@ def start_server()
|
|
48
50
|
require 'sidekiq/cli'
|
49
51
|
Sidekiq.options[:queues] << 'default'
|
50
52
|
Sidekiq.configure_server do |config|
|
51
|
-
config.redis =
|
53
|
+
config.redis = Sidekiq::RedisConnection.create
|
52
54
|
config.server_middleware do |chain|
|
53
55
|
chain.add Sidekiq::Status::ServerMiddleware
|
54
56
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-status
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-02-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sidekiq
|
@@ -18,7 +18,7 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '2.
|
21
|
+
version: '2.7'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -26,7 +26,7 @@ dependencies:
|
|
26
26
|
requirements:
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '2.
|
29
|
+
version: '2.7'
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
31
|
name: rspec
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|