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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95f22a1885f5b4c34c76d75b59e111570f69fe3ab59da2baa1609025bd1b91c3
4
- data.tar.gz: 6fd444444c2a4b5d17d5cf5df2aedbe8f83402a3da8881f5ed761224050eb1a8
3
+ metadata.gz: ebe90bc9afd52c4c1166c895d91fa4cb87830657357322f20566350ecc09f8ba
4
+ data.tar.gz: f8d9eb82693baafc34b58e25d56af15275c5bb6132d2bb569496d68179a696bd
5
5
  SHA512:
6
- metadata.gz: 30d4e80644ccc5e1cdbff03eecee63c8f8114b918b4bef0cc8b039bb1e859d7868986551772dec345ab0697c5938a5ac3c84b34612de0217810fea2b6706d76e
7
- data.tar.gz: 47a6cc6564643e10b494480ab693503fe945c6d06b665c5205da0167d42a961c7752bc1966f43e7fdec105c0ec0ebfc136d3b7dae49c774938a2ce77e2df5868
6
+ metadata.gz: ad991fa93628226ab8885f751de5f382f9bf9c5144be776ef7838fa42026afddf2ac8b356afab795fbb31b7a275e72e937ad8bec2cf757a0cfaa7ee51371d2d0
7
+ data.tar.gz: 470714da5afe71faaa99111c253bc8016a2710e66e850e60ea5e922b9a91191cdc931b873cfd1db78f9256ac2c641527ddc5e6287881776b4d9331dd6ff66980
data/Gemfile.lock CHANGED
@@ -40,7 +40,7 @@ PLATFORMS
40
40
  DEPENDENCIES
41
41
  bundler (~> 1.16)
42
42
  rake (~> 10.0)
43
- rspec (~> 3.0)
43
+ rspec (~> 3.8)
44
44
  sidekiq_hero!
45
45
  timecop
46
46
 
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # SidekiqHero
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/sidekiq_hero`. To experiment with that code, run `bin/console` for an interactive prompt.
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
- TODO: Delete this and the text above, and describe your gem
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
- TODO: Write usage instructions here
23
+ In your rails application include the middleware. [What is a middleware?](https://github.com/mperham/sidekiq/wiki/Middleware)
26
24
 
27
- ## Development
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
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
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
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
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/[USERNAME]/sidekiq_hero.
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 :notifier_server_message_class, :exceed_maximum_time
5
+ attr_accessor :notifier_class, :exceed_max_time, :queues
6
6
 
7
7
  def initialize
8
- @notifier_server_message_class = SidekiqHero::Notifier.new
9
- @exceed_maximum_time = 0
8
+ @notifier_class = SidekiqHero::Notifier
9
+ @queues = []
10
10
  end
11
11
  end
12
12
  end
13
-
@@ -3,10 +3,6 @@
3
3
  module SidekiqHero
4
4
  class Notifier
5
5
 
6
- def self.notify(job, meta_data)
7
- new.notify(job, meta_data)
8
- end
9
-
10
6
  def notify(job, meta_data)
11
7
  Sidekiq.logger.info "#{job} -- #{meta_data}"
12
8
  end
@@ -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 record(hash)
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.record(status: 'passed', started_at: Time.now.utc.round)
12
+ recorder.worker_passed
7
13
  yield
8
- recorder.record(status: 'success')
14
+ recorder.worker_succeeded
9
15
  rescue => e
10
- recorder.record(status: 'failed', error: e.to_s)
16
+ recorder.worker_failed(e)
17
+
11
18
  raise e
12
19
  ensure
13
- recorder.record(ended_at: Time.now.utc.round)
14
- recorder.record_elapsed_time
15
- notifier.notify(job, recorder.meta_data) if exceeded_maximum_time? || job_failed?
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
@@ -1,3 +1,3 @@
1
1
  module SidekiqHero
2
- VERSION = "0.1.0"
2
+ VERSION = '0.9.0'
3
3
  end
data/lib/sidekiq_hero.rb CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'sidekiq_hero/version'
4
4
  require 'sidekiq/api'
5
5
  require 'sidekiq_hero/configuration'
6
+ require 'sidekiq_hero/notifier_wrapper'
6
7
  require 'sidekiq_hero/notifier'
7
8
  require 'sidekiq_hero/recorder'
8
9
  require 'sidekiq_hero/server_middleware'
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 "sidekiq_hero/version"
3
+ require 'sidekiq_hero/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "sidekiq_hero"
6
+ spec.name = 'sidekiq_hero'
8
7
  spec.version = SidekiqHero::VERSION
9
- spec.authors = ["Samuel"]
10
- spec.email = ["samueljmartini@gmail.com"]
8
+ spec.authors = ['Samuel Martini']
9
+ spec.email = ['samuelmartini@nebulab.it']
11
10
 
12
- spec.summary = ''
13
- spec.description = ''
14
- spec.homepage = ''
15
- spec.license = "MIT"
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 = ["lib"]
21
+ spec.require_paths = ['lib']
21
22
 
22
23
  spec.add_dependency 'sidekiq', '>= 3.0'
23
- spec.add_development_dependency "bundler", "~> 1.16"
24
- spec.add_development_dependency "rake", "~> 10.0"
25
- spec.add_development_dependency "rspec", "~> 3.0"
26
- spec.add_development_dependency "timecop"
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.1.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-03-22 00:00:00.000000000 Z
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.0'
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.0'
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
- - samueljmartini@gmail.com
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: []