sidekiq-cronitor 1.0.0.alpha2 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/LICENSE +1 -1
- data/README.md +12 -47
- data/lib/sidekiq/cronitor.rb +32 -94
- data/lib/sidekiq/cronitor/version.rb +1 -1
- metadata +39 -43
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 77c9e01c256be04515fbd21f7e467fb28e632a37f94d639847c6af8ad6e9823b
|
4
|
+
data.tar.gz: 2c78645ae3fb16b98b52777b3b3124aaa76e6860fc606bee2bc2ab8696275663
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70c63ea8977ac11afe3991a1290950ed1deaa95c0147e8434fc3d0cf0fd4ed965d6d31354b150ae74e505497d7a5499023ea93f41a7eeca14fdddefc2a38a2c7
|
7
|
+
data.tar.gz: 6474a1e11df5373147b252fe327373e084f34abb60b6708f99c81df6b1c6d37643642228f1651fca7ddc4d9c0b988abec2f6a045f949f3e0a8e07dd5cc953b30
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -7,21 +7,23 @@ Call a [Cronitor](https://cronitor.io) around your [Sidekiq](https://sidekiq.org
|
|
7
7
|
Add sidekiq-cronitor your application's Gemfile, near sidekiq:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem
|
11
|
-
gem
|
10
|
+
gem 'sidekiq'
|
11
|
+
gem 'sidekiq-cronitor'
|
12
12
|
```
|
13
13
|
|
14
14
|
And then bundle:
|
15
15
|
|
16
|
-
|
16
|
+
```
|
17
|
+
bundle
|
18
|
+
```
|
17
19
|
|
18
20
|
## Usage
|
19
21
|
|
20
|
-
Make sure you've got a Cronitor [API Key](https://cronitor.io/docs/api-overview) from [your settings](https://cronitor.io/settings) in your ENV as
|
22
|
+
Make sure you've got a Cronitor [API Key](https://cronitor.io/docs/api-overview) from [your settings](https://cronitor.io/settings) in your ENV as `CRONITOR_API_KEY` before starting Sidekiq:
|
21
23
|
|
22
24
|
```sh
|
23
|
-
export
|
24
|
-
sidekiq
|
25
|
+
export CRONITOR_API_KEY='abcdef1234567890abcdef1234567890'
|
26
|
+
bundle exec sidekiq
|
25
27
|
```
|
26
28
|
|
27
29
|
Any sidekiq worker you'd like to monitor just includes `Sidekiq::Cronitor` right after `Sidekiq::Worker`:
|
@@ -37,53 +39,16 @@ class MyWorker
|
|
37
39
|
end
|
38
40
|
```
|
39
41
|
|
40
|
-
By default this will look for an existing monitor named after your worker, `MyWorker` in the case above, and pings that. Otherwise it will try to create a new monitor with the name.
|
41
|
-
|
42
|
-
To use a monitor you've already created you can also configure a code directly:
|
43
|
-
|
44
|
-
```ruby
|
45
|
-
class MyWorker
|
46
|
-
include Sidekiq::Worker
|
47
|
-
include Sidekiq::Cronitor
|
48
|
-
|
49
|
-
sidekiq_options cronitor: {code: "abc123"}
|
50
|
-
|
51
|
-
def perform
|
52
|
-
# ...
|
53
|
-
end
|
54
|
-
end
|
55
|
-
```
|
56
|
-
|
57
|
-
To use a different name or customise how a missing monitor will be created you can use a sidekiq option named `cronitor`:
|
58
|
-
|
59
|
-
```ruby
|
60
|
-
class MyWorker
|
61
|
-
include Sidekiq::Worker
|
62
|
-
include Sidekiq::Cronitor
|
63
|
-
|
64
|
-
sidekiq_options cronitor: {
|
65
|
-
name: "Some Monitor",
|
66
|
-
rules: [{rule_type: "ran_longer_than", value: 60, time_unit: "seconds"}]
|
67
|
-
}
|
68
|
-
|
69
|
-
def perform
|
70
|
-
# ...
|
71
|
-
end
|
72
|
-
end
|
73
|
-
```
|
74
|
-
|
75
|
-
For more information on what rules you can use take a look at the [Cronitor Monitors API docs](https://cronitor.io/docs/monitor-api).
|
76
|
-
|
77
|
-
If you're using [sidekiq-cron](https://github.com/ondrejbartas/sidekiq-cron) the missing monitor will have a default `not_on_schedule` rule based on the cron schedule matched by you worker class.
|
42
|
+
By default this will look for an existing monitor named after your worker, `MyWorker` in the case above, and pings that. Otherwise it will try to create a new monitor with the worker's name, which you can configure rules for at a later time via your Cronitor dashboard.
|
78
43
|
|
79
|
-
|
44
|
+
To use a monitor you've already created, you can configure the monitor's `key` directly:
|
80
45
|
|
81
46
|
```ruby
|
82
47
|
class MyWorker
|
83
48
|
include Sidekiq::Worker
|
84
49
|
include Sidekiq::Cronitor
|
85
50
|
|
86
|
-
sidekiq_options cronitor:
|
51
|
+
sidekiq_options cronitor: { key: 'abc123' }
|
87
52
|
|
88
53
|
def perform
|
89
54
|
# ...
|
@@ -99,7 +64,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
99
64
|
|
100
65
|
## Contributing
|
101
66
|
|
102
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
67
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/cronitorio/cronitor-sidekiq/pulls. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
103
68
|
|
104
69
|
## License
|
105
70
|
|
data/lib/sidekiq/cronitor.rb
CHANGED
@@ -1,25 +1,20 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'sidekiq'
|
2
|
+
require 'cronitor'
|
3
3
|
|
4
|
-
require
|
4
|
+
require 'sidekiq/cronitor/version'
|
5
5
|
|
6
6
|
module Sidekiq::Cronitor
|
7
7
|
def self.included(base)
|
8
|
-
unless base.ancestors.include?
|
9
|
-
raise ArgumentError,
|
8
|
+
unless base.ancestors.include?(Sidekiq::Worker)
|
9
|
+
raise ArgumentError, 'Sidekiq::Cronitor can only be included in a Sidekiq::Worker'
|
10
10
|
end
|
11
11
|
|
12
12
|
base.extend(ClassMethods)
|
13
13
|
|
14
14
|
# Automatically add sidekiq middleware when we're first included
|
15
|
-
#
|
16
|
-
# This might only occur when the worker class is first loaded in a
|
17
|
-
# development rails environment, but that happens before the middleware
|
18
|
-
# chain is invoked so we're all good.
|
19
|
-
#
|
20
15
|
Sidekiq.configure_server do |config|
|
21
|
-
unless config.server_middleware.exists?
|
22
|
-
config.server_middleware.add
|
16
|
+
unless config.server_middleware.exists?(Sidekiq::Cronitor::Middleware)
|
17
|
+
config.server_middleware.add(Sidekiq::Cronitor::Middleware)
|
23
18
|
end
|
24
19
|
end
|
25
20
|
end
|
@@ -30,110 +25,53 @@ module Sidekiq::Cronitor
|
|
30
25
|
|
31
26
|
module ClassMethods
|
32
27
|
def cronitor
|
33
|
-
return @cronitor if defined?
|
28
|
+
return @cronitor if defined?(@cronitor)
|
34
29
|
|
35
|
-
|
36
|
-
|
30
|
+
opts = sidekiq_options.fetch('cronitor', {})
|
31
|
+
key = opts.symbolize_keys.fetch(:key, name)
|
37
32
|
|
38
|
-
|
39
|
-
return @cronitor = opts
|
40
|
-
end
|
41
|
-
|
42
|
-
# Cronitor (and our code below) expects deeply symbolized keys
|
43
|
-
opts = Utils.deep_symbolize_keys(opts)
|
44
|
-
|
45
|
-
# Extract token and code into top level kwargs
|
46
|
-
kwargs = opts.slice(:token, :code).merge(opts: opts)
|
47
|
-
|
48
|
-
# Default monitor name to sidekiq worker (class) name
|
49
|
-
kwargs[:opts][:name] ||= name
|
50
|
-
|
51
|
-
# Some hints about where this monitor came from
|
52
|
-
kwargs[:opts][:tags] ||= []
|
53
|
-
kwargs[:opts][:tags] << "sidekiq-cronitor"
|
54
|
-
if environment = ENV["RAILS_ENV"] || ENV["RACK_ENV"] || Sidekiq.options[:environment]
|
55
|
-
kwargs[:opts][:tags] << environment
|
56
|
-
end
|
57
|
-
kwargs[:opts][:note] ||= "Created by sidekiq-cronitor"
|
58
|
-
|
59
|
-
# If we can find a schedule for this worker then we can automatically add
|
60
|
-
# a not_on_schedule rule and tag it as a cron-job
|
61
|
-
if schedule = cronitor_schedule
|
62
|
-
kwargs[:opts][:rules] ||= [{rule_type: "not_on_schedule", value: schedule}]
|
63
|
-
kwargs[:opts][:tags] << "cron-job"
|
64
|
-
end
|
33
|
+
Sidekiq.logger.debug("[cronitor] initializing monitor: worker=#{name} key=#{key}")
|
65
34
|
|
66
35
|
begin
|
67
|
-
@cronitor = Cronitor.new(
|
36
|
+
@cronitor = Cronitor::Monitor.new(key)
|
68
37
|
rescue Cronitor::Error => e
|
69
|
-
Sidekiq.logger.
|
38
|
+
Sidekiq.logger.error("[cronitor] failed to initialize monitor: worker=#{name} error=#{e.message}")
|
70
39
|
|
71
40
|
@cronitor = nil
|
72
41
|
end
|
73
42
|
end
|
74
|
-
|
75
|
-
private def cronitor_schedule
|
76
|
-
name = self.name
|
77
|
-
|
78
|
-
if defined?(Sidekiq::Cron)
|
79
|
-
# If we can find a Sidekiq::Cron job with a matching worker class
|
80
|
-
# then presume its schedule.
|
81
|
-
Sidekiq::Cron::Job.all.each do |job|
|
82
|
-
if job.klass == name
|
83
|
-
return job.cron
|
84
|
-
end
|
85
|
-
end
|
86
|
-
elsif defined?(Sidekiq::Periodic)
|
87
|
-
# If we can find a Sidekiq Enterprise Periodic Loop with a matching
|
88
|
-
# worker class then presume its schedule.
|
89
|
-
Sidekiq::Periodic::LoopSet.new.each do |loop_|
|
90
|
-
if loop_.klass == name
|
91
|
-
return loop_.schedule
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
# ¯\_(ツ)_/¯
|
97
|
-
return nil
|
98
|
-
end
|
99
43
|
end
|
100
44
|
|
101
45
|
class Middleware
|
102
46
|
def call(worker, message, queue)
|
103
|
-
|
104
|
-
ping worker, "run"
|
47
|
+
ping(worker: worker, state: 'run')
|
105
48
|
|
106
|
-
|
107
|
-
|
108
|
-
|
49
|
+
yield
|
50
|
+
rescue => e
|
51
|
+
ping(worker: worker, state: 'fail', message: e.to_s)
|
109
52
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
end
|
53
|
+
raise e
|
54
|
+
else
|
55
|
+
ping(worker: worker, state: 'complete')
|
114
56
|
end
|
115
57
|
|
116
58
|
private
|
117
59
|
|
118
|
-
def ping(worker
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
end
|
123
|
-
rescue Cronitor::Error => e
|
124
|
-
Sidekiq.logger.warn "Couldn't ping Cronitor: #{e.to_s}"
|
125
|
-
end
|
60
|
+
def ping(worker:, state:, message: nil)
|
61
|
+
return unless has_cronitor?(worker)
|
62
|
+
|
63
|
+
Sidekiq.logger.debug("[cronitor] ping: worker=#{worker.class.name} state=#{state} message=#{message}")
|
126
64
|
|
127
|
-
|
128
|
-
|
65
|
+
worker.cronitor.ping(state: state)
|
66
|
+
rescue Cronitor::Error => e
|
67
|
+
Sidekiq.logger.error("[cronitor] error during ping: worker=#{worker.class.name} error=#{e.message}")
|
68
|
+
rescue => e
|
69
|
+
Sidekiq.logger.error("[cronitor] unexpected error: worker=#{worker.class.name} error=#{e.message}")
|
70
|
+
Sidekiq.logger.error(e.backtrace.first)
|
129
71
|
end
|
130
|
-
end
|
131
72
|
|
132
|
-
|
133
|
-
|
134
|
-
hash.each_with_object({}) do |(key, value), new_hash|
|
135
|
-
new_hash[key.to_sym] = value.is_a?(Hash) ? deep_symbolize_keys(value) : value
|
136
|
-
end
|
73
|
+
def has_cronitor?(worker)
|
74
|
+
worker.is_a?(Sidekiq::Cronitor) && worker.respond_to?(:cronitor) && !worker.cronitor.api_key.nil?
|
137
75
|
end
|
138
76
|
end
|
139
77
|
end
|
metadata
CHANGED
@@ -1,34 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-cronitor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Zeke Gabrielse
|
7
8
|
- Samuel Cochran
|
8
|
-
autorequire:
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
-
|
12
|
-
-----BEGIN CERTIFICATE-----
|
13
|
-
MIIDKDCCAhCgAwIBAgIBBTANBgkqhkiG9w0BAQUFADA6MQ0wCwYDVQQDDARzajI2
|
14
|
-
MRQwEgYKCZImiZPyLGQBGRYEc2oyNjETMBEGCgmSJomT8ixkARkWA2NvbTAeFw0x
|
15
|
-
NzA3MzEwNTQ3MDVaFw0xODA3MzEwNTQ3MDVaMDoxDTALBgNVBAMMBHNqMjYxFDAS
|
16
|
-
BgoJkiaJk/IsZAEZFgRzajI2MRMwEQYKCZImiZPyLGQBGRYDY29tMIIBIjANBgkq
|
17
|
-
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr60Eo/ttCk8GMTMFiPr3GoYMIMFvLak
|
18
|
-
xSmTk9YGCB6UiEePB4THSSA5w6IPyeaCF/nWkDp3/BAam0eZMWG1IzYQB23TqIM0
|
19
|
-
1xzcNRvFsn0aQoQ00k+sj+G83j3T5OOV5OZIlu8xAChMkQmiPd1NXc6uFv+Iacz7
|
20
|
-
kj+CMsI9YUFdNoU09QY0b+u+Rb6wDYdpyvN60YC30h0h1MeYbvYZJx/iZK4XY5zu
|
21
|
-
4O/FL2ChjL2CPCpLZW55ShYyrzphWJwLOJe+FJ/ZBl6YXwrzQM9HKnt4titSNvyU
|
22
|
-
KzE3L63A3PZvExzLrN9u09kuWLLJfXB2sGOlw3n9t72rJiuBr3/OQQIDAQABozkw
|
23
|
-
NzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU99dfRjEKFyczTeIz
|
24
|
-
m3ZsDWrNC80wDQYJKoZIhvcNAQEFBQADggEBADGiXpvK754s0zTFx3y31ZRDdvAI
|
25
|
-
lA209JIjUlDyr9ptCRadihyfF2l9/hb+hLemiPEYppzG6vEK1TIyzbAR36yOJ8CX
|
26
|
-
4vPkCXLuwHhs6UIRbwN+IEy41nsIlBxmjLYei8h3t/G2Vm2oOaLdbjDXS+Srl9U8
|
27
|
-
shsE8ft81PxSQfzEL7Mr9cC9XvWbHW+SyTpfGm8rAtaqZkNeke4U8a0di4oz2EfA
|
28
|
-
P4lSfmXxsd1C71ckIp0cyXkPhyTtpyS/5hq9HhuUNzEHkSDe36/Rd1xYKV5JxMC2
|
29
|
-
YAttWFUs06lor2q1wwncPaMtUtbWwW35+1IV6xhs2rFY6DD/I6ZkK3GnHdY=
|
30
|
-
-----END CERTIFICATE-----
|
31
|
-
date: 2017-12-10 00:00:00.000000000 Z
|
11
|
+
cert_chain: []
|
12
|
+
date: 2021-05-11 00:00:00.000000000 Z
|
32
13
|
dependencies:
|
33
14
|
- !ruby/object:Gem::Dependency
|
34
15
|
name: sidekiq
|
@@ -36,56 +17,56 @@ dependencies:
|
|
36
17
|
requirements:
|
37
18
|
- - "~>"
|
38
19
|
- !ruby/object:Gem::Version
|
39
|
-
version: '
|
20
|
+
version: '6.0'
|
40
21
|
type: :runtime
|
41
22
|
prerelease: false
|
42
23
|
version_requirements: !ruby/object:Gem::Requirement
|
43
24
|
requirements:
|
44
25
|
- - "~>"
|
45
26
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
27
|
+
version: '6.0'
|
47
28
|
- !ruby/object:Gem::Dependency
|
48
29
|
name: cronitor
|
49
30
|
requirement: !ruby/object:Gem::Requirement
|
50
31
|
requirements:
|
51
32
|
- - "~>"
|
52
33
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
34
|
+
version: '4.0'
|
54
35
|
type: :runtime
|
55
36
|
prerelease: false
|
56
37
|
version_requirements: !ruby/object:Gem::Requirement
|
57
38
|
requirements:
|
58
39
|
- - "~>"
|
59
40
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
41
|
+
version: '4.0'
|
61
42
|
- !ruby/object:Gem::Dependency
|
62
43
|
name: bundler
|
63
44
|
requirement: !ruby/object:Gem::Requirement
|
64
45
|
requirements:
|
65
46
|
- - "~>"
|
66
47
|
- !ruby/object:Gem::Version
|
67
|
-
version: '1
|
48
|
+
version: '2.1'
|
68
49
|
type: :development
|
69
50
|
prerelease: false
|
70
51
|
version_requirements: !ruby/object:Gem::Requirement
|
71
52
|
requirements:
|
72
53
|
- - "~>"
|
73
54
|
- !ruby/object:Gem::Version
|
74
|
-
version: '1
|
55
|
+
version: '2.1'
|
75
56
|
- !ruby/object:Gem::Dependency
|
76
57
|
name: rake
|
77
58
|
requirement: !ruby/object:Gem::Requirement
|
78
59
|
requirements:
|
79
60
|
- - "~>"
|
80
61
|
- !ruby/object:Gem::Version
|
81
|
-
version: '
|
62
|
+
version: '13.0'
|
82
63
|
type: :development
|
83
64
|
prerelease: false
|
84
65
|
version_requirements: !ruby/object:Gem::Requirement
|
85
66
|
requirements:
|
86
67
|
- - "~>"
|
87
68
|
- !ruby/object:Gem::Version
|
88
|
-
version: '
|
69
|
+
version: '13.0'
|
89
70
|
- !ruby/object:Gem::Dependency
|
90
71
|
name: rspec
|
91
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,9 +81,25 @@ dependencies:
|
|
100
81
|
- - "~>"
|
101
82
|
- !ruby/object:Gem::Version
|
102
83
|
version: '3.0'
|
103
|
-
|
104
|
-
|
105
|
-
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: bump
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0.1'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0.1'
|
98
|
+
description: Integrates Sidekiq with Cronitor so that workers send lifecycle events
|
99
|
+
- run/complete/fail - around their perform methods
|
100
|
+
email:
|
101
|
+
- zeke@keygen.sh
|
102
|
+
- sj26@sj26.com
|
106
103
|
executables: []
|
107
104
|
extensions: []
|
108
105
|
extra_rdoc_files: []
|
@@ -111,11 +108,11 @@ files:
|
|
111
108
|
- README.md
|
112
109
|
- lib/sidekiq/cronitor.rb
|
113
110
|
- lib/sidekiq/cronitor/version.rb
|
114
|
-
homepage: https://github.com/
|
111
|
+
homepage: https://github.com/cronitor/sidekiq-cronitor
|
115
112
|
licenses:
|
116
113
|
- MIT
|
117
114
|
metadata: {}
|
118
|
-
post_install_message:
|
115
|
+
post_install_message:
|
119
116
|
rdoc_options: []
|
120
117
|
require_paths:
|
121
118
|
- lib
|
@@ -126,13 +123,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
126
123
|
version: '0'
|
127
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
125
|
requirements:
|
129
|
-
- - "
|
126
|
+
- - ">="
|
130
127
|
- !ruby/object:Gem::Version
|
131
|
-
version:
|
128
|
+
version: '0'
|
132
129
|
requirements: []
|
133
|
-
|
134
|
-
|
135
|
-
signing_key:
|
130
|
+
rubygems_version: 3.1.4
|
131
|
+
signing_key:
|
136
132
|
specification_version: 4
|
137
|
-
summary: Monitor your
|
133
|
+
summary: Monitor your Sidekiq jobs with Cronitor
|
138
134
|
test_files: []
|
checksums.yaml.gz.sig
DELETED
Binary file
|
data.tar.gz.sig
DELETED
metadata.gz.sig
DELETED
Binary file
|