sidekiq_hero 0.1.0 → 0.9.0
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +55 -11
- data/lib/sidekiq_hero/configuration.rb +3 -4
- data/lib/sidekiq_hero/notifier.rb +0 -4
- data/lib/sidekiq_hero/notifier_wrapper.rb +46 -0
- data/lib/sidekiq_hero/recorder.rb +23 -5
- data/lib/sidekiq_hero/server_middleware.rb +13 -36
- data/lib/sidekiq_hero/version.rb +1 -1
- data/lib/sidekiq_hero.rb +1 -0
- data/sidekiq_hero.gemspec +16 -15
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ebe90bc9afd52c4c1166c895d91fa4cb87830657357322f20566350ecc09f8ba
|
4
|
+
data.tar.gz: f8d9eb82693baafc34b58e25d56af15275c5bb6132d2bb569496d68179a696bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ad991fa93628226ab8885f751de5f382f9bf9c5144be776ef7838fa42026afddf2ac8b356afab795fbb31b7a275e72e937ad8bec2cf757a0cfaa7ee51371d2d0
|
7
|
+
data.tar.gz: 470714da5afe71faaa99111c253bc8016a2710e66e850e60ea5e922b9a91191cdc931b873cfd1db78f9256ac2c641527ddc5e6287881776b4d9331dd6ff66980
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# SidekiqHero
|
2
2
|
|
3
|
-
|
3
|
+
Sidekiq middleware that fire a notification when a flagged worker has ended its job, successful or not.
|
4
|
+
A worker can be flagged to always fire a notification or to fire it only when the process exceed a configured time.
|
4
5
|
|
5
|
-
|
6
|
+
The default notifier just log on sidekiq server. You can configure your notification class which will receive all the metadata the job has recorder i.e. exceeded_max_time, failed.
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -14,25 +15,68 @@ gem 'sidekiq_hero'
|
|
14
15
|
|
15
16
|
And then execute:
|
16
17
|
|
17
|
-
$ bundle
|
18
|
+
$ bundle install
|
18
19
|
|
19
|
-
Or install it yourself as:
|
20
|
-
|
21
|
-
$ gem install sidekiq_hero
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
In your rails application include the middleware. [What is a middleware?](https://github.com/mperham/sidekiq/wiki/Middleware)
|
26
24
|
|
27
|
-
|
25
|
+
```ruby
|
26
|
+
# config/initializers/sidekiq.rb
|
27
|
+
|
28
|
+
Sidekiq.configure_server do |config|
|
29
|
+
config.server_middleware do |chain|
|
30
|
+
chain.add SidekiqHero::ServerMiddleware
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
SidekiqHero.configure do |config|
|
35
|
+
config.notifier_class = YourNotifier
|
36
|
+
config.queues = ['queue1', 'queue2']
|
37
|
+
end
|
38
|
+
```
|
39
|
+
You can pass your sidekiq_hero configuration via `sidekiq_options`. SidekiqHero will look for `sidekiq_hero_monitor_time` and `sidekiq_hero_monitor`.
|
40
|
+
|
41
|
+
`@sidekiq_hero_monitor` boolean value to flag a single worker to be monitored. This worker will always trigger a notification when the job is done, successful or not.
|
42
|
+
|
43
|
+
`@sidekiq_hero_monitor_time` is the time in seconds within the job is considered ok. If the job takes more than this time the notifier is triggered. The meta_data will contains `total_time` and `worker_time_out` which can be true or false.
|
44
|
+
|
45
|
+
In SidekiqHero.configure:
|
46
|
+
`@notifier_class` is where you can add your custom class responsible to notify the job message.
|
47
|
+
The default class of sidekiq_hero just log to STDOUT so you need to implement a class that respond to `.notify`
|
48
|
+
and takes two arguments: job, meta_data
|
49
|
+
|
50
|
+
`@queues` you can flag a whole queue to be monitored.
|
28
51
|
|
29
|
-
|
52
|
+
`sidekiq_hero_monitor` always takes precendece over other configuration.
|
53
|
+
|
54
|
+
Sidekiq will look first to `sidekiq_hero_monitor`, then to the `queues` and finally `sidekiq_hero_monitor_time`. Note that the execution time is always recorded and passed via meta_data to the configured notifier.
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
class DummyNotifier
|
58
|
+
def self.notify(job, meta_data)
|
59
|
+
new.notify(job, meta_data)
|
60
|
+
end
|
61
|
+
|
62
|
+
# job { 'class': 'SomeWorker', 'jid': 'b4a577edbccf1d805744efa9', 'args': [1, 'arg', true], 'created_at': 123_456_789_0, 'enqueued_at': 123_456_789_0 }
|
63
|
+
# meta_data { status: 'success', total_time: 1, worker_time_out: false}
|
64
|
+
def notify(job, meta_data)
|
65
|
+
send_email if meta_data[:status] == 'success'
|
66
|
+
request_help if meta_data[:status] == 'failed'
|
67
|
+
notify_slack(total_time) if meta_data[:worker_time_out]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
```
|
71
|
+
|
72
|
+
|
73
|
+
## Development
|
30
74
|
|
31
|
-
|
75
|
+
After checking out the repo run `rake spec` to run the tests.
|
32
76
|
|
33
77
|
## Contributing
|
34
78
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
79
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/SamuelMartini/sidekiq_hero
|
36
80
|
|
37
81
|
## License
|
38
82
|
|
@@ -2,12 +2,11 @@
|
|
2
2
|
|
3
3
|
module SidekiqHero
|
4
4
|
class Configuration
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :notifier_class, :exceed_max_time, :queues
|
6
6
|
|
7
7
|
def initialize
|
8
|
-
@
|
9
|
-
@
|
8
|
+
@notifier_class = SidekiqHero::Notifier
|
9
|
+
@queues = []
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SidekiqHero
|
4
|
+
class NotifierWrapper
|
5
|
+
attr_reader :job, :meta_data, :notifier, :queues
|
6
|
+
|
7
|
+
def initialize(job: nil, meta_data: nil)
|
8
|
+
@job = job
|
9
|
+
@meta_data = meta_data
|
10
|
+
@notifier = SidekiqHero.configuration.notifier_class.new
|
11
|
+
@queues = SidekiqHero.configuration.queues
|
12
|
+
end
|
13
|
+
|
14
|
+
def call
|
15
|
+
return unless monitor_this_worker?
|
16
|
+
|
17
|
+
meta_data[:worker_time_out] = exceeded_max_time?
|
18
|
+
|
19
|
+
notifier.notify(job, meta_data)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def monitor_this_worker?
|
25
|
+
sidekiq_hero_monitor || monitor_queue? || exceeded_max_time?
|
26
|
+
end
|
27
|
+
|
28
|
+
def exceeded_max_time?
|
29
|
+
return false if sidekiq_hero_monitor_time.nil?
|
30
|
+
|
31
|
+
meta_data[:total_time] > sidekiq_hero_monitor_time
|
32
|
+
end
|
33
|
+
|
34
|
+
def sidekiq_hero_monitor_time
|
35
|
+
job['sidekiq_hero_monitor_time']
|
36
|
+
end
|
37
|
+
|
38
|
+
def sidekiq_hero_monitor
|
39
|
+
job['sidekiq_hero_monitor']
|
40
|
+
end
|
41
|
+
|
42
|
+
def monitor_queue?
|
43
|
+
queues.include?(job['queue'])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -8,14 +8,32 @@ module SidekiqHero
|
|
8
8
|
@meta_data = {}
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
meta_data.merge!(hash)
|
13
|
-
end
|
14
|
-
|
15
|
-
def record_elapsed_time
|
11
|
+
def elapsed_time
|
16
12
|
total = meta_data.fetch(:ended_at, 0) - meta_data.fetch(:started_at, 0)
|
17
13
|
record(total_time: total)
|
18
14
|
end
|
15
|
+
|
16
|
+
def worker_passed
|
17
|
+
record(status: 'passed', started_at: Time.now.utc.round)
|
18
|
+
end
|
19
|
+
|
20
|
+
def worker_succeeded
|
21
|
+
record(status: 'success')
|
22
|
+
end
|
23
|
+
|
24
|
+
def worker_failed(error)
|
25
|
+
record(status: 'failed', error: error.to_s)
|
26
|
+
end
|
27
|
+
|
28
|
+
def worker_ended
|
29
|
+
record(ended_at: Time.now.utc.round)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def record(hash)
|
35
|
+
meta_data.merge!(hash)
|
36
|
+
end
|
19
37
|
end
|
20
38
|
end
|
21
39
|
|
@@ -2,47 +2,24 @@
|
|
2
2
|
|
3
3
|
module SidekiqHero
|
4
4
|
class ServerMiddleware
|
5
|
+
attr_reader :recorder
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@recorder = SidekiqHero::Recorder.new
|
9
|
+
end
|
10
|
+
|
5
11
|
def call(_worker, job, _queue)
|
6
|
-
recorder.
|
12
|
+
recorder.worker_passed
|
7
13
|
yield
|
8
|
-
recorder.
|
14
|
+
recorder.worker_succeeded
|
9
15
|
rescue => e
|
10
|
-
recorder.
|
16
|
+
recorder.worker_failed(e)
|
17
|
+
|
11
18
|
raise e
|
12
19
|
ensure
|
13
|
-
recorder.
|
14
|
-
recorder.
|
15
|
-
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def recorder
|
21
|
-
@recorder ||= SidekiqHero::Recorder.new
|
22
|
-
end
|
23
|
-
|
24
|
-
def server_message_class
|
25
|
-
@server_message_class ||= SidekiqHero.configuration.server_message_class
|
26
|
-
end
|
27
|
-
|
28
|
-
def meta_data
|
29
|
-
@meta_data ||= {}
|
30
|
-
end
|
31
|
-
|
32
|
-
def notifier
|
33
|
-
SidekiqHero.configuration.notifier_server_message_class
|
34
|
-
end
|
35
|
-
|
36
|
-
def exceed_maximum_time
|
37
|
-
@exceed_maximum_time ||= SidekiqHero.configuration.exceed_maximum_time
|
38
|
-
end
|
39
|
-
|
40
|
-
def exceeded_maximum_time?
|
41
|
-
recorder.meta_data[:total_time] > exceed_maximum_time
|
42
|
-
end
|
43
|
-
|
44
|
-
def job_failed?
|
45
|
-
recorder.meta_data[:status] == 'failed'
|
20
|
+
recorder.worker_ended
|
21
|
+
recorder.elapsed_time
|
22
|
+
NotifierWrapper.new(job: job, meta_data: recorder.meta_data).call
|
46
23
|
end
|
47
24
|
end
|
48
25
|
end
|
data/lib/sidekiq_hero/version.rb
CHANGED
data/lib/sidekiq_hero.rb
CHANGED
data/sidekiq_hero.gemspec
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
3
|
+
require 'sidekiq_hero/version'
|
5
4
|
|
6
5
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
6
|
+
spec.name = 'sidekiq_hero'
|
8
7
|
spec.version = SidekiqHero::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
8
|
+
spec.authors = ['Samuel Martini']
|
9
|
+
spec.email = ['samuelmartini@nebulab.it']
|
11
10
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
|
15
|
-
|
11
|
+
spec.summary = %q{Sidekiq Middleware for job notification}
|
12
|
+
spec.description = <<-TEXT
|
13
|
+
Sidekiq middleware that fire a notification when a flagged worker has ended its job, successful or not.
|
14
|
+
TEXT
|
15
|
+
spec.homepage = 'https://github.com/SamuelMartini/sidekiq_hero'
|
16
|
+
spec.license = 'MIT'
|
16
17
|
|
17
18
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
19
|
f.match(%r{^(test|spec|features|dummy_app)/})
|
19
20
|
end
|
20
|
-
spec.require_paths = [
|
21
|
+
spec.require_paths = ['lib']
|
21
22
|
|
22
23
|
spec.add_dependency 'sidekiq', '>= 3.0'
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
26
|
-
spec.add_development_dependency
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.16'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
26
|
+
spec.add_development_dependency 'rspec', '~> 3.8'
|
27
|
+
spec.add_development_dependency 'timecop'
|
27
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq_hero
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Samuel
|
7
|
+
- Samuel Martini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.8'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
68
|
+
version: '3.8'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: timecop
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,9 +80,10 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
description:
|
83
|
+
description: " Sidekiq middleware that fire a notification when a flagged worker
|
84
|
+
has ended its job, successful or not.\n"
|
84
85
|
email:
|
85
|
-
-
|
86
|
+
- samuelmartini@nebulab.it
|
86
87
|
executables: []
|
87
88
|
extensions: []
|
88
89
|
extra_rdoc_files: []
|
@@ -98,11 +99,12 @@ files:
|
|
98
99
|
- lib/sidekiq_hero.rb
|
99
100
|
- lib/sidekiq_hero/configuration.rb
|
100
101
|
- lib/sidekiq_hero/notifier.rb
|
102
|
+
- lib/sidekiq_hero/notifier_wrapper.rb
|
101
103
|
- lib/sidekiq_hero/recorder.rb
|
102
104
|
- lib/sidekiq_hero/server_middleware.rb
|
103
105
|
- lib/sidekiq_hero/version.rb
|
104
106
|
- sidekiq_hero.gemspec
|
105
|
-
homepage:
|
107
|
+
homepage: https://github.com/SamuelMartini/sidekiq_hero
|
106
108
|
licenses:
|
107
109
|
- MIT
|
108
110
|
metadata: {}
|
@@ -125,5 +127,5 @@ rubyforge_project:
|
|
125
127
|
rubygems_version: 2.7.3
|
126
128
|
signing_key:
|
127
129
|
specification_version: 4
|
128
|
-
summary:
|
130
|
+
summary: Sidekiq Middleware for job notification
|
129
131
|
test_files: []
|