sidekiq_hero 0.1.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|