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 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: []